Compose 的工作原理

使用 Docker Compose,您可以使用一个 YAML 配置文件(称为 Compose 文件)来配置应用程序的服务,然后使用 Compose CLI 从您的配置中创建和启动所有服务。

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

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

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

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

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

秘密 是配置数据的一种特殊类型,用于敏感数据,这些数据在没有安全考虑的情况下不应该被公开。秘密作为挂载到容器中的文件提供给服务,但提供敏感数据的平台特定资源足够独特,因此在 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

下一步