跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / 使用 docker-compose 管理多容器应用程序

使用 docker-compose 管理多容器应用程序

出版日期:2024-12-12
解释

使用 docker-compose 可以定义和管理多容器应用程序。该工具通过易用的定义文件简化了此类应用程序堆栈的部署。

原因

本文介绍如何使用 docker-compose 创建多容器应用程序。

工作量

读完本文大约需要 20 分钟。

目标

您可以创建自己的基于容器的应用程序堆栈。

要求

用于构建应用程序的应用程序容器映像或关联的源文件。

1 用于管理多容器应用程序的工具

docker-compose 是负责创建多容器应用程序的工具。默认情况下,它使用 SLE Micro 中未随附的 Docker。要绕过 Docker 并改用 Podman,可以使用 podman-docker 脚本。这样,就无需将现有脚本更改为使用 Podman 而不是 Docker。以下各节提供了这些工具的详细说明。

1.1 关于 Podman

Podman 是 Pod Manager 工具的简称。它是一个无守护程序容器引擎,可让您使用容器和容器映像来运行和部署应用程序。Podman 提供了一个命令行界面来管理容器。

由于 Podman 没有守护程序,因此它提供了与 systemd 的集成。这样就可以通过 systemd 单元来控制容器。您可为现有容器创建这些单元,以及生成可启动容器的单元(如果系统中不存在这些单元)。Podman 可以在容器内部运行 systemd。

Podman 支持将容器整理为 Pod。Pod 共享相同的网络接口和资源。将一组容器组织成 Pod 的典型用例包括运行数据库的容器,以及带有访问数据库的客户端的容器。

1.1.1 安装 Podman

默认情况下,Podman 已包含在 SLE Micro 中。但是,如果缺少 Podman,您可以如下所述安装它:

  1. 运行以下命令:

    > sudo transactional-update pkg install podman*
  2. 重启动系统以引导进入新快照。

1.2 关于 podman-docker

podman-docker 是一个 bash 脚本,用于将您运行的任何 docker 命令更改为使用相同传递参数的相应 podman 命令。因此,您无需进行任何修改即可使用所有 Docker 脚本。

1.2.1 安装 podman-docker

默认情况下,podman-docker 未安装在 SLE Micro 中。要安装它,请执行以下步骤:

  1. 运行以下命令安装 podman-docker 软件包:

    transactional-update pkg install podman-docker
  2. 重引导系统以切换到最新快照。

1.3 关于 docker-compose

docker-compose 是用于管理多容器应用程序的工具。docker-compose 可让您在单个主机上创建多个隔离的环境,它还支持在环境之间使用变量。使用 docker-compose,可以做到只重新创建那些已更改的容器,而不必破坏整个多容器应用程序。

重要
重要:docker 已由 podman 命令取代

SLE Micro 中,每当您运行 docker-compose 时,就会使用 podman-docker 脚本来调用 Podman,因为 SLE Micro 中没有 Docker。

1.3.1 安装 docker-compose

如果您的系统上没有 docker-compose,可以按照以下步骤安装它:

  1. 运行以下命令:

    > sudo transactional-update pkg install docker-compose
  2. 安装完成后,重引导系统以引导进入新快照。

2 创建多容器应用程序

要创建多容器应用程序,请执行以下步骤:

  1. 创建配置文件 compose.yml。有关细节,请参见第 2.1 节 “创建 compose.yml

  2. 准备所需的目录结构。我们建议将 compose.yml 文件放在工作目录的最顶层。

  3. 如果需要,请专门为容器化应用程序使用的服务编写您自己的容器文件。例如,要部署某个 Go 应用程序,请为该应用程序创建一个包含所需配置和依赖项的容器文件。

    我们建议在工作目录中为每个服务创建一个子目录,并将专用于服务的文件放入其中。

  4. 部署多容器应用程序。有关细节,请参见第 2.2 节 “部署多容器应用程序”

2.1 创建 compose.yml

要创建多容器应用程序,需要创建 compose.yml 文件,并最好将其放置在工作目录中。您可以创建单个文件,也可以通过片段和扩展名来使用更精细的方法。还可以合并多个 docker-compose 文件来定义整个应用程序模型。

文件 compose.yml 定义应用程序。可在其中包含以下部分。

服务

服务是应用程序的计算组件。有关定义的细节,请参见第 2.1.1 节 “服务定义”

网络

可以使用 network 语句来定义自定义网络,并将特定的服务指派到自定义网络。有关细节,请参见第 2.1.2 节 “网络定义”

由容器引擎管理的目录,服务在其中存储和共享数据。

环境变量

您可能还需要使用传递给服务的环境变量列表。有关细节,请参见环境变量参考信息

配置文件

必须在 configs 部分声明服务所需的所有配置文件。有关细节,请参见 configs 定义

2.1.1 服务定义

定义服务时,需要指定所要使用的容器映像,或提供用于构建服务的源文件。

要从映像创建服务容器,请使用 image 语句:

services:
       db:
         image: database

Podman 将检查 compose.yml 文件中声明的映像名称是否已在本地容器存储中提供。如果未提供,Podman 将从一个已配置的注册表中提取映像。

要从源文件构建服务,请在同一目录中提供源文件并创建容器文件。然后在 compose.yml 文件中使用 build 语句:

      services:
        db: 
          build: PATH_TO_SOURCE_FILES

如果某个特定服务必须在另一个服务之后启动,您可以使用 depends_on 语句:

      services:
       db:
         image: database
         depends_on:
          system:
            condition: SERVICE_CONDITION

SERVICE_CONDITION 可以是 service_startedservice_healthyservice_completed_successfully

有关 services 定义的详细信息,请参见 services 规范

2.1.2 网络定义

默认情况下,docker-compose 会创建默认网络,应用程序堆栈中的每个容器将包含在该网络中。不必在 compose.yml 文件中声明默认网络,因为 docker-compose 会自动创建默认网络。

您还可以定义自定义网络,并将特定服务指派到其中。例如,要创建 network1network2 这两个网络,请添加以下代码段:

networks:
  network1:
    # Use a custom driver
    driver: custom-driver-1
  network2:
    # Use a custom driver and name the network
    driver: custom-driver-2
    name: custom_network

也可以使用现有网络。在这种情况下,请将网络标记为外部网络:

networks:
  network1:
    name: network1
    external: true

有关完整的 networks 规范,请参见 networks 规范

2.1.3 compose.yml 示例

以下 compose.yml 示例定义一个使用 Prometheus 监控系统和 Grafana 分析系统的应用程序堆栈。

services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
    ports:
      - 9090:9090
    restart: unless-stopped
    volumes:
      - ./prometheus:/etc/prometheus
      - prom_data:/prometheus
  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - 3000:3000
    restart: unless-stopped
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=grafana
    volumes:
      - ./grafana:/etc/grafana/provisioning/datasources
volumes:
  prom_data:

此示例中的项目结构必须如下所示:

.
├── compose.yaml
├── grafana
│   └── datasource.yml
├── prometheus
│   └── prometheus.yml
└── README.md

2.2 部署多容器应用程序

创建正确的目录结构和 compose.yml 文件后,便可以部署多容器应用程序:

  1. 校验您要运行的容器是否尚不存在:

    > podman ps --all

    如果需要,请去除特定的容器:

    > podman rm -fCONTAINER_ID
  2. 通过从 compose.yml 所在的目录运行以下命令来启动多容器应用程序:

    > docker compose up -d

    docker-compose 将为多容器应用程序创建单独的网络。

  3. 可以通过列出正在运行的容器,来校验容器是否正在运行,以及端口是否已映射:

    > podman ps

3 管理多容器应用程序

创建多容器应用程序后,可以使用 docker-compose 命令执行管理操作。命令语法如下:

> docker compose[OPTIONS]COMMAND

从您要管理的多容器应用程序的 compose.yml 文件所在的同一目录运行该命令。或者,使用 -f, --file 选项提供 compose.yml 文件的路径。例如,要退出并去除多容器应用程序,请运行以下命令:

> docker compose -f ./test/compose.yml down

其他有用命令:

images

列出多容器应用程序中的容器使用的所有映像。

> docker compose images
pause

暂停所有容器。

> docker compose pause[SERVICE]
ps

列出多容器应用程序中的容器。

> docker compose ps
rm

去除已停止的容器。

> docker compose rm
start/stop

启动或停止容器。

> docker compose stop[SERVICE]

要显示完整的选项和命令列表,请运行:

> docker-compose --help