Podman Compose 初学者指南

如果您一直在寻找 Docker 的替代品,Podman 可能会引起您的注意。

Podman 尚不具备的一件事是能够自动拉取适当的图像并根据组合文件启动容器。

有一个工具叫 podman-compose 那是替代品 docker-compose 工具,如您所料,它可以与 Podman 一起使用。 那么让我们看看如何使用这个工具。

什么是 podman-compose?

Docker 提供了在单个文件中指定所有必要详细信息的功能,例如容器名称、使用的图像、重启策略、卷、绑定安装、端口、标签等。 该文件通常称为 docker-compose.yml 文件。

Podman 缺少此功能。 因此我们需要使用 podman-compose 实现此功能的工具。

podman-compose 工具通过遵循 编写规范. 这是 Docker 遵循的相同规范,使其与现有的 docker-compose.yml 文件。 (可能存在一些迂腐的差异,例如在双引号之间包含值 ("), 等等,但这些可以通过查看错误轻松解决。)

安装 podman-compose 工具

由于 podman-compose 工具是一个相对较新的工具,您的 稳定/长期支持 Linux 发行版可能在第一方存储库中没有它。 尽管如此,让我们看看您有哪些选择以及如何安装它。

在 Ubuntu 上 22.10 (动力捻角羚) 然后 和 Debian 12 (书呆子) 然后,您可以使用 apt 包管理器是这样的:

sudo apt install podman-compose

的用户 Fedora 36 岁及以后 (包版本在 Fedora 35是 0.1.7-6.git) 可以使用 dnf 包管理器像这样安装 podman-compose:

sudo dnf install podman-compose

OpenSUSE 风滚草或 闰 15 然后 可以像这样安装 podman-compose 工具:

sudo zypper install podman-compose

如果你是一个自豪的 Arch Linux 用户,你不需要我的帮助。 但是下面仍然是安装命令;)

sudo pacman -Syu podman-compose

验证安装

确保 podman-compose 实用程序已安装或其路径包含在 PATH 环境变量,你可以这样检查:

podman-compose --version

这还应该列出您的 Podman 版本。

在我的 Fedora 36 台机器,我得到以下输出:

$ podman-compose --version
['podman', '--version', '']
using podman version: 4.3.1
podman-composer version  1.0.3
podman --version
podman version 4.3.1
exit code: 0

podman-compose 工具的基础知识

为了使本教程简短、亲切和易于理解,我不会介绍 compose 文件的结构。 但不要担心! 我们已经有了使用的快速指南 docker-compose.

为了方便起见,下面是我正在使用的撰写文件:

version: 3.7

services:


    reverse-proxy:
        image: docker.io/library/caddy:alpine
        container_name: caddy-vishwambhar
        command: caddy run --config /etc/caddy/Caddyfile
        restart: always
        ports:
            - "8080:80"
            - "8443:443"
        volumes:
            - /docker-volumes/caddy/Caddyfile:/etc/caddy/Caddyfile:Z
            - /docker-volumes/caddy/site:/srv:Z
            - /docker-volumes/caddy/caddy_data:/data:Z
            - /docker-volumes/caddy/caddy_config:/config:Z
            - /docker-volumes/caddy/ssl:/etc/ssl:Z
        labels:
            - io.containers.autoupdate=registry
            - pratham.container.category=proxy
        environment:
            - TZ=Asia/Kolkata
        depends_on:
            - gitea-web


    gitea-web:
        image: docker.io/gitea/gitea:latest
        container_name: gitea-govinda
        restart: always
        ports:
            - "8010:3000"
            - "8011:22"
        volumes:
            - /docker-volumes/gitea/web:/data:Z
            - /docker-volumes/gitea/ssh:/data/git/.ssh:Z
            - /etc/localtime:/etc/localtime:ro
        labels:
            - io.containers.autoupdate=registry
            - pratham.container.category=gitea
        environment:
            - RUN_MODE=prod
            - DISABLE_SSH=false
            - START_SSH_SERVER=true
            - SSH_PORT=22
            - SSH_LISTEN_PORT=22
            - ROOT_URL=https://git.mydomain.com
            - DOMAIN=git.mydomain.com
            - SSH_DOMAIN=git.mydomain.com
            - GITEA__database__DB_TYPE=postgres
            - GITEA__database__HOST=gitea-db:5432
            - GITEA__database__NAME=gitea
            - GITEA__database__USER=gitea
            - GITEA__database__PASSWD=/run/secrets/gitea_database_user_password
            - GITEA__service__DISABLE_REGISTRATION=true
            - TZ=Asia/Kolkata
        depends_on:
            - gitea-db
        secrets:
            - gitea_database_user_password


    gitea-db:
        image: docker.io/library/postgres:14-alpine
        container_name: gitea-chitragupta
        restart: always
        volumes:
            - /docker-volumes/gitea/database:/var/lib/postgresql/data:Z
        labels:
            - io.containers.autoupdate=registry
            - pratham.container.category=gitea
        environment:
            - POSTGRES_USER=gitea
            - POSTGRES_PASSWORD=/run/secrets/gitea_database_user_password
            - POSTGRES_DB=gitea
            - TZ=Asia/Kolkata
        secrets:
            - gitea_database_user_password


secrets:
    gitea_database_user_password:
        external: true

现在让我们从基本命令开始。

从撰写文件启动所有容器

使用 up 命令,我们可以创建并启动我们的组合文件中描述的服务(docker-compose.yml).

您可以简单地使用 up 命令并启动组合文件中列出的所有指定容器/服务,如下所示:

podman-compose up -d

运行上述命令将执行启动组合文件中列出的服务/容器所需的所有必要操作。 这包括如下步骤:

  • 拉取所有本地没有的镜像
  • 使用所有指定选项(端口、卷、机密、网络等)创建容器
  • 以特定顺序启动容器(由约束定义,如 depends_on)

如果你仔细看上面 example,您可能已经注意到一个新选项; 这 -d 选项。 此选项在后台启动容器,将其与当前 shell 分离。

一旦容器启动并运行,您可以通过运行 podman ps 命令:

$ podman ps
CONTAINER ID  IMAGE                                COMMAND               CREATED      STATUS          PORTS                                         NAMES
d7b7f91c03aa  docker.io/library/caddy:alpine       caddy run --confi...  4 hours ago  Up 4 hours ago  0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp   caddy-vishwambhar
1cfcc6efc0d0  docker.io/library/postgres:14-alpine postgres              4 hours ago  Up 4 hours ago                                                gitea-chitragupta
531be3df06d0  docker.io/gitea/gitea:latest         /bin/s6-svscan /e...  4 hours ago  Up 4 hours ago  0.0.0.0:8010->3000/tcp, 0.0.0.0:8011->22/tcp  gitea-govinda

从撰写文件停止所有容器

要停止撰写文件中指定的所有容器,请使用 down 命令。

podman-compose down

此外,您可以设置超时,以便容器可以安全地自行关闭。 这是使用以下任一选项完成的:

podman-compose down -t TIMEOUT_IN_SECONDS
podman-compose down --timeout TIMEOUT_IN_SECONDS

请注意, down 命令仅停止容器。 如果要删除容器,则需要手动完成。

启动、停止或特定服务

如果您正在遍历多个配置,如端口、卷、环境变量等,您可能正在使用 podman-compose uppodman-compose down 反复命令。

这将分别启动和停止所有服务。 意思是,如果您只有一项服务要启动/停止,您现在必须等待组合文件中列出的所有服务启动和关闭。 那可不行!

为了解决这个问题,我们可以使用 startstop 启动或停止个别服务的命令。 甚至还有一个 restart 命令。 这正是它所说的:)

下面是我开始的演示 gitea-db 服务,停止它然后重新启动它,只为你;)

$ podman-comopse start gitea-db

$ podman-compose stop gitea-db

$ podman-compose restart gitea-db

一次拉取所有必要的图像

假设您在撰写文件中指定了 10 种不同的服务。 如果等待一次对您来说没问题,但当您出于某种原因想要启动容器时却不行呢?

如果是这种情况,您所要做的就是使用 pull 像这样命令:

podman-compose pull

运行上述命令将拉取合成文件中指定的所有图像。

为您的撰写文件使用不同的名称

现在,我不知道你为什么要这样做。 您这样做有几个原因。 也许将撰写文件的名称保留为 docker-comopse.yml 触发你打字 docker 代替 podman.

无论是什么原因,您都可以使用以下任一标志来指定 comopse 文件的名称,如下所示:

podman-compose -f COMPOSE_FILE_NAME
podman-compose --file COMPOSE_FILE_NAME

假设我的撰写文件未命名 docker-compose.yml,而是被命名为 my-compose-file.yml. 要使用此撰写文件,我将运行以下命令:

podman-compose --file my-compose-file.yml

运行上面的命令将通知 podman-compose 撰写文件命名的工具 my-compose-file.yml 代替 docker-compose.yml.

结论

Podman 是一个神奇的容器编排工具; 并与 podman-compose 工具,使用您指定的详细信息创建多个容器变得更加容易! 我建议你试试 podman-compose 工具,让我们知道您的体验。