Compose 的工作原理

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

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

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

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

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

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

密钥是敏感数据的特定配置数据,在没有安全考虑的情况下不应公开。密钥作为挂载到容器中的文件提供给服务,但用于提供敏感数据的特定于平台的资源足够具体,值得在 Compose 规范中使用独特的概念和定义。

注意

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

项目是应用程序规范在平台上的单独部署。使用顶级 name 属性设置的项目名称用于分组 资源一起,并将它们与其他应用程序或具有不同参数的同一 Compose 指定的应用程序的其他安装隔离开来。如果要在平台上创建资源,则必须按 project 和 将 标签 .com.docker.compose.project

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

Compose 文件

Compose 文件的默认路径是 (preferred) 或放置在工作目录中的路径。 Compose 还支持早期版本的向后兼容性。 如果两个文件都存在,则 Compose 会优先使用规范的 .compose.yamlcompose.ymldocker-compose.yamldocker-compose.ymlcompose.yaml

您可以使用 Fragment扩展名来保持 Compose 文件的高效且易于维护。

可以将多个 Compose 文件合并在一起以定义应用程序模型。YAML 文件的组合是通过根据您设置的 Compose 文件顺序附加或覆盖 YAML 元素来实现的。 简单属性和映射被最高顺序的 Compose 文件覆盖,列表通过附加来合并。相对 路径将根据第一个 Compose 文件的父文件夹进行解析,只要免费文件为 merged 托管在其他文件夹中。由于某些 Compose 文件元素既可以表示为单个字符串,也可以表示为复杂对象,因此合并适用于 展开的形式。有关更多信息,请参阅使用多个 Compose 文件

如果您想重复使用其他 Compose 文件,或将应用程序模型的各个部分分解为单独的 Compose 文件,也可以使用 include。如果您的 Compose 应用程序依赖于由其他团队管理或需要与他人共享的其他应用程序,则此功能非常有用。

命令行界面

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

键盘命令

要启动文件中定义的所有服务,请执行以下操作:compose.yaml

$ docker compose up

要停止和删除正在运行的服务,请执行以下操作:

$ docker compose down 

如果要监控正在运行的容器的输出并调试问题,可以通过以下方式查看日志:

$ docker compose logs

要列出所有服务及其当前状态,请执行以下操作:

$ docker compose ps

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

说明示例

以下示例说明了上述 Compose 概念。这个例子是非规范的。

考虑将应用程序拆分为前端 Web 应用程序和后端服务。

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

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

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

Compose 应用程序示例

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

  • 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: {}

该命令启动 and 服务,创建必要的网络和卷,并将配置和密钥注入前端服务。docker compose upfrontendbackend

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

下一步