Compose 的工作原理
使用 Docker Compose 时,您可以使用一个 YAML 配置文件,称为 Compose 文件,来配置您的应用程序服务,然后使用 Compose CLI 从您的配置中创建并启动所有服务。
Compose 文件,或 compose.yaml 文件,遵循由
Compose 规范 提供的规则来定义多容器应用程序。这是 Docker Compose 对正式
Compose 规范 的实现。
应用程序的计算组件被定义为 services。服务是一个抽象概念,在平台上通过运行相同的容器镜像和配置一次或多次来实现。
服务之间通过网络进行通信。在Compose规范中,网络是一个平台能力抽象,用于在连接在一起的服务中的容器之间建立IP路由。
服务将持久数据存储并共享到 volumes。规范将这种持久数据描述为具有全局选项的高级文件系统挂载。
某些服务需要依赖于运行时或平台的配置数据。为此,规范定义了一个专门的 configs 概念。从服务容器的角度来看,配置类似于卷,因为它们是被挂载到容器中的文件。但实际的定义涉及不同的平台资源和服务,这些都被这种类型所抽象化。
一个 secret 是一种特定类型的配置数据,用于处理敏感数据,这些数据在没有安全考虑的情况下不应暴露。Secrets 作为文件挂载到服务的容器中,但提供敏感数据的平台特定资源非常具体,值得在 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。
你可以使用 fragments 和 extensions 来保持你的 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