Docker 容器编排利器 Docker Compose
1|0Compose 简介
通过前面几篇文章的学习,我们可以通过 Dockerfile 文件让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况,例如之前我给大家讲过的《Docker 搭建 Redis Cluster 集群》,或者开发一个 Web 应用,除了 Web 服务容器本身,还需要数据库服务容器、缓存容器,甚至还包括负载均衡容器等等。
Docker Compose 恰好满足了这样的需求,它是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YAML
文件来配置应用程序所需要的服务。然后使用一个命令,就可以通过 YAML
配置文件创建并启动所有服务。
Docker Compose 项目是 Docker 官方的开源项目,来源于之前的 Fig 项目,使用 Python 语言编写。负责实现对 Docker 容器集群的快速编排。项目地址为:https://github.com/docker/compose/releases
Docker Compose 使用的三个步骤为:
- 使用
Dockerfile
文件定义应用程序的环境; - 使用
docker-compose.yml
文件定义构成应用程序的服务,这样它们可以在隔离环境中一起运行; - 最后,执行
docker-compose up
命令来创建并启动所有服务。
2|0Compose 安装
2|1下载
官方文档:https://docs.docker.com/compose/install/
您可以在 macOS,Windows 和 Linux 上运行 Compose。本文演示基于 Linux 环境的安装。我们可以使用 curl
命令从 Github 下载它的二进制文件来使用,运行以下命令下载 Docker Compose 的当前稳定版本。或者从网页下载后上传至服务器指定目录 /usr/local/bin
也行。
因为 Docker Compose 存放在 GitHub,可能不太稳定。你也可以通过执行下面的命令,高速安装 Compose。该加速通道由 DaoCloud
提供:http://get.daocloud.io/#install-compose
您可以通过修改 URL 中的版本,自定义您所需要的版本文件。
2|2授权
安装完成以后,查看指定目录,发现该文件没有可执行权限,进行授权操作。
2|3测试
2|4卸载
卸载 Compose 非常简单,直接删除二进制文件即可。
3|0docker-compose.yml 文件详解
3|1概念
官方文档:https://docs.docker.com/compose/compose-file/
Docker Compose 允许用户通过 docker-compose.yml
文件(YAML 格式)来定义一组相关联的容器为一个工程(project)
。一个工程包含多个服务(service)
,每个服务中定义了创建容器时所需的镜像、参数、依赖等。
工程名若无特殊指定,即为
docker-compose.yml
文件所在目录的名称。
Docker Compose 模板文件我们需要关注的顶级配置有 version
、services
、networks
、volumes
几个部分,除 version
外,其他几个顶级配置下还有很多下级配置,后面也会详细给大家介绍,先来看看这几个顶级配置都什么意思:
version
:描述 Compose 文件的版本信息,当前最新版本为3.8
,对应的 Docker 版本为19.03.0+
;services
:定义服务,可以多个,每个服务中定义了创建容器时所需的镜像、参数、依赖等;networkds
:定义网络,可以多个,根据 DNS server 让相同网络中的容器可以直接通过容器名称进行通信;volumes
:数据卷,用于实现目录挂载。
3|2案例
在配置文件中,所有的容器通过 services
来定义,然后使用 docker-compose
脚本来启动,停止和重启容器,非常适合多个容器组合使用进行开发的场景。我们先从一个简单的 Compose 案例学起。
编写 docker-compose.yml
文件。
在文件中添加以下内容:
使用 docker-compose up
创建并启动所有服务。这个简单的案例中就只有一个 Nginx 后续我们会来一些复杂的练习:
浏览器访问:http://192.168.10.10/ 结果如下:
使用 docker-compose down
可以停止并删除容器、网络。
3|3version
描述 Compose 文件的版本信息,当前最新版本为 3.8
,对应的 Docker 版本为 19.03.0+
。关于每个版本的详细信息请参考:https://docs.docker.com/compose/compose-file/compose-versioning/
以下为 Compose 文件的版本信息所对应的 Docker 版本。
Compose file format | Docker Engine release |
---|---|
3.8 | 19.03.0+ |
3.7 | 18.06.0+ |
3.6 | 18.02.0+ |
3.5 | 17.12.0+ |
3.4 | 17.09.0+ |
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3.0 | 1.13.0+ |
2.4 | 17.12.0+ |
2.3 | 17.06.0+ |
2.2 | 1.13.0+ |
2.1 | 1.12.0+ |
2.0 | 1.10.0+ |
1.0 | 1.9.1.+ |
3|4services
刚才我们提到 docker-compose.yml
文件中包含很多下级配置项,下面带大家把一些常用的配置项详细了解一下,先从顶级配置 services
开始。
services
用来定义服务,可以多个,每个服务中定义了创建容器时所需的镜像、参数、依赖等,就像将命令行参数传递给 docker run
一样。同样,网络和数据卷的定义也是一样的。
比如,之前我们通过 docker run
命令构建一个 MySQL 应用容器的命令如下:
使用 docker-compose.yml
以后则可以这样定义:
然后通过 dokcer-compose
相关命令即可完成容器的创建,停止或删除等一系列操作。
image
指定创建容器时所需的镜像名称标签或者镜像 ID。如果镜像在本地不存在,会去远程拉取。
build
除了可以基于指定的镜像构建容器,还可以基于 Dockerfile
文件构建,在使用 up
命令时会执行构建任务。
通过 build
配置项可以指定 Dockerfile
所在文件夹的路径。Compose 将会利用 Dockerfile
自动构建镜像,然后使用镜像启动服务容器。
build
配置项可以使用绝对路径,也可以使用相对路径。
接下来我们来个稍微复杂点的练习,通过基础镜像 centos:7
,在该镜像中安装 jdk 和 tomcat 以后将其制作为一个新的镜像 mycentos:7
。
创建目录并编写 Dockerfile
文件。
Dockerfile
文件内容如下:
将所需的资源包 jdk
和 tomcat
上传至 Dockerfile 同一目录。
创建目录并编写 docker-compose.yml
文件。
然后通过 dokcer-compose
相关命令即可完成容器的创建,停止或删除等一系列操作。
context
该选项可以是 Dockerfile 文件的绝对/相对路径,也可以是远程 Git 仓库的 URL,当提供的值是相对路径时,相对当前 docker-compose.yml 文件所在目录。
dockerfile
一般情况下,默认都基于文件名叫 Dockerfile 的文件构建镜像,当然也可以是自定义的文件名,使用 dockerfile
声明,不过这个选项只能声明文件名,文件所在路径还是要通过 centext 来声明。
container_name
Compose 创建的容器默认生成的名称格式为:工程名称_服务条目名称_序号
。如果要使用自定义名称,使用 container_name
声明。
因为 Docker 容器名称必须是唯一的,所以如果指定了自定义名称,就不能将服务扩展至多个容器。这样做可能会导致错误。
关于序号
序号是干什么用的呢,看下面这个例子你就懂了,docker-compose.yml
文件内容如下:
然后通过 --scale
指定 helloworld
服务一次性启动 3 个。
通过下图可以看到有 3 个容器被创建,容器名称最后的序号是从 1 开始累加的,这就是序号的作用。所以如果指定了自定义名称,就不能将服务扩展至多个容器。
depends_on
使用 Compose 最大的好处就是敲最少的命令做更多的事情,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没有启动数据库容器的情况下启动了 Web 应用容器,应用容器会因为找不到数据库而退出。depends_on
就是用来解决容器依赖、启动先后问题的配置项。
上述 YAML 文件定义的容器会先启动 db 和 redis 两个服务,最后才启动 web 服务。
ports
容器对外暴露的端口,格式:左边宿主机端口:右边容器端口
。
expose
容器暴露的端口不映射到宿主机,只允许能被连接的服务访问。
restart
容器重启策略,简单的理解就是 Docker 重启以后容器要不要一起启动:
no
:默认的重启策略,在任何情况下都不会重启容器;on-failure
:容器非正常退出时,比如退出状态为非0
(异常退出),才会重启容器;always
:容器总是重新启动,即使容器被手动停止了,当 Docker 重启时容器也还是会一起启动;unless-stopped
:容器总是重新启动,除非容器被停止(手动或其他方式),那么 Docker 重启时容器则不会启动。
environment
添加环境变量。可以使用数组也可以使用字典。布尔相关的值(true、false、yes、no)都需要用引号括起来,以确保 YML 解析器不会将它们转换为真或假。
或者以下格式:
env_file
从文件中获取环境变量,可以指定一个或多个文件,其优先级低于 environment 指定的环境变量。
注意:env 文件中的每一行需采用
键=值
格式。以#
开头的行会被视为注释并被忽略。空行也会被忽略。
command
覆盖容器启动后默认执行的命令。
该命令也可以是一个列表。
volumes
数据卷,用于实现目录挂载,支持指定目录挂载、匿名挂载、具名挂载。
- 指定目录挂载的格式为:
左边宿主机目录:右边容器目录
,或者左边宿主机目录:右边容器目录:读写权限
; - 匿名挂载格式为:
容器目录即可
,或者容器目录即可:读写权限
; - 具名挂载格式为:
数据卷条目名称:容器目录
,或者数据卷条目名称:容器目录:读写权限
。
关于匿名挂载/具名挂载更多的内容请阅读《Docker 最常用的镜像命令和容器命令》文章中容器相关命令部分的目录挂载(容器数据卷操作)的内容。
network_mode
设置网络模式,类似 docker run
时添加的参数 --net host
或者 --network host
的用法。
networks
配置容器连接的网络,引用顶级 networks 下的条目。
aliases
网络上此服务的别名。同一网络上的其他容器可以使用服务名或此别名连接到服务容器。同一服务在不同的网络上可以具有不同的别名。
3|5volumes
通过顶级配置 services
的学习,大家应该已经明白顶级配置 volumes
是干嘛的了,这里再详细把配置的不同方式讲解一下。
以下方式的数据卷声明创建卷时会使用默认的名称:"工程名称_数据卷条目名称"
。
以下方式的数据卷声明创建卷时会使用自定义的名称。
3|6networks
通过顶级配置 services
的讲解,大家其实已经明白顶级配置 volumes
是干嘛的了,这里再详细把配置的不同方式讲解一下。
如果不声明网络,每个工程默认会创建一个网络名称为"工程名称_default"
的 bridge
网络。
以下方式的网络声明创建网络时会使用默认的名称:"工程名称_网络条目名称"
,网络模式默认为 bridge
。
以下方式的网络声明创建网络时会使用自定义的名称,还可以通过 driver
选择网络模式,默认为 bridge
。
4|0Compose 常用命令
官方文档:https://docs.docker.com/compose/reference/overview/
为了更熟练的使用 Compose,以下常用命令大家多多练习,方可熟能生巧。
部分命令选项如下:
-f,--file
:指定使用的 Compose 模板文件,默认为docker-compose.yml
,可以多次指定,指定多个 yml;-p, --project-name
:指定工程名称,默认使用docker-compose.yml
文件所在目录的名称;-v
:打印版本并退出;--log-level
:定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)。
4|1help
docker-compose -help
查看帮助。
4|2config
docker-compose config -q
验证 docker-compose.yml
文件。当配置正确时,不输出任何内容,当配置错误时,输出错误信息。
4|3pull
docker-compose pull
拉取服务依赖的镜像。
4|4up
docker-compose up
创建并启动所有服务的容器。指定多个 yml 加 -f
选项。以守护进程模式运行加 -d
选项。
4|5logs
docker-compose logs
查看服务容器的输出日志。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color
来关闭颜色。
4|6ps
docker-compose ps
列出工程中所有服务的容器。
4|7run
docker-compose run
在指定服务容器上执行一个命令。
4|8exec
docker-compose exec
进入服务容器。
4|9pause
docker-compose pause
暂停服务容器。
4|10unpause
docker-compose unpause
恢复服务容器。
4|11restart
docker-compose restart
重启服务容器。
4|12start
docker-compose start
启动服务容器。
4|13stop
docker-compose stop
停止服务容器。
4|14kill
docker-compose kill
通过发送 SIGKILL
信号停止指定服务的容器。
4|15rm
docker-compose rm
删除服务(停止状态)容器。
4|16down
停止并删除所有服务的容器、网络、镜像、数据卷。
4|17create
docker-compose create
为服务创建容器,已不推荐使用。推荐使用 docker-compose up
来实现该功能。
4|18scale
docker-compose scale
设置指定服务运行的容器个数,已不推荐使用。
推荐使用 --scale service=num
的参数来设置数量。
4|19images
docker-compose images
打印服务容器所对应的镜像。
4|20port
docker-compose port
打印指定服务容器的某个端口所映射的宿主机端口。
4|21top
docker-compose top
显示正在运行的进程。
5|0总结
Docker Compose 的整体使用步骤还是比较简单的,三个步骤为:
- 使用
Dockerfile
文件定义应用程序的环境; - 使用
docker-compose.yml
文件定义构成应用程序的服务,这样它们可以在隔离环境中一起运行; - 最后,执行
docker-compose up
命令来创建并启动所有服务。
虽然 docker-compose.yml 文件详解和Compose 常用命令这两大块的内容比较多,但是如果要快速入门使用 Compose
,其实只需要了解其中部分内容即可。后期大家可在项目生产环境中根据自身情况再进一步深入学习即可。
接下来我们使用 Docker Compose 搭建一遍 Redis Cluster 集群环境,感受感受与之前的区别。
6|0参考资料
- 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/
本文采用 知识共享「署名-非商业性使用-禁止演绎 4.0 国际」许可协议
。
🤗 您的点赞
和转发
是对我最大的支持。
📢 扫码关注 哈喽沃德先生
「文档 + 视频」每篇文章都配有专门视频讲解,学习更轻松噢 ~
__EOF__

本文链接:https://www.cnblogs.com/mrhelloworld/p/docker13.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
https://mrhelloworld.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App