Compose 工作原理

使用 Docker Compose,你可以使用一个 YAML 配置文件(称为Compose 文件)来配置你的应用服务,然后使用Compose 命令行界面根据你的配置创建和启动所有服务。

Compose 文件(或 compose.yaml 文件)遵循Compose Specification 提供的规则来定义多容器应用。这是 Docker Compose 对正式Compose Specification的实现。

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

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

服务将持久数据存储和共享到中。Specification 将这种持久数据描述为具有全局选项的高级文件系统挂载。

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

一个secret 是一种特定类型的配置数据,用于不应在未考虑安全的情况下暴露的敏感数据。Secrets 以挂载到其容器中的文件的形式提供给服务,但用于提供敏感数据的特定平台资源足够特别,值得在 Compose specification 中拥有一个独立的概概念和定义。

注意

对于 volumes、configs 和 secrets,你可以在顶层进行简单声明,然后在服务级别添加更多平台特定信息。

项目是应用程序规范在平台上的单个部署。项目名称通过顶层name 属性设置,用于将资源分组并将其与其他应用或具有不同参数的相同 Compose 指定应用的安装隔离开来。如果你在平台上创建资源,必须以项目名作为资源名称前缀,并设置标签 com.docker.compose.project

Compose 提供了一种设置自定义项目名称并覆盖此名称的方法,这样同一个 compose.yaml 文件无需修改,只需通过传递不同的名称,即可在同一基础设施上部署两次。

Compose 文件

Compose 文件的默认路径是工作目录中的 compose.yaml(首选)或 compose.yml。Compose 还支持 docker-compose.yamldocker-compose.yml,以实现早期版本的向后兼容性。如果两个文件都存在,Compose 优先使用规范的 compose.yaml

你可以使用片段(fragments)扩展(extensions)来保持你的 Compose 文件高效且易于维护。

多个 Compose 文件可以合并在一起定义应用模型。YAML 文件组合通过根据你设置的 Compose 文件顺序追加或覆盖 YAML 元素来实现。简单属性和映射会被优先级最高的 Compose 文件覆盖,列表通过追加合并。当需要合并的补充文件托管在其他文件夹中时,相对路径是根据第一个 Compose 文件的父文件夹解析的。由于某些 Compose 文件元素可以表示为单个字符串或复杂对象,合并应用于其展开形式。更多信息,请参阅使用多个 Compose 文件

如果你想重用其他 Compose 文件,或将应用模型的一部分分解到单独的 Compose 文件中,你还可以使用include。当你的 Compose 应用依赖于另一个由不同团队管理的应用,或者需要与他人共享时,这会很有用。

命令行界面

Docker 命令行界面允许你通过 docker compose 命令及其子命令与你的 Docker Compose 应用交互。使用命令行界面,你可以轻松管理 compose.yaml 文件中定义的多容器应用的生命周期。命令行界面命令使你能够轻松启动、停止和配置你的应用。

关键命令

要启动 compose.yaml 文件中定义的所有服务,请使用

$ docker compose up

要停止并移除运行中的服务,请使用

$ docker compose down 

如果你想监控运行中容器的输出并调试问题,可以使用以下命令查看日志

$ docker compose logs

要列出所有服务及其当前状态,请使用

$ docker compose ps

有关所有 Compose 命令行界面命令的完整列表,请参阅参考文档

说明性示例

以下示例说明了上面概述的 Compose 概念。此示例为非规范性示例。

考虑一个分为前端 Web 应用和后端服务的应用。

前端在运行时使用由基础设施管理的 HTTP 配置文件进行配置,提供外部域名,并注入由平台安全 secret 存储注入的 HTTPS 服务器证书。

后端将数据存储在持久卷中。

两个服务在隔离的后端网络上相互通信,而前端也连接到前端网络并暴露端口 443 以供外部使用。

Compose application example

示例应用包含以下部分

  • 2 个服务,由 Docker 镜像支持:webappdatabase
  • 1 个 secret (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 服务,创建必要的网络和卷,并将配置和 secret 注入到 frontend 服务。

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

下一步

页面选项