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
提示
要跟踪最后创建的容器的日志输出,请使用 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
作者:Neel Chauhan,Antoine Le Morvan
贡献者:Steven Spencer,Ganna Zhyrnova,Christian Steinert