跳至内容

Podman

简介

注意

本文档代表其扩展内容 此处找到的父文档。如果您需要快速入门指南,该父文档可能就足够了。

Podman (Pod Manager) 是一种与 OCI (Open Container Initiative) 兼容的容器和镜像管理工具。

Podman

  • 在没有守护进程的情况下工作(它可以作为 systemd 服务运行容器)
  • 允许您以非特权用户身份管理容器(无需 root 权限)
  • 包含在 Rocky Linux 存储库中,与 docker 不同

这使得 Podman 不仅是 docker 兼容的替代容器运行时,而且更强大。

安装 Podman

使用 dnf 实用程序安装 Podman

dnf install podman

您可以使用以下命令检索可用的 Podman 子命令列表

$ podman --help

Manage pods, containers and images

Usage:
  podman [options] [command]

Available Commands:
  attach      Attach to a running container
  auto-update Auto update containers according to their auto-update policy
...

以下是非详尽的常用子命令列表

子命令描述
build使用 Containerfiles 中的说明构建镜像
commit基于已更改的容器创建新镜像
container管理容器
cp在容器和本地文件系统之间复制文件/文件夹
create创建但不会启动容器
exec在正在运行的容器中运行进程
image管理镜像
images列出本地存储中的镜像
info显示 Podman 系统信息
init初始化一个或多个容器
inspect显示由 ID 表示的对象的配置
kill使用特定信号终止一个或多个正在运行的容器
login登录容器注册表
logs获取一个或多个容器的日志
network管理网络
pause暂停一个或多个容器中的所有进程
ps列出容器
pull从注册表中拉取镜像
push将镜像推送到指定的目标
restart重新启动一个或多个容器
rm删除一个或多个容器
rmi从本地存储中删除一个或多个镜像
run在新容器中运行命令
start启动一个或多个容器
stats显示容器资源使用统计信息的实时流
stop停止一个或多个容器
system管理 Podman
top显示容器的正在运行的进程
unpause取消暂停一个或多个容器中的进程
volume管理卷

注意

Podman 由于其类似的 CLI 接口,可以运行几乎所有 Docker 命令。

如果您需要使用 compose 文件,请记住安装 podman-compose

dnf install podman-compose

添加容器

Nextcloud 自托管云平台为例运行

podman run -d -p 8080:80 nextcloud

您将收到一个提示,选择要从中下载的容器注册表。在我们的示例中,您将使用 docker.io/library/nextcloud:latest

下载 Nextcloud 镜像后,它将运行。

在您的 Web 浏览器中输入 ip_address:8080(假设您在 firewalld 中打开了端口)并设置 Nextcloud

Nextcloud in container

提示

要跟踪最后创建的容器的日志输出,请使用 podman logs -lf-l 指定使用最后创建的容器,而 -f 指定跟踪创建的日志。按 Ctrl+C 停止日志输出。

作为 systemd 服务运行容器

使用 quadlet

从 4.4 版开始,Podman 附带了 Quadlet - 一个 systemd 生成器。它可以用于为无根和有根 systemd 服务生成单元文件。

将有根服务的 Quadlet 文件放在

  • /etc/containers/systemd/
  • /usr/share/containers/systemd/

将无根文件放在以下任意位置

  • $XDG_CONFIG_HOME/containers/systemd/~/.config/containers/systemd/
  • /etc/containers/systemd/users/$(UID)
  • /etc/containers/systemd/users/

除了单个容器外,还支持 pod、镜像、网络、卷和 kube 文件。让我们关注我们的 Nextcloud 示例。创建一个新文件 ~/.config/containers/systemd/nextcloud.cotainer,内容如下

[Container]
Image=nextcloud
PublishPort=8080:80

许多其他选项可用。

要运行生成器并让 systemd 知道有一个新的服务运行,请运行

systemctl --user daemon-reload

要运行您的服务,请运行

systemctl --user start nextcloud.service

注意

如果您在有根服务的目录中创建了一个文件,请省略 --user 标志。

要让容器在系统启动或用户登录时自动运行,您可以在 nextcloud.container 文件中添加另一个部分

[Install]
WantedBy=default.target

由于生成的 service 文件被认为是临时的,因此不能通过 systemd 启用。为了缓解这种情况,生成器在生成期间手动应用安装。这实际上也启用了这些 service 文件。

支持其他文件类型:pod、卷、网络、镜像和 kube。例如,Pod 可用于对容器进行分组 - 生成的 systemd 服务及其依赖项(在容器之前创建 pod)由 systemd 自动管理。

使用 podman generate systemd

Podman 还提供了 generate systemd 子命令。使用此子命令生成 systemd service 文件。

警告

generate systemd 现已弃用,不会再添加新功能。建议使用 Quadlet。

现在让我们使用 Nextcloud 来完成它。运行

podman ps

您将获得一个正在运行的容器列表

04f7553f431a  docker.io/library/nextcloud:latest  apache2-foregroun...  5 minutes ago  Up 5 minutes  0.0.0.0:8080->80/tcp  compassionate_meninsky

如上所示,我们的容器名称为 compassionate_meninsky

要为 Nextcloud 容器创建 systemd 服务并在重新启动时启用它,请运行以下命令

podman generate systemd --name compassionate_meninsky > /usr/lib/systemd/system/nextcloud.service
systemctl enable nextcloud

用您的容器的分配名称替换 compassionate_meninsky

当您的系统重新启动时,Nextcloud 将在 Podman 中重新启动。

容器文件

容器文件是 Podman 用于创建容器镜像的文件。容器文件使用与 Dockerfile 相同的语法,因此您可以使用 Podman 构建容器镜像,就像使用 Docker 一样。

从容器文件创建 Web 服务器

您将基于 RockyLinux 9 创建一个 httpd 服务器。

创建一个专门用于镜像的文件夹

mkdir myrocky && cd myrocky

创建一个 index.html 文件,它将在我们的 Web 服务器中运行

echo "Welcome to Rocky" > index.html

创建一个包含以下内容的 Containerfile 文件

# Use the latest rockylinux image as a start
FROM rockylinux:9

# Make it uptodate
RUN dnf -y update
# Install and enable httpd
RUN dnf -y install httpd
RUN systemctl enable httpd
# Copy the local index.html file into our image
COPY index.html /var/www/html/

# Expose the port 80 to the outside
EXPOSE 80

# Start the services
CMD [ "/sbin/init" ]

您已准备好构建名为 myrockywebserver 的镜像

$ podman build -t myrockywebserver .

STEP 1/7: FROM rockylinux:9
Resolved "rockylinux" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/rockylinux:9...
Getting image source signatures
Copying blob 489e1be6ce56 skipped: already exists
Copying config b72d2d9150 done
Writing manifest to image destination
STEP 2/7: RUN dnf -y update
Rocky Linux 9 - BaseOS                          406 kB/s | 2.2 MB     00:05    
Rocky Linux 9 - AppStream                       9.9 MB/s | 7.4 MB     00:00    
Rocky Linux 9 - Extras                           35 kB/s |  14 kB     00:00    
Dependencies resolved.
================================================================================
 Package                   Arch      Version                 Repository    Size
================================================================================
Upgrading:
 basesystem                noarch    11-13.el9.0.1           baseos       6.4 k
 binutils                  x86_64    2.35.2-42.el9_3.1       baseos       4.5 M
...
Complete!
--> 2e8b93d30f31
STEP 3/7: RUN dnf -y install httpd
Last metadata expiration check: 0:00:34 ago on Wed Apr  3 07:29:56 2024.
Dependencies resolved.
================================================================================
 Package                Arch       Version                  Repository     Size
================================================================================
Installing:
 httpd                  x86_64     2.4.57-5.el9             appstream      46 k
...
Complete!
--> 71db5cabef1e
STEP 4/7: RUN systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service  /usr/lib/systemd/system/httpd.service.
--> 423d45a3cb2d
STEP 5/7: COPY index.html /var/www/html/
--> dfaf9236ebae
STEP 6/7: EXPOSE 80
--> 439bc5aee524
STEP 7/7: CMD [ "/sbin/init" ]
COMMIT myrockywebserver
--> 7fcf202d3c8d
Successfully tagged localhost/myrockywebserver:latest
7fcf202d3c8d059837cc4e7bc083a526966874f978cd4ab18690efb0f893d583

您可以运行 Podman 镜像并确认它已启动

$ podman run -d --name rockywebserver -p 8080:80 localhost/myrockywebserver
282c09eecf845c7d9390f6878f9340a802cc2e13d654da197d6c08111905f1bd

$ podman ps
CONTAINER ID  IMAGE                              COMMAND     CREATED         STATUS         PORTS                 NAMES
282c09eecf84  localhost/myrockywebserver:latest  /sbin/init  16 seconds ago  Up 16 seconds  0.0.0.0:8080->80/tcp  rockywebserver

您以守护进程模式 (-d) 启动了 Podman 镜像,并将其命名为 rockywebserver(选项 --name)。

您使用 -p 选项将端口 80(受保护)重定向到端口 8080。使用以下命令查看端口是否正在监听

ss -tuna | grep "*:8080"
tcp   LISTEN    0      4096                *:8080             *:*

验证 index.html 文件是否可访问

$ curl http://localhost:8080
Welcome to Rocky

恭喜!您现在可以停止并销毁正在运行的镜像,并提供您在创建时提供的名称

podman stop rockywebserver && podman rm rockywebserver

提示

您可以添加 --rm 开关,以在容器停止后自动删除容器。

如果您重新启动构建过程,podman 将在构建的每个步骤中使用缓存

$ podman build -t myrockywebserver .

STEP 1/7: FROM rockylinux:9
STEP 2/7: RUN dnf -y update
--> Using cache 2e8b93d30f3104d77827a888fdf1d6350d203af18e16ae528b9ca612b850f844
--> 2e8b93d30f31
STEP 3/7: RUN dnf -y install httpd
--> Using cache 71db5cabef1e033c0d7416bc341848fbf4dfcfa25cd43758a8b264ac0cfcf461
--> 71db5cabef1e
STEP 4/7: RUN systemctl enable httpd
--> Using cache 423d45a3cb2d9f5ef0af474e4f16721f4c84c1b80aa486925a3ae2b563ba3968
--> 423d45a3cb2d
STEP 5/7: COPY index.html /var/www/html/
--> Using cache dfaf9236ebaecf835ecb9049c657723bd9ec37190679dd3532e7d75c0ca80331
--> dfaf9236ebae
STEP 6/7: EXPOSE 80
--> Using cache 439bc5aee524338a416ae5080afbbea258a3c5e5cd910b2485559b4a908f81a3
--> 439bc5aee524
STEP 7/7: CMD [ "/sbin/init" ]
--> Using cache 7fcf202d3c8d059837cc4e7bc083a526966874f978cd4ab18690efb0f893d583
COMMIT myrockywebserver
--> 7fcf202d3c8d
Successfully tagged localhost/myrockywebserver:latest
7fcf202d3c8d059837cc4e7bc083a526966874f978cd4ab18690efb0f893d583

您可以使用 prune 子命令清除该缓存

podman system prune -a -f
选项描述
-a删除所有未使用的數據,不只是 Podman 外部的數據
-f不提示确认
--volumes修剪卷

Pods

Pod 是将容器分组在一起的一种方式。Pod 中的容器共享一些设置,例如挂载、资源分配或端口映射。

在 Podman 中,您可以使用 podman pod 子命令管理 Pod,类似于许多 Podman 命令,用于控制容器

命令描述
clone创建现有 Pod 的副本。
create创建一个新的 Pod。
exists检查 Pod 是否存在于本地存储中。
inspect显示描述 Pod 的信息。
kill杀死一个或多个 Pod 中每个容器的主进程。
logs显示一个或多个容器的 Pod 日志。
pause暂停一个或多个 Pod。
prune删除所有已停止的 Pod 及其容器。
ps打印有关 Pod 的信息。
restart重新启动一个或多个 Pod。
rm删除一个或多个已停止的 Pod 和容器。
start启动一个或多个 Pod。
stats显示一个或多个 Pod 中容器的资源使用情况统计信息的实时流。
stop停止一个或多个 Pod。
top显示 Pod 中容器的运行进程。
unpause取消暂停一个或多个 Pod。

分组到 Pod 中的容器可以通过使用 localhost 互相访问。例如,在使用专用数据库(如 Postgres)设置 Nextcloud 时,这很有用。Nextcloud 可以访问数据库,但数据库不需要从容器外部访问。

要创建一个包含 Nextcloud 和专用数据库的 Pod,请运行以下命令

# Create the pod with a port mapping
podman pod create --name nextcloud -p 8080:80

# Add a Nextcloud container to the pod – the port mapping must not be specified again!
podman create --pod nextcloud --name nextcloud-app nextcloud

# Add a Postgres database. This container has a postgres specific environment variable set.
podman create --pod nextcloud --name nextcloud-db -e POSTGRES_HOST_AUTH_METHOD=trust postgres

要运行新创建的 Pod,请运行

podman pod start nextcloud

您现在可以使用本地数据库设置 Nextcloud

Nextcloud setting up a database

作者:Neel Chauhan,Antoine Le Morvan

贡献者:Steven Spencer,Ganna Zhyrnova,Christian Steinert