Compose 工作原理
使用 Docker Compose,您可以使用 YAML 配置文件(称为Compose 文件)来配置应用程序的服务,然后使用Compose CLI从您的配置中创建并启动所有服务。
Compose 文件(或compose.yaml
文件)遵循Compose 规范中提供的规则,说明如何定义多容器应用程序。这是正式Compose 规范的 Docker Compose 实现。
应用程序的计算组件定义为服务。服务是一个抽象概念,在平台上通过运行相同的容器镜像和配置一到多次来实现。
服务通过网络相互通信。在 Compose 规范中,网络是平台功能抽象,用于在连接在一起的服务中的容器之间建立 IP 路由。
服务将持久性数据存储到卷中并共享持久性数据。规范将此类持久性数据描述为具有全局选项的高级文件系统挂载。
某些服务需要依赖于运行时或平台的配置数据。为此,规范定义了一个专用的配置概念。从服务容器的角度来看,配置类似于卷,因为它们是挂载到容器中的文件。但是,实际定义涉及不同的平台资源和服务,这些资源和服务由此类型抽象。
一个密钥是一种特定类型的配置数据,用于应在没有安全考虑的情况下不公开的敏感数据。密钥作为挂载到其容器中的文件提供给服务,但提供敏感数据的特定于平台的资源非常具体,因此在 Compose 规范中应该有一个不同的概念和定义。
注意
使用卷、配置和密钥,您可以在顶级进行简单的声明,然后在服务级别添加更多特定于平台的信息。
项目是在平台上部署应用程序规范的单个部署。使用顶级name
属性设置的项目的名称用于将资源分组在一起并将其与其他应用程序或具有不同参数的相同 Compose 指定应用程序的其他安装隔离开来。如果您正在平台上创建资源,则必须以项目为前缀资源名称并设置标签com.docker.compose.project
。
Compose 提供了一种设置自定义项目名称并覆盖此名称的方法,这样,同一个compose.yaml
文件可以在同一个基础设施上部署两次,而无需更改,只需传递不同的名称。
Compose 文件
Compose 文件的默认路径是位于工作目录中的compose.yaml
(首选)或compose.yml
。Compose 还支持docker-compose.yaml
和docker-compose.yml
,以向后兼容早期版本。如果两个文件都存在,Compose 优先选择规范的compose.yaml
。
您可以使用片段和扩展使您的 Compose 文件保持高效且易于维护。
可以将多个 Compose 文件合并在一起以定义应用程序模型。YAML 文件的组合是通过根据您设置的 Compose 文件顺序追加或覆盖 YAML 元素来实现的。简单的属性和映射将被最高阶的 Compose 文件覆盖,列表将通过追加来合并。每当合并的补充文件托管在其他文件夹中时,相对路径将根据第一个 Compose 文件的父文件夹解析。由于某些 Compose 文件元素既可以表示为单个字符串也可以表示为复杂对象,因此合并适用于展开的形式。有关更多信息,请参阅使用多个 Compose 文件。
如果您想重用其他 Compose 文件,或将应用程序模型的各个部分分解到单独的 Compose 文件中,您还可以使用include
。如果您的 Compose 应用程序依赖于另一个由不同团队管理的应用程序,或者需要与他人共享,这将非常有用。
CLI
Docker CLI 允许您通过docker compose
命令及其子命令与 Docker Compose 应用程序进行交互。使用 CLI,您可以管理在compose.yaml
文件中定义的多容器应用程序的生命周期。CLI 命令使您可以轻松地启动、停止和配置您的应用程序。
主要命令
要启动compose.yaml
文件中定义的所有服务:
$ docker compose up
要停止并删除正在运行的服务:
$ docker compose down
如果您想监视正在运行的容器的输出并调试问题,您可以使用以下命令查看日志:
$ docker compose logs
要列出所有服务及其当前状态:
$ docker compose ps
有关所有 Compose CLI 命令的完整列表,请参阅参考文档。
示例
以下示例说明了上面概述的 Compose 概念。此示例是非规范性的。
考虑一个被拆分为前端 Web 应用程序和后端服务的应用程序。
前端在运行时通过基础设施管理的 HTTP 配置文件进行配置,提供外部域名,并通过平台的安全密钥存储注入 HTTPS 服务器证书。
后端将数据存储在持久卷中。
两项服务通过隔离的后端网络相互通信,而前端也连接到前端网络并公开端口 443 用于外部使用。


示例应用程序由以下部分组成:
- 2 个服务,由 Docker 镜像支持:
webapp
和database
- 1 个密钥(HTTPS 证书),注入到前端
- 1 个配置(HTTP),注入到前端
- 1 个持久卷,附加到后端
- 2 个网络
services:
frontend:
image: example/webapp
ports:
- "443:8043"
networks:
- front-tier
- back-tier
configs:
- httpd-config
secrets:
- server-certificate
backend:
image: example/database
volumes:
- db-data:/etc/data
networks:
- back-tier
volumes:
db-data:
driver: flocker
driver_opts:
size: "10GiB"
configs:
httpd-config:
external: true
secrets:
server-certificate:
external: true
networks:
# The presence of these objects is sufficient to define them
front-tier: {}
back-tier: {}
docker compose up
命令启动frontend
和backend
服务,创建必要的网络和卷,并将配置和密钥注入到前端服务。
docker compose ps
提供服务的当前状态快照,使您可以轻松查看哪些容器正在运行、它们的状态以及它们正在使用的端口。
$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
example-frontend-1 example/webapp "nginx -g 'daemon of…" frontend 2 minutes ago Up 2 minutes 0.0.0.0:443->8043/tcp
example-backend-1 example/database "docker-entrypoint.s…" backend 2 minutes ago Up 2 minutes