一、 Docker 简介
二、Docker 基础命令
2.1 docker 服务基础命令
1
2
3
4
5
6
7
8
9
|
docker version # 查看docker版本号信息
docker info # 查看docker相关信息,包括版本信息、镜像和容器数量等
systemctl start docker # 启动docker 服务引擎
systemctl stop docker # 关闭docker 服务引擎
systemctl restart docker # 重启docker 服务引擎
systemctl enable docker # 设置开机自启动 服务引擎
systemctl status docker # 查看docker 服务引擎运行状态
systemctl status docker.service # 查询Docker 服务引擎服务状态
docker --help # docker命令提示
|
2.2 docker镜像命令
镜像的名称组成:
- 镜像名称一般由两部分组成:[repository]:[tag]。
- 在没有指定tag时,默认是latest,代表最新版本的镜像。
以 mysql:5.7
为例,mysql
就是 repository,5.7
就是 tag,合一起就是镜像名称,代表 5.7 版本的 MySQL 镜像。
docker 常见的镜像操作命令如图:
docker 常用的的镜像操作命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
docker images # 查看本地镜像列表
docker build Dockerfile # 创建本地镜像
# 从服务器拉取镜像到本地
docker pull imageName # 从镜像源(服务器)拉取最新版本的镜像
docker pull imageName:tag # 从镜像源(服务器)拉取指定版本的镜像
# 将本地镜像推送到服务
docker push imageName
docker push imageName:tag
# 将本地镜像保存到 tar 包 / 从 tar 包加载 镜像到本地镜像
docker save -o output.tar image1:tag1 [image2:tag2 image3:tag3] # 保存镜像为一个压缩包
docker load -i object_imageName.tar # 加载压缩包为镜像
# 从镜像源(服务器, 默认为 Docker Hub)查找/搜索镜像
docker search [options] TERM
docker search -f STARS=9000 mysql # 搜索 stars 收藏数不小于10以上的mysql镜像
# 删除本地镜像,仅当当前镜像没有被任何容器使用 才可以删除
docker rmi imageName/imageID # 删除镜像
docker rmi -f imageName/imageID # 强制删除
docker rmi -f imageName1 imageName2 imageName3 # 删除多个 其镜像ID或镜像用用空格隔开即可
docker rmi -f $(docker images -aq) # 删除全部镜像,-a 意思为显示全部, -q 意思为只显示ID
docker image rm imageName # 强制删除镜像
# 给镜像打标签【有时候根据业务需求 需要对一个镜像进行分类或版本迭代操作,此时就需要给镜像打上标签】
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
|
2.3 docker容器命令
docker容器 是由 docker镜像 启动运行的 容器实例。
docker 容器操作的命令如图:
容器由三个状态:
- 运行:进程正常运行
- 暂停:进程暂停,CPU不再运行,并不释放内存
- 停止:进程终止,回收进程占用的内存、CPU等资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
docker ps # 显示正在运行的容器
docker ps -a # -a,--all 显示全部容器,包括已停止的(默认只显示运行中的容器)
docker stats # 查看 docker 运行中的容器, 类似 linux 的 top 命令
# 容器是由 docker run images 命令创建并运行实例
# --name 给要运行的容器起的名字;
# -p 将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口;
# -d 表示可后台运行容器 (守护式运行)。
# 如下示例:
docker run --name containerName -p 80:80 -d nginx
#设置容器开机自启动
#法一 创建容器、使用docker run命令时,添加参数--restart=always,表示该容器随docker服务启动而自动启动
docker run --name mysqlLatest -p 3307:3306 --restart=always -d mysql
#若容器已启动,希望设置开机自启动
docker update containerName/containerID --restart=always
docker pause containerName/containerID # 让一个运行的容器暂停
docker unpause name # 让一个容器从暂停状态恢复运行
docker stop name # 停止一个或多个运行的容器(杀死进程、回收内存,仅剩文件系统)
docker start name # 让一个停止的容器再次运行
docker start mysql redis rabbitmq nginx # 启动多个容器
docker restart name # 重启一个或多个容器
# docker stop与docker kill的区别:都可以终止运行中的docker容器。类似于linux中的kill和kill -9这两个命令,docker stop与kill相似,docker kill与kill -9类似
docker kill containerName # 杀掉一个或多个运行中的容器
docker rename containerName new_containerName # 更换容器名
# 删除容器
docker rm containerName/containerID # 删除容器
docker rm -f CONTAINER # 强制删除
docker rm -f containerName containerName2 containerName3 # 删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f $(docker ps -aq) # 删除全部容器
docker inspect containerName # 获取容器更多信息
docker ps -l # 最后一次运行的容器
docker port containerName/containerID # 查看端口的映射情况
docker logs containerName # 查看容器运行日志
docker logs -f containerName # 持续跟踪日志
docker logs -f --tail=20 containerName # 查看末尾多少行
docker diff containerName # 查看容器的改动
# docker 网络
docker network ls # 查看所有docker网络
docker network rm <network_name> # 删除 docker网络
# 进入容器执行命令有两种方式 docker exec 和 docker attach,推荐docker exec
# 方式一: docker exec
docker exec -it containerName/containerID bash
# 方式二: docker attach,推荐使用docker exec
docker attach containerName/containerID
# 从容器退到自己服务器中(不能用ctrl+C)
exit # 直接退出。未添加-d(持久化运行容器)时,执行此参数 容器会被关闭
ctrl+p+q # 优雅退出。无论是否添加 -d 参数,执行此命令容器都不会被关闭
|
docker run 常用启动参数说明:
- -it 输出容器命令行的内容 即容器的自身的程序输出在控制台 有点类似前台运行
- -d 和it相反 隐藏后台运行
- -p 端口映射 [外部(宿主机)端口]:[容器里面运行的端口], 示例:9000:9000 将宿主机9000端口映射到镜像里面的9000端口
- –restart 重启方式:–restart=always 表示该容器跟随docker服务引擎自动启动
- –name 启动后的容器名称
- -v 挂载容器数据卷
- –network 连接到某个网络(例如:–network test_net)
- –network-alias 容器的网络名称(例如:–network-alias portainer)
三、docker 数据卷(volume)
3.1 docker 数据卷(volume)简介
数据卷(volume) 是一个虚拟目录,它指向宿主机文件系统中的某个目录:
- 可供容器使用的特殊目录,可以在容器之间共享和重用;
- 对数据卷的修改会立即生效,对数据卷的更新不会影响镜像;
- 卷会一直存在,直到没有容器使用;
一旦完成数据卷挂载,在容器里对挂载的目录/文件的一切操作(增、删、改)都会作用在数据卷对应的宿主机目录/文件里。同样的,在宿主机上对目录/文件的一切操作(增、删、改),容器中也实时体现出来。二者实际是共享 目录/文件。
这样,操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录了。
两个文件挂载同一个数据卷,数据共享;升级 容器删了,但数据卷没删、硬盘目录还在。
数据卷的作用:将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
3.2 数据卷操作命令
- 数据卷操作的基本语法
1
|
docker volume [COMMAND]
|
根据命令后跟随的command来确定下一步的操作:
- create volumeName 创建一个volume,一般关联宿主机/var/lib/docker/volumes/目录下
- inspect volumeName 显示一个或多个volume的信息
- ls 列出所有的volume
- prune 删除未使用的volume
- rm volumeName 删除一个或多个指定的volume
注意:
- docker inspect volumeName 查询到的 Mountpoint 表示该数据卷在宿主机哪个目录(一般无需设置),数据卷 <——> 宿主机目录
- docker run 中的 -v 表示将该容器内某个目录挂载到数据卷,数据卷 <——> 容器内目录
- 将容器挂载到本地目录
容器不仅可以挂载数据卷,也可以直接挂载到宿主机目录下,关联关系如下:
- 带数据卷模式:宿主机目录 <——> 数据卷 <——> 容器内目录
- 直接挂载到宿主机模式:宿主机目录 <——> 容器内目录
目录/文件挂载 与 数据卷挂载的语法是类似的(之前数据卷挂载是 -v volumeName:/targetContainerPath,而且可挂载文件 宿主机文件内容可直接覆盖容器内文件),语法如下:
1
2
|
-v [宿主机目录]:[容器内目录]
-v [宿主机文件]:[容器内文件]
|
数据卷挂载与目录直接挂载的优缺点:
- 数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找(自动化 隐藏细节)
- 目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看(细节自己管理实现 没有自动化)
示例: 创建并运行一个MySQL容器,将宿主机目录直接挂载到容器。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 通过docker pull mysql:5.7.25 拉取需要的 mysql 镜像
# 创建data目录 /data/mysql/data
# 创建目录/data/mysql/conf,并在该目录下新建文件h my.cnf,写入如下内容:
cat /data/mysql/conf/my.cnf
[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000
# 创建并运行MySQL容器
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123 -p 3307:3306 -v /data/mysql/conf/my.cnf:/etc/mysql/conf.d/hmy.cnf -v /data/mysql/data:/var/lib/mysql -d mysql:5.7.25
# 挂载 /data/mysql/data 到 mysql 容器内数据存储目录 /var/lib/mysql
# 挂载 /data/mysql/conf/my.cnf 到 mysql 容器的配置文件 /etc/mysql/conf.d/hmy.cnf
# -e 设置环境变量, MYSQL_ROOT_PASSWORD=123 设置 MySQL root 密码
|
3.3 数据卷/目录/文件 的挂载
docker run的命令中通过 -v 参数 用于声明挂载数据卷、文件或目录到容器中:
- -v [volume名称]:[容器内目录]
- -v [宿主机文件]:[容器内文件]
- -v [宿主机目录]:[容器内目录]
四、Docker Compose 容器编排
4.1 Docker Compose 概述
Docker Compose 是 Docker 官方的开源项目,负责实现对 Docker容器集群的快速编排。Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。通过定义一个 YAML 格式的配置文件 docker-compose.yml,编写好多个容器之间的调用关系,然后,只要一个命令,就能同时 启动 / 关闭 这些容器。
在使用 Docker 的时候,通过定义 Dockerfile 文件,然后使用 docker build
创建本地镜像(或 docker pull 拉取远程镜像到本地)、 使用 docker run
命令创建容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。Docker Compose 可以基于 Compose文件 帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器, Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。
docker-compose 用来在单机上编排容器(定义和运行多个容器,使容器能互通)。
Docker Compose 将所管理的容器分为三层,分别是工程(project),服务(service)以及 容器(containner)。
docker-compose.yml组成一个project,project里包括多个service,每个service定义了容器运行的镜像(或构建镜像)、网络端口、文件挂载、参数、依赖等,每个service可包括同一个镜像的多个容器实例。即 project 包含 service ,service 包含 container
Docker Compose 使用步骤:
- 编写 Dockerfile 定义各个微服务应用并构建出对应的镜像。
- 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
- 最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线。
4.2 Docker Compose 下载安装和卸载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 下载安装
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 开启可执行权限
chmod +x /usr/local/bin/docker-compose
# 或 使用包管理工具:
apt install docker-compose
# 查看版本
docker-compose --version
# docker-compose version 1.29.2, build 5becea4c
# 如果使用curl方式安装的,这样卸载即可
rm /usr/local/bin/docker-compose
|
4.3 Docker Compose 常用命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
docker --version # 查看版本
docker-compose -h # 查看帮助
docker-compose up # 启动所有docker-compose服务
docker-compose up -d # 启动所有docker-compose服务并后台运行
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id # 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
docker-compose top # 展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id # 查看容器输出日志
docker-compose logs -f nginx # 查看nginx的实时日志
docker-compose config # 检查配置
docker-compose config -q # 检查配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务
docker-compose build --no-cache nginx # 不带缓存的构建
docker-compose events --json nginx # 以json的形式输出nginx的docker日志
docker-compose pause nginx # 暂停nignx容器
docker-compose unpause nginx # 恢复ningx容器
docker-compose rm nginx # 删除容器
|
4.4 编写docker-compose.yml
官网地址:https://docs.docker.com/compose/compose-file/
参考文档:https://blog.csdn.net/weixin_42907150/article/details/136314795
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
version: '3'
services:
back:
image: backService:1.0
container_name: back
environment:
- name=tom
- DB_PATH=jdbc:sqlite:/data/ns.db
restart: always
privileged: true
ports:
- "9000:9000"
networks:
- "net"
volumes:
- "/root/k3s.kube.config:/k3s.kube.config"
- "/root/data:/data"
- "/etc/network/interfaces:/etc/network/interfaces"
front:
image: front:1.0
container_name: front
restart: always
ports:
- "10087:80"
networks:
- "net"
volumes:
- "/root/nginx.conf:/etc/nginx/nginx.conf"
networks:
net:
driver: bridge
|
1
2
3
4
5
6
7
8
|
services:
environment:
RACK_ENV: "development"
SHOW: "ture"
# -------------------------
environment:
- RACK_ENV="development"
- SHOW="ture"
|
1
2
3
|
services:
redis:
image: redis:alpine
|
- expose:定义容器用到的端口(一般用来标识镜像使用的端口,方便用ports映射)
1
2
3
4
|
services:
expose:
- "3000"
- "8000"
|
- ports:定义宿主机端口和容器端口的映射,可使用宿主机IP+宿主机端口进行访问 宿主机端口 容器端口
1
2
3
|
ports: # 暴露端口信息 - "宿主机端口:容器暴露端口"
- "5000" # 仅指定容器端口时,宿主机将会随机选择端口
- "8081:8080"
|
- volumes:卷挂载路径,定义宿主机的目录/文件和容器的目录/文件的映射 宿主机路径:容器路径
1
2
3
4
|
volumes:
- "/var/lib/mysql"
- "hostPath:containerPath"
- "root/configs:/etc/configs"
|
- depend_on: 规定service加载顺序,例如数据库服务需要在后台服务前运行
- extra_hosts:类似于docker里的–add-host参数 配置DNS域名解析(域名和IP的映射)
1
2
3
4
5
6
7
|
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"
# 相当于在容器种的/etc/hosts文件里增加
8.8.8.8 googledns
52.1.157.61 dockerhub
|
- restart: always :配置重启,docker每次启动时会启动该服务
- privileged: true :开启特权模式
- user: root :指定容器运行的用户名
- networks:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
# 可参考:https://www.cnblogs.com/jsonhc/p/7823286.html
version: "3"
services:
front:
image: front
container_name: front
depends_on:
- php
ports:
- "80:80"
networks:
- "net1"
volumes:
- "/www:/usr/local/nginx/html"
back:
image: back
container_name: back
expose:
- "9000"
networks:
- "net1"
volumes:
- "/www:/usr/local/nginx/html"
networks:
net1:
driver: bridge
|