Compose 的工作原理

Docker Compose 依赖于 YAML 配置文件,通常名为compose.yaml.

该文件遵循Compose 规范提供的有关如何定义多容器应用程序的compose.yaml规则 。这是正式Compose 规范的 Docker Compose 实现 。

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

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

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

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

秘密 是敏感数据的一种特定配置数据,如果没有安全考虑,不应公开这些数据秘密以文件安装到其容器中的方式提供给服务,但提供敏感数据的特定于平台的资源足够具体,值得在 Compose 规范中采用独特的概念和定义。

笔记

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

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

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

然后,您可以通过Compose CLI与 Compose 应用程序进行交互 。诸如此类的命令docker compose up用于启动应用程序,同时docker compose down停止和删除容器。

撰写文件

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

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

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

如果您想重用其他 Compose 文件,或者将应用程序模型的某些部分分解为单独的 Compose 文件,您还可以使用 include.如果您的 Compose 应用程序依赖于由不同团队管理的另一个应用程序,或者需要与其他人共享,这非常有用。

说明性示例

以下示例说明了上面概述的 Compose 概念。该示例是非规范的。

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

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

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

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

编写应用程序示例

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

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

下一步是什么