docker容器编排利器Docker Compose(一):https://developer.aliyun.com/article/1416686
env_file
从文件中获取环境变量,可以指定一个或多个文件,其优先级低于 environment 指定的环境变量。
env_file: - /opt/runtime_opts.env # 绝对路径 - ./common.env # 相对路径,相对当前 docker-compose.yml 文件所在目录 - ./apps/web.env # 相对路径,相对当前 docker-compose.yml 文件所在目录
注意:env 文件中的每一行需采用 键=值 格式。以 # 开头的行会被视为注释并被忽略。空行也会被忽略。
command
覆盖容器启动后默认执行的命令。
command: echo "helloworld"
该命令也可以是一个列表
command: ["echo", "helloworld"]
volumes
数据卷,用于实现目录挂载,支持指定目录挂载、匿名挂载、具名挂载。
- 指定目录挂载的格式为: 左边宿主机目录:右边容器目录 ,或者 左边宿主机目录:右边容器目录:读写权限 ;
- 匿名挂载格式为: 容器目录即可 ,或者 容器目录即可:读写权限 ;
- 具名挂载格式为: 数据卷条目名称:容器目录 ,或者 数据卷条目名称:容器目录:读写权限 。
关于匿名挂载/具名挂载更多的内容请阅读《Docker 最常用的镜像命令和容器命令》文章中容器相关命令部分的目录挂载(容器数据卷操作)的内容。
# 描述 Compose 文件的版本信息 version: "3.8" # 定义服务,可以多个 services: mysql: # 服务名称 image: mysql:8 # 创建容器时所需的镜像 container_name: mysql8 # 容器名称,默认为"工程名称_服务条目名称_序号" ports: # 宿主机与容器的端口映射关系 - "3306:3306" # 左边宿主机端口:右边容器端口 environment: # 创建容器时所需的环境变量 MYSQL_ROOT_PASSWORD: 1234 volumes: # 绝对路径 - "/mydata/docker_mysql/data:/var/lib/mysql" # 相对路径,相对当前 docker-compose.yml 文件所在目录 - “./conf:/etc/mysql/conf.d“ # 匿名挂载,匿名挂载只需要写容器目录即可,容器外对应的目录会在 /var/lib/docker/volume 中生成 - "/var/lib/mysql" # 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生 成 - "mysql-data-volume:/var/lib/mysql" # 定义数据卷,可以多个 volumes: mysql-data-volume: # 一个具体数据卷的条目名称 name: mysql-data-volume # 数据卷名称,默认为"工程名称_数据卷条目名称"
network_mode
设置网络模式,类似 docker run 时添加的参数 --net host 或者 --network host 的用法。
network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]"
networks
配置容器连接的网络,引用顶级 networks 下的条目
# 定义服务,可以多个 services: nginx: # 服务名称 networks: # 配置容器连接的网络,引用顶级 networks 下的条目 - nginx-net # 一个具体网络的条目名称 # 定义网络,可以多个。如果不声明,默认会创建一个网络名称为"工程名称_default"的 bridge 网络 networks: nginx-net: # 一个具体网络的条目名称 name: nginx-net # 网络名称,默认为"工程名称_网络条目名称" driver: bridge # 网络模式,默认为 bridge
aliases
网络上此服务的别名。同一网络上的其他容器可以使用服务名或此别名连接到服务容器。同一服务在不同的网络上可以具有不同的别名。
# 定义服务,可以多个 services: nginx: # 服务名称 networks: # 配置容器连接的网络,引用顶级 networks 下的条目 nginx-net: # 一个具体网络的条目名称 aliases: # 服务别名,可以多个 - nginx1 # 同一网络上的其他容器可以使用服务名或此别名连接到服务容器 # 定义网络,可以多个。如果不声明,默认会创建一个网络名称为"工程名称_default"的bridge 网络 networks: nginx-net: # 一个具体网络的条目名称 name: nginx-net # 网络名称,默认为"工程名称_网络条目名称" driver: bridge # 网络模式,默认为 bridge
volumes
通过顶级配置 services 的学习,大家应该已经明白顶级配置 volumes 是干嘛的了,这里再详细把配置的不同方式讲解一下。
以下方式的数据卷声明创建卷时会使用默认的名称: “工程名称_数据卷条目名称” 。
# 描述 Compose 文件的版本信息 version: "3.8" # 定义服务,可以多个 services: mysql: image: mysql:8 container_name: mysql8 ports: - "3306:3306" environment MYSQL_ROOT_PASSWORD: 1234 volumes: # 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生 成 - "mysql-data-volume:/var/lib/mysql" # 定义数据卷,可以多个 volumes: mysql-data-volume: # 一个具体数据卷的条目名称
以下方式的数据卷声明创建卷时会使用自定义的名称。
# 描述 Compose 文件的版本信息 version: "3.8" # 定义服务,可以多个 services: mysql: image: mysql:8 container_name: mysql8 ports: - "3306:3306" environment MYSQL_ROOT_PASSWORD: 1234 volumes: # 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生 成 - "mysql-data-volume:/var/lib/mysql" # 定义数据卷,可以多个 volumes: mysql-data-volume: # 一个具体数据卷的条目名称 name: mysql-data-volume # 数据卷名称,默认为"工程名称_数据卷条目名称"
networks
如果不声明网络,每个工程默认会创建一个网络名称为 “工程名称_default” 的 bridge 网络。
# 描述 Compose 文件的版本信息 version: "3.8" # 定义服务,可以多个 services: nginx: image: nginx container_name: mynginx ports: - "80:80" # 定义网络,可以多个。如果不声明,默认会创建一个网络名称为"工程名称_default"的 bridge 网络 #networks:
以下方式的网络声明创建网络时会使用默认的名称: “工程名称_网络条目名称” ,网络模式默认bridge 。
# 描述 Compose 文件的版本信息 version: "3.8" # 定义服务,可以多个 services: nginx: image: nginx container_name: mynginx ports: - "80:80" networks: # 配置容器连接的网络,引用顶级 networks 下的条目 nginx-net: # 定义网络,可以多个 networks: nginx-net: # 一个具体网络的条目名称
以下方式的网络声明创建网络时会使用自定义的名称,还可以通过 driver 选择网络模式,默认为bridge 。
# 描述 Compose 文件的版本信息 version: "3.8" # 定义服务,可以多个 services: nginx: image: nginx container_name: mynginx ports: - "80:80" networks: # 配置容器连接的网络,引用顶级 networks 下的条目 nginx-net: # 定义网络,可以多个 networks: nginx-net: # 一个具体网络的条目名称 name: nginx-net # 网络名称,默认为"工程名称_网络条目名称" driver: bridge # 网络模式,默认为 bridge
Compose 常用命令
官方文档:https://docs.docker.com/compose/reference/overview/
为了更熟练的使用 Compose,以下常用命令大家多多练习,方可熟能生巧。
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
部分命令选项如下:
- -f,–file :指定使用的 Compose 模板文件,默认为 docker-compose.yml ,可以多次指定,指定多个 yml;
- -p, --project-name :指定工程名称,默认使用 docker-compose.yml 文件所在目录的名称;
- -v :打印版本并退出;
- –log-level :定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)。
help
docker-compose -help 查看帮助。
config
docker-compose config -q 验证 docker-compose.yml 文件。当配置正确时,不输出任何内容,当配置错误时,输出错误信息。
pull
docker-compose pull 拉取服务依赖的镜像。
# 拉取工程中所有服务依赖的镜像 docker-compose pull # 拉取工程中 nginx 服务依赖的镜像 docker-compose pull nginx # 拉取镜像过程中不打印拉取进度信息 docker-compose pull -q
up
docker-compose up 创建并启动所有服务的容器。指定多个 yml 加 -f 选项。以守护进程模式运行加 -d 选项。
# 前台启动 docker-compose up # 后台启动 docker-compose up -d # -f 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定,指定多个 yml docker-compose -f docker-compose.yml up -d
logs
docker-compose logs 查看服务容器的输出日志。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。
# 输出日志,不同的服务输出使用不同的颜色来区分 docker-compose logs # 跟踪日志输出 docker-compose logs -f # 关闭颜色 docker-compose logs --no-color
ps
docker-compose ps 列出工程中所有服务的容器。
# 列出工程中所有服务的容器 docker-compose ps # 列出工程中指定服务的容器 docker-compose ps nginx
run
docker-compose run 在指定服务容器上执行一个命令。
# 在工程中指定服务的容器上执行 echo "helloworld" docker-compose run nginx echo "helloworld"
exec
docker-compose exec 进入服务容器。
# 进入工程中指定服务的容器 docker-compose exec nginx bash # 当一个服务拥有多个容器时,可通过 --index 参数进入到该服务下的任何容器 docker-compose exec --index=1 nginx bash
pause
docker-compose pause 暂停服务容器。
# 暂停工程中所有服务的容器 docker-compose pause # 暂停工程中指定服务的容器 docker-compose pause nginx
unpause
docker-compose unpause 恢复服务容器。
# 恢复工程中所有服务的容器 docker-compose unpause # 恢复工程中指定服务的容器 docker-compose unpause nginx
restart
docker-compose restart 重启服务容器。
# 重启工程中所有服务的容器 docker-compose restart # 重启工程中指定服务的容器 docker-compose restart nginx
start
docker-compose start 启动服务容器。
# 启动工程中所有服务的容器 docker-compose start # 启动工程中指定服务的容器 docker-compose start nginx
stop
docker-compose stop 停止服务容器。
# 停止工程中所有服务的容器 docker-compose stop # 停止工程中指定服务的容器 docker-compose stop nginx
kill
docker-compose kill 通过发送 SIGKILL 信号停止指定服务的容器。
# 通过发送 SIGKILL 信号停止工程中指定服务的容器 docker-compose kill nginx
rm
docker-compose rm 删除服务(停止状态)容器。
# 删除所有(停止状态)服务的容器 docker-compose rm # 先停止所有服务的容器,再删除所有服务的容器 docker-compose rm -s # 不询问是否删除,直接删除 docker-compose rm -f # 删除服务容器挂载的数据卷 docker-compose rm -v # 删除工程中指定服务的容器 docker-compose rm -sv nginx
down
停止并删除所有服务的容器、网络、镜像、数据卷。
# 停止并删除工程中所有服务的容器、网络 docker-compose stop # 停止并删除工程中所有服务的容器、网络、镜像 docker-compose down --rmi all # 停止并删除工程中所有服务的容器、网络、数据卷 docker-compose down -v
images
docker-compose images 打印服务容器所对应的镜像。
# 打印所有服务的容器所对应的镜像 docker-compose images # 打印指定服务的容器所对应的镜像 docker-compose images nginx
port
docker-compose port 打印指定服务容器的某个端口所映射的宿主机端口。
[root@localhost docker-nginx]# docker-compose port nginx 80 0.0.0.0:80
top
docker-compose top 显示正在运行的进程。
# 显示工程中所有服务的容器正在运行的进程 docker-compose top # 显示工程中指定服务的容器正在运行的进程 docker-compose top nginx
总结
Docker Compose 的整体使用步骤还是比较简单的,三个步骤为:
- 使用 Dockerfile 文件定义应用程序的环境;
- 使用 docker-compose.yml 文件定义构成应用程序的服务,这样它们可以在隔离环境中一起运行;
- 最后,执行 docker-compose up 命令来创建并启动所有服务。
虽然 docker-compose.yml 文件详解和Compose 常用命令这两大块的内容比较多,但是如果要快速入门使用 Compose ,其实只需要了解其中部分内容即可。后期大家可在项目生产环境中根据自身情况再进一步深入学习即可。
参考资料
https://docs.docker.com/compose/install/
http://get.daocloud.io/#install-compose
https://docs.docker.com/compose/
https://docs.docker.com/compose/compose-file/
https://docs.docker.com/compose/reference/overview/