Docker

一、快速入门

1、基础知识

VMware是业界最好用的虚拟机软件之一。Centos7是比较常用的一个Linux发行版本。

先在VMware中创建一个虚拟机,再在虚拟机上安装Centos7系统。

FinalShell 是一款功能强大的国产SSH客户端,SSH/Telnet连接:支持远程登录Linux/Windows服务器。即登录软件去操作linux系统。

启动虚拟机并登录之后可以输入 ip addr 来查看ip地址:ens33网卡往下找。

输入了之后没有ip地址,就输入 ./start-ens33.sh(输入 ll可以查看)

2、命令

复制代码
#查看版本
docker - v 

# 启动Docker
systemctl start docker

# 停止Docker
systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

3、快速入门

**镜像和容器:**当我们利用docker安装应用时,Docker会自动搜索并下载应用镜像。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离的环境,称为容器(可以想象成一个小型的linux)。

镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub

docker安装mysql:

复制代码
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  mysql

#实际就一行\是换行
  • docker run 创建并运行一个容器, -d 让容器在后台运行(可以做其他的事情了,如果不加,什么都不能做,命令行会停在那里)
  • 给容器起一个名字,必须唯一
  • -p 3306:3306 设置端口映射 前面是宿主机端口 后面是容器内端口 。 将宿主机(host)的3306端口与容器(container)内部的3306端口建立映射关系,使得外部请求发送到宿主机指定端口时,Docker引擎会自动将这些请求转发到对应容器的目标端口,从而穿透容器默认的网络隔离机制,实现外部对容器内服务的访问。 如果有两个mysql,mysql的端口都是3306是不变的,所以应该改变宿主机的端口。
  • -e .... key = value的形式,设置环境变量
  • mysql 是指运行镜像的名字 完整写法 镜像名:镜像版本

二、Docker基础

1、常见命令

命令 说明 文档地址
docker pull 拉取镜像 (仓库到本地) docker pull
docker push 推送镜像到DockerRegistry docker push
docker images 查看本地镜像 配置了别名为dis docker images
docker rmi 删除本地镜像 docker rmi
docker save 保存镜像到本地压缩文件(虚拟机上) docker save
docker load -i tar包名 加载本地压缩文件到镜像 -i tar包名 docker load
docker run 创建并运行容器(不能重复创建) docker run
docker stop 停止指定容器 docker stop
docker start 启动指定容器 docker start
docker restart 重新启动容器 docker restart
docker rm (-f) 容器名 删除指定容器(要先停止) -f 强制删除,不用停止 docs.docker.com
docker ps (-a) 查看运行中容器 -a 查看所有容器 dps查看简化的 docker ps
docker logs (-f)容器名 查看容器运行日志 -f 持续输出日志 ctrl+c 停止 docker logs
docker exec -it 容器名 bash 进入容器 -it (添加一个可输入终端,可以交互了)容器名 bash(表示命令行交互类型) 输入exit 退出 docker exec
docker inspect 查看容器详细信息 容器名 docker inspect

不会写后面的内容就 --help

docker exec -it mysql mysql -uroot -p 直接进入mysql 的命令,省去了进入控制台了 否则需要 docker exec -it mysql bash进入容器,并且进入命令行交互之后输入mysql -uroot -p123

命令别名:

  • vi ~/.bashrc 找到root目录下的bashrc文件 进入之后点击i/a/o进入插入模式即可插入

  • alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"' alias dis='docker images'添加两个命令别名

  • 退出,按esc退出插入模式,按:进入底行模式,输入wq退出并保存

  • 输入source ~/.bashrc 让其生效

扩展:文本编辑命令

vim fileName文件存在就打开,文件不存在创建一个新的

|---------------|------------------------|
| 底行模式指令 | 含义 |
| :wq | 保存并退出 |
| :q! | 不保存退出 |
| :set nu | 显示行号 |
| :set nonu | 取消行号显示 |
| :n | 定位到第n行,如 :10 就是定位到第10行 |

|---------------|----------------------|
| 命令模式指令 | 含义 |
| gg | 定位到文本内容的第一行 |
| G | 定位到文本内容的最后一行 |
| dd | 删除光标所在行的数据 |
| ndd | 删除当前光标所在行及之后的n行数据 |
| u | 撤销操作 |
| i 或 a 或 o | 进入插入模式(进入后光标所处的位置不同而 |

具体看Javaweb 讲义Docs

2、数据卷 (volume)

数据卷:是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。

通过: docker volume --help 可以查看所有命令信息

命令 说明 文档地址
docker volume create 创建数据卷 docker volume create
docker volume ls 查看所有数据卷 docs.docker.com
docker volume rm 删除指定数据卷 docs.docker.com
docker volume inspect 查看某个数据卷的详情 docs.docker.com
docker volume prune 清除数据卷 docker volume prune

卷创建宿主机目录自动创建,所以创建卷之后就该挂载容器目录。

在执行docker run 命令时,使用 -v 数据卷:容器内目录可以完成数据卷挂载。挂载只能在创建容器时挂载。

当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷。

所以要执行的操作就是删除旧的nginx容器,创建新的容器并挂载即可。

复制代码
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx

在执行docker run命令时, 使用-v 本地目录:容器内目录 可以完成本地目录挂载

注:本地目录必须以"/"或者"./"开头,如果直接以名称开头,会被识别为数据卷而非本地目录

3、自定义镜像

镜像就是包含了应用程序、程序运行的系统函数库,运行配置文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

镜像结构

镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer)。这样,如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作。

例如,第一步中需要的Linux运行环境,通用性就很强,所以Docker官方就制作了这样的只包含Linux运行环境的镜像。我们在制作java镜像时,就无需重复制作,直接使用Docker官方提供的CentOS或Ubuntu镜像作为基础镜像。然后再搭建其它层即可,这样逐层搭建,最终整个Java项目的镜像结构如图所示:

dockerfile

就是一个文本文件,其中包含一个个的指令(Instruction),用指令说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮助我们构建镜像。常见指令有:

指令 说明 示例
FROM 指定基础镜像 FROM centos:6
ENV 设置环境变量,可在后面指令使用 ENV key value
COPY 拷贝本地文件到镜像的指定目录 COPY ./xx.jar /tmp/app.jar
RUN 执行Linux的shell命令,一般是安装过程的命令 RUN yum install gcc
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的 EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xx.jar

当Dockerfile文件写好以后,就可以利用命令来构建镜像了。

复制代码
docker build -t myImage:1.0 .

-t:是给镜像起名,格式依然是repository:tag(名字:版本)格式,不指定tag时,默认为latest

.:是指定Dockerfile所在目录,如果就在当前目录,则指定为"."

4、网络

自己存在一个网络,但是,容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。

加入自定义网络的容器才可以通过容器名相互访问,Docker的网络操作命令如下:

命令 说明 文档地址
docker network create 名字 创建一个网络 (网桥) docker network create
docker network ls 查看所有网络 docs.docker.com
docker network rm 删除指定网络 docs.docker.com
docker network prune 清除未使用的网络 docs.docker.com
docker network connect 使指定容器连接加入某网络 docs.docker.com
docker network disconnect 使指定容器连接离开某网络 docker network disconnect
docker network inspect 查看网络详细信息 docker network inspect
复制代码
# 1.通过命令创建一个网络
docker network create hmall
# 2.连接到网络 这样会有两个网络
docker network connect hmall dd

#3.在创建容器时添加 --network hmall 会将默认的网络替代
docker run -d --name dd -p 8080:8080 --network hmall docker-demo

三、项目部署

DockerCompose

通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联Docker容器的快速部署。

首先应编写docker-compose.yml文件:

javascript 复制代码
version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
    networks:
      - new
networks:
  new:
    name: hmall

对应的docker run 的命令:

javascript 复制代码
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  -v ./mysql/data:/var/lib/mysql \
  -v ./mysql/conf:/etc/mysql/conf.d \
  -v ./mysql/init:/docker-entrypoint-initdb.d \
  --network hmall
  mysql

编写好docker-compose.yml文件,就可以部署项目了。常见的命令:

基本语法如下:

docker compose [OPTIONS] [COMMAND]

其中,OPTIONS和COMMAND都是可选参数,比较常见的有:

类型 参数或指令 说明
Options -f 指定compose文件的路径和名称
Options -p 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念
Commands up 创建并启动所有service容器
Commands down 停止并移除所有容器、网络
Commands ps 列出所有启动的容器
Commands logs 查看指定容器的日志
Commands stop 停止容器
Commands start 启动容器
Commands restart 重启容器
Commands top 查看运行的进程
Commands exec 在指定的运行中容器中执行命令