使用 docker-compose
管理多容器应用程序
- 解释
使用 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,您可以如下所述安装它:
运行以下命令:
>
sudo
transactional-update pkg install podman*重启动系统以引导进入新快照。
1.2 关于 podman-docker
#
podman-docker
是一个 bash 脚本,用于将您运行的任何 docker
命令更改为使用相同传递参数的相应 podman
命令。因此,您无需进行任何修改即可使用所有 Docker 脚本。
1.2.1 安装 podman-docker
#
默认情况下,podman-docker
未安装在 SLE Micro 中。要安装它,请执行以下步骤:
运行以下命令安装
podman-docker
软件包:transactional-update pkg install podman-docker
重引导系统以切换到最新快照。
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,可以按照以下步骤安装它:
运行以下命令:
>
sudo
transactional-update pkg install docker-compose安装完成后,重引导系统以引导进入新快照。
2 创建多容器应用程序 #
要创建多容器应用程序,请执行以下步骤:
创建配置文件
compose.yml
。有关细节,请参见第 2.1 节 “创建compose.yml
”。准备所需的目录结构。我们建议将
compose.yml
文件放在工作目录的最顶层。如果需要,请专门为容器化应用程序使用的服务编写您自己的容器文件。例如,要部署某个 Go 应用程序,请为该应用程序创建一个包含所需配置和依赖项的容器文件。
我们建议在工作目录中为每个服务创建一个子目录,并将专用于服务的文件放入其中。
部署多容器应用程序。有关细节,请参见第 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_started
、service_healthy
或 service_completed_successfully
。
有关 services
定义的详细信息,请参见 services
规范。
2.1.2 网络定义 #
默认情况下,docker-compose 会创建默认网络,应用程序堆栈中的每个容器将包含在该网络中。不必在 compose.yml
文件中声明默认网络,因为 docker-compose 会自动创建默认网络。
您还可以定义自定义网络,并将特定服务指派到其中。例如,要创建 network1
和 network2
这两个网络,请添加以下代码段:
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
文件后,便可以部署多容器应用程序:
校验您要运行的容器是否尚不存在:
>
podman ps --all如果需要,请去除特定的容器:
>
podman rm -fCONTAINER_ID通过从
compose.yml
所在的目录运行以下命令来启动多容器应用程序:>
docker compose up -ddocker-compose 将为多容器应用程序创建单独的网络。
可以通过列出正在运行的容器,来校验容器是否正在运行,以及端口是否已映射:
>
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
4 法律声明 #
版权所有 © 2006–2024 SUSE LLC 和贡献者。保留所有权利。
根据 GNU 自由文档许可证 (GNU Free Documentation License) 版本 1.2 或(根据您的选择)版本 1.3 中的条款,在此授予您复制、分发和/或修改本文档的权限;本版权声明和许可证附带不可变部分。许可版本 1.2 的副本包含在题为“GNU Free Documentation License”的部分。
有关 SUSE 商标,请参见 https://www.suse.com/company/legal/。所有其他第三方商标分别为相应所有者的财产。商标符号(®、™ 等)代表 SUSE 及其关联公司的商标。星号 (*) 代表第三方商标。
本指南力求涵盖所有细节,但这不能确保本指南准确无误。SUSE LLC 及其关联公司、作者和译者对于可能出现的错误或由此造成的后果皆不承担责任。