跳到主要内容Docker 多容器编排:Compose 实战教程 | 极客日志Shell / Bash
Docker 多容器编排:Compose 实战教程
Docker Compose 是定义和运行多容器 Docker 应用的工具,通过单个配置文件管理服务、网络和卷。相比手动执行多条 docker run 命令,它能简化部署流程,实现一键启动和依赖管理。 Compose 的核心概念、docker-compose.yml 文件格式及常用参数详解,包括 image、command、environment、volumes、ports 等配置项。同时梳理了 docker compose 相关指令如 up、down、build、logs 等用法,并通过综合案例展示了如何配置并启动包含 Web、数据库等服务的应用栈,适用于开发、测试及单机部署场景。
暖阳1 浏览 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许您使用一个单独的配置文件(通常是 .yml 格式)来配置应用程序的所有服务、网络和卷,然后通过一条简单的命令就能创建和启动所有服务。
可以把它想象成一个自动化脚本或编排工具,专门用于在单台主机上部署由多个容器组成的应用。
为什么要使用 Docker Compose?解决什么问题?
在理解 Compose 之前,先想想如果不用它,会多麻烦:假设应用由以下服务组成:Web 应用、Redis 缓存服务、MySQL 数据库服务,如果没有 Docker Compose,你需要手动完成以下步骤:
- 创建一个 Docker 网络让容器可以通信。
- 单独启动 MySQL 容器,并指定网络、卷、环境变量等。
- 单独启动 Redis 容器,并指定网络、环境变量等。
- 构建你的 Web 应用的镜像。
- 启动 Web 应用容器,并链接到之前创建的网络,设置环境变量指向 Redis 和 PostgreSQL 的容器名。
你需要记住并输入一大堆 docker run 命令,这个过程非常繁琐且容易出错。
- 简化流程:用一个文件(
docker-compose.yml)描述整个应用栈的架构。
- 一键操作:通过一条命令(
docker compose up)就能同时创建、启动所有服务,并处理好它们之间的依赖关系。
- 配置即代码:将你的应用基础设施(服务、网络、存储)用配置文件管理起来,可以纳入版本控制系统,方便协作和追溯。
- 定义
docker-compose.yml 文件:这是 Docker Compose 的核心。你在这个 YAML 文件中定义你的应用所需的服务、网络和卷。
- 服务:对应一个容器。你可以指定使用哪个镜像、暴露哪些端口、挂载哪些卷、设置哪些环境变量、依赖哪些其他服务等。
- 网络:定义容器之间通信的网络。
- 卷:定义持久化数据存储的位置。
- 执行
docker compose up 命令:在包含 docker-compose.yml 文件的目录下运行此命令。Compose 会:
- 自动构建或拉取所需的镜像。
- 按依赖顺序创建并启动所有定义的服务。
- 将所有服务的日志输出聚合到一个流中,方便查看。
- 执行
docker compose down 命令:当你想要停止并清理整个应用时,运行此命令。它会停止所有容器,并删除创建的容器和网络(默认情况下不删除卷)。
- 隔离环境:整个应用栈与主机环境完全隔离。
- 极简配置:一个命令替代了大量复杂的
docker run 命令。
- 快速部署:极大地简化了多容器应用的部署和测试流程,是开发、测试和 CI/CD 环境的理想选择。
- 服务发现:自动在服务之间创建网络,并通过服务名进行 DNS 解析,使容器间通信变得非常简单。
注意:Docker Compose 通常用于开发、测试和单机部署。对于生产环境中跨多台主机的集群管理和编排,更强大的工具如 Kubernetes 或 Docker Swarm 更为合适。不过,Compose 文件可以作为学习这些更复杂工具的基础。
配置文件格式
version:指定 Docker Compose 文件的版本格式,不同版本支持的功能和语法有所不同,高版本兼容低版本。
services:服务,可以存在多个。
servicename:服务名字,它也是内部 bridge 网络可以使用的 DNS name,如果不是集群模式相当于 docker run 的时候指定的一个名称,集群(Swarm)模式是多个容器的逻辑抽象。
image:镜像的名字(必选)。
command:如果设置,则会覆盖默认镜像里的 CMD 命令。
environment:等价于 docker container run 里的 --env 选项,设置环境变量。
volumes:等价于 docker container run 里的 -v 选项,绑定数据卷。
networks:等价于 docker container run 里的 --network 选项,指定网络。
ports:等价于 docker container run 里的 -p 选项,指定端口映射。
expose:可选,指定容器暴露的端口。
build:构建目录。
depends_on:服务依赖配置。
env_file:环境变量文件。
参数详解
mycompose/
├── prj1
│ └── docker-compose.yml
├── prj2
│ └── docker-compose.yml
└── prj3
└── docker-compose.yml
image
services:
web:
image: nginx:1.24.0
command
command: ["bundle", "exec", "thin", "-p", "3000"]
command: bundle exec thin -p 3000
services:
web:
image: nginx:1.24.0
command: bundle exec thin -p 3000
entrypoint
功能:覆盖容器默认的 entrypoint。
格式:
entrypoint: /code/entrypoint.sh
entrypoint:
- php
- -d zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
- -d memory_limit=-1
- vendor/bin/phpunit
services:
web:
image: nginx:1.24.0
entrypoint:
- tail
- -f
- /etc/os-release
environment
功能:添加环境变量。您可以使用数组或字典,任何布尔值需要用引号引起来,以确保 YAML 解析器不会将其转换为 True 或 False。
格式:
environment:
RACK_ENV: development
SHOW: "true"
USER_INPUT:
environment:
- RACK_ENV=development
- SHOW=true
- USER_INPUT=
services:
web:
image: nginx:1.24.0
environment:
TEST: 1
networks
services:
web:
image: nginx:1.24.0
networks:
- web1
- web2
networks:
web1:
web2:
volumes
volumes:
- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
- "/localhost/data:/var/lib/postgresql/data"
volumes:
- type: volume
source: db-data
target: /data
volume:
nocopy: true
- type: bind
source: /var/run/postgres/postgres.sock
target: /var/run/postgres/postgres.sock
services:
web:
image: nginx:1.24.0
volumes:
- /home/qsy/gitDocker/data/myvolumes:/usr/share/nginx/html/
ports
ports:
- target: 80
host_ip: 127.0.0.1
published: 8080
protocol: tcp
mode: host
- target: 80
host_ip: 127.0.0.1
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
services:
web:
image: nginx:1.24.0
ports:
- 7070:80
expose
功能:暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数。
格式/示例:
expose:
- "3000"
- "8000"
depends_on
docker compose up:以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis,才会启动 web。
docker compose up SERVICE:自动包含 SERVICE 的依赖项。在以下示例中,docker compose up web 还将创建并启动 db 和 redis。
docker compose stop:按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
env_file
env_file:
- ./.env
- ./apps/web.env
- /opt/secrets.env
docker compose 指令
docker compose 指令与容器操作相似,只不过把容器改成了服务。
docker compose [OPTIONS] COMMAND [ARGS...]
- docker compose build - 构建服务
- docker compose config - 以规范格式显示服务配置
- docker compose cp - 在本地系统和服务容器之间拷贝文件
- docker compose create - 创建服务的容器
- docker compose down - 停止所有容器并删除容器
- docker compose events - 从服务器获取实时事件
- docker compose exec - 在容器中执行命令
- docker compose images - 列出所有容器使用的镜像
- docker compose kill - 强制停止服务的容器
- docker compose logs - 显示容器日志
- docker compose ls - 显示所有项目
- docker compose pause - 暂停服务
- docker compose port - 列出所有的端口映射
- docker compose ps - 列出项目中目前的所有容器
- docker compose pull - 拉取服务镜像
- docker compose push - 推送服务镜像
- docker compose restart - 重启服务
- docker compose rm - 删除已停止的服务容器
- docker compose run - 在指定服务容器上执行命令
- docker compose start - 启动当前停止的容器
- docker compose stop - 停止当前运行的容器
- docker compose top - 显示运行的进程
- docker compose unpause - 恢复服务
- docker compose up - 构建、创建、启动和链接服务相关的容器(支持 --no-recreate 参数避免重新创建,-d 后台运行)
- docker compose version - 查看版本信息
用法和功能与容器的相关指令类似,只是 docker compose 的操作对象是服务而已。
up
功能:该命令的作用十分强大,它会尝试自动完成包括构建镜像、(重新)创建服务、启动服务并关联服务相关容器的一系列操作,可以直接通过该命令来启动一个项目。
语法:
docker compose up [options][service...]
-d 在后台运行服务器,推荐在生产环境下使用该选项
--force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用
--no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用
down
功能:停止所有容器,并删除容器和网络。
语法:
docker compose down [options][SERVICE...]
-v, --volumes:删除容器同时删除目录映射。
run
功能:该命令可以在指定服务器上执行相关的命令。
语法:
docker compose run [options] SERVICE [COMMAND][ARGS...]
与 docker run 的区别,该指令是用服务启动容器,而不是镜像。
选项说明:
-d 后台运行容器
--name NAME 为容器指定一个名字
--entrypoint CMD 覆盖默认的容器启动指令
-e KEY=VAL 设置环境变量值,可多次使用选项来设置多个环境变量
-u, --user="" 指定运行容器的用户名或者 uid
--rm 运行命令后自动删除容器
-p, --publish=[] 映射容器端口到本地主机
综合案例
docker-compose.yml 配置示例如下:
version: '3'
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
清理,与启动相反,先清理主要的服务,然后清理依赖的服务。
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
- JSON美化和格式化
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online