Compose 如何工作

使用 Docker Compose,您可以通过一个名为 Compose 文件的 YAML 配置文件来配置应用程序的服务,然后使用 Compose CLI根据您的配置创建并启动所有服务。

Compose 文件(即 compose.yaml 文件)遵循 Compose 规范 中定义的规则,用于描述多容器应用程序。这是正式 Compose 规范 的 Docker Compose 实现。

应用程序的计算组件被定义为 服务。服务是一个抽象概念,通过在平台上运行一次或多次相同的容器镜像和配置来实现。

服务通过 网络相互通信。在 Compose 规范中,网络是一种平台能力抽象,用于在连接在一起的服务内的容器之间建立 IP 路由。

服务将持久化数据存储并共享到 中。规范将此类持久化数据描述为带有全局选项的高级文件系统挂载。

某些服务需要依赖于运行时或平台的配置数据。为此,规范定义了一个专用的 configs 概念。从服务容器的角度来看,configs 类似于卷,因为它们都是挂载到容器中的文件。但实际定义涉及不同的平台资源和服务,这些由该类型进行抽象。

A 密钥 是一种特定类型的配置数据,用于存储不应在无安全考虑的情况下暴露的敏感信息。密钥以挂载到容器中的文件形式提供给服务,但提供敏感数据的平台特定资源具有足够的特殊性,值得在 Compose 规范中作为一个独立的概念和定义存在。

注意

通过卷、配置和密钥,您可以在顶层进行简单声明,然后在服务级别添加更多特定于平台的信息。

项目是应用规范在平台上的独立部署实例。项目名称通过顶层 name 属性设置,用于将资源分组并与其他应用或使用不同参数安装的同一 Compose 规范应用隔离。如果您在平台上创建资源,则必须在资源名称前添加项目前缀,并设置标签 com.docker.compose.project

Compose 提供了一种设置自定义项目名称并覆盖该名称的方法,因此只需传递一个不同的名称,即可将同一个 compose.yaml 文件在不进行任何更改的情况下部署到同一基础设施上两次。

Compose 文件

Compose 文件的默认路径是位于工作目录中的 compose.yaml(首选)或 compose.yml。 为了兼容早期版本,Compose 也支持 docker-compose.yamldocker-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 端口以供外部使用。

Compose application example

示例应用程序由以下部分组成:

  • 2 个服务,由 Docker 镜像支持:webappdatabase
  • 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 命令会启动 frontendbackend 服务,创建所需的网络和卷,并将配置和密钥注入到前端服务中。

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

接下来是什么