Compose 的工作原理

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

Compose 文件或 `compose.yaml` 文件遵循Compose 规范中定义多容器应用程序的规则。这是 Compose 规范的 Docker Compose 实现。

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

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

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

有些服务需要依赖于运行时或平台的配置数据。为此,该规范定义了一个专门的配置概念。在容器内部,配置的行为类似于卷——它们以文件形式挂载。然而,配置在平台级别上的定义方式有所不同。

秘密是一种特定类型的配置数据,用于敏感数据,未经安全考虑不应暴露。秘密以文件形式挂载到容器中,可供服务使用,但提供敏感数据的平台特定资源足够特殊,值得在 Compose 规范中拥有独立的概​​念和定义。

注意

使用卷、配置和秘密,您可以在顶级进行简单声明,然后在服务级别添加更多平台特定信息。

项目是在平台上部署应用程序规范的单个实例。项目的名称,通过顶级 `name` 属性设置,用于将资源组合在一起,并将其与其他应用程序或具有不同参数的同一 Compose 规范应用程序的其他安装隔离开来。如果您正在平台上创建资源,则必须以项目为前缀命名资源,并设置标签 `com.docker.compose.project`。

Compose 提供了一种设置自定义项目名称和覆盖此名称的方法,这样同一个 `compose.yaml` 文件就可以在不更改的情况下,通过传递不同的名称,在相同的基础设施上部署两次。

Compose 文件

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 应用程序依赖于由不同团队管理的其他应用程序,或者需要与他人共享,这将非常有用。

命令行界面

Docker CLI 允许您通过 `docker compose` 命令及其子命令与 Docker Compose 应用程序进行交互。如果您正在使用 Docker Desktop,Docker Compose CLI 默认包含在内。

使用 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

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

  • 两个服务,由 Docker 镜像支持:`webapp` 和 `database`
  • 一个秘密(HTTPS 证书),注入到前端
  • 一个配置(HTTP),注入到前端
  • 一个持久卷,附加到后端
  • 两个网络
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` 命令启动 `frontend` 和 `backend` 服务,创建必要的网络和卷,并将配置和秘密注入到 `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

接下来做什么

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.