如果您一直在寻找 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 up
和 podman-compose down
反复命令。
这将分别启动和停止所有服务。 意思是,如果您只有一项服务要启动/停止,您现在必须等待组合文件中列出的所有服务启动和关闭。 那可不行!
为了解决这个问题,我们可以使用 start
和 stop
启动或停止个别服务的命令。 甚至还有一个 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
工具,让我们知道您的体验。