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.yamldocker-compose.yml以保持与早期版本的向后兼容性。 如果两个文件都存在,Compose优先选择规范的compose.yaml

你可以使用 fragmentsextensions 来保持你的 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

下一步是什么