本页内容
- 前提条件
- 安装 Podman
- 以非 root 用户运行 Podman
- 查找容器镜像
- 下载镜像
- 检查镜像
- 运行容器
- 查看容器日志
- 停止容器
- 使用自定义数据卷运行容器
- 登录到容器
- 运行与管理 Pod
- 结语
Podman 是一个 Linux 原生的工具,用于通过 Open Container Initiative(OCI)容器和容器镜像来部署应用。它支持多种容器镜像格式,包括 Docker 镜像和 OCI 容器镜像。此外,Podman 还支持管理 pod 以及容器组。
Podman 是一个无守护进程(daemon-less)的工具,以单一二进制命令行的方式运行,无需后台服务。它提供了与 Docker 类似的命令行,你可以使用诸如 'alias docker=podman' 这样的别名。
在本指南中,我们将展示如何在 AlmaLinux 9 服务器上安装并使用 Podman,以替代 Docker Engine。你将学习如何使用 Podman 管理容器应用的一些基础操作。完成本指南后,你将更好地掌握把 Podman 用作本地开发容器编排工具的方法。
前提条件
在开始本指南之前,你必须具备以下条件:
- 一台 AlmaLinux 9 服务器 —— 本示例使用主机名为 'AlmaLinux9' 的服务器。
- 一个具备 sudo/root 管理员权限的非 root 用户。
安装 Podman
Podman 是一个无守护进程、开源的容器编排工具,适用于快速开发。Podman 是 Linux 原生应用,提供了与 Docker 类似的命令行界面。
借助 Podman,你可以使用 OCI(Open Containers Initiative,开放容器倡议)容器和容器镜像来查找、运行、共享和部署应用。
在 AlmaLinux 上,Podman 默认在 AppStream 仓库中可用,你可以使用 DNF 包管理器来安装它。
运行以下 dnf 命令,在 AlmaLinux 服务器上安装 Podman。
sudo dnf install podman
出现提示时输入 y,然后按 ENTER。

由于 Podman 是无守护进程的,你无需启动任何守护进程即可直接运行它。
运行以下命令来检查 Podman 版本以及安装的详细信息。
podman version
以下是编写本教程时的当前 Podman 版本输出:

此外,你也可以使用以下命令来验证 Podman 安装的详细信息。
podman info
以非 root 用户运行 Podman
在本节中,你将为非 root 用户配置 Podman。你将创建一个新用户,并确保该非 root 用户能够使用 Podman 执行和运行容器。
运行以下命令创建一个名为 'alice' 的新用户并为其配置密码。出现提示时输入新密码,然后重复输入一次。
sudo useradd -m -s /bin/bash alice
sudo passwd alice
现在,将新用户 'alice' 添加到 'wheel' 组。这样该新用户便可以执行 'sudo' 并切换为 root。
sudo usermod -aG wheel alice
之后,运行以下命令为用户 'alice' 启用 lingering(持久登录)。这样即使用户 'alice' 已注销,也能让容器进程长时间运行。
sudo loginctl enable-linger alice
接下来,使用以下命令以新用户 'alice' 身份登录。
su - alice

运行以下 'podman' 命令,使用 'hello-world' 镜像运行一个新容器。
podman run hello-world
如果成功,你应该会得到类似如下的输出:

最后,运行以下 'podman' 命令来确认正在运行和已退出的容器列表。
podman ps -a
如果配置成功,你应该会看到基础镜像为 'hello-world'、状态为 'Exited' 的容器。

查找容器镜像
默认情况下,Podman 会从多个镜像仓库拉取容器镜像,例如 Redhat 镜像仓库、quay.io 以及 DockerHub。你可以在配置文件 '/etc/containers/registries.conf' 中添加更多容器镜像仓库。
本示例将使用 DockerHub 作为容器仓库,那么我们开始吧。
运行以下命令,查找包含 'httpd' 的容器镜像。
podman search httpd
以下是你将在终端上看到的输出:

你也可以使用 '--limit' 选项来限制输出,如下所示。
podman search httpd --limit 3
这将只显示每个容器镜像仓库中排名前三的容器镜像。

最后,你还可以使用 '--filter' 选项,如下所示。
podman search httpd --filter=is-official
这将只显示官方的容器镜像。

下载镜像
找到容器镜像后,下一步是从仓库下载容器镜像。
运行以下命令,下载标签为 'alpine' 的 'httpd' 镜像。
podman pull httpd:alpine
选择你想要使用的镜像仓库。本示例将使用 DockerHub。

选择源之后,下载过程便会开始。

下载完成后,运行以下命令查看 AlmaLinux 服务器上可用的镜像。
podman images
此时,如果成功,你应该会获得两个容器镜像:来自 quay.io 的 'hello-world' 镜像,以及来自 DockerHub 的 'httpd' 镜像。

检查镜像
检查镜像是一种获取容器启动细节信息的强大手段。在 Podman 和 Docker 中,你都可以使用 'inspect' 选项来检查镜像。
运行以下命令,获取 'httpd:alpine' 镜像的详细信息。
podman inspect docker.io/library/httpd:alpine
这将显示镜像的详细信息,例如创建日期、大小、默认工作目录、启动命令、暴露的端口等。

你还可以使用如下附加参数,指定要查看的具体部分。
podman inspect --format "size: {{.Size}}" docker.io/library/httpd:alpine
podman inspect --format "ports: {{.Config.ExposedPorts}}" docker.io/library/httpd:alpine
podman inspect --format "workdir: {{.Config.WorkingDir}}" docker.io/library/httpd:alpine
这将显示镜像的大小、默认暴露的端口以及默认工作目录。

运行容器
在本节中,你将学习如何使用 Podman 运行容器。
输入以下命令运行一个名为 'httpd' 的新容器,将宿主机上的 8080 端口暴露出来,并使用 'httpd:alpine' 镜像。此外,参数 '--rm' 会在容器停止后自动删除该容器。
podman run -it --rm -d -p 8080:80 --name httpd docker.io/library/httpd:alpine
如果成功,你应该会得到由随机字符串和数字组成的新容器 ID。
使用以下命令查看正在运行的容器。你应该会看到状态为 'Up'、在宿主机上使用 8080 端口的 'httpd' 容器。
podman ps

接下来,你可以使用以下 curl 命令检查 'httpd' 容器。请务必将示例中的 IP 地址替换为你的服务器 IP 地址。
curl http://192.168.5.20:8080/
如果成功,你应该会得到类似如下的输出:

此外,你还可以通过网页浏览器访问 'httpd' 容器。打开浏览器并访问服务器 IP 地址加上容器端口 8080(例如:http://192.168.5.20:8080/)。
如果成功,你应该会看到来自 'httpd' 容器的默认 index.html 页面,如下:

查看容器日志
在 'httpd' 容器已启动并运行的情况下,现在你将对容器的日志进行检查。了解这一点对调试你的应用很有帮助。
要显示 'httpd' 容器的全部日志,运行以下命令。
podman logs httpd
以下是 'httpd' 容器日志的一个示例。

接下来,你可以使用 '--tail' 参数来减少日志输出,如下所示。
podman logs --tail 20 httpd
在此示例中,参数 'tail 20' 将显示 'httpd' 容器日志的最新 20 行。
停止容器
现在,如果你想停止容器,只需运行 `podman stop` 即可。
运行以下命令停止 'httpd' 容器。
podman stop httpd
一旦 'httpd' 容器停止,运行以下命令查看系统上可用的容器列表。
podman ps
podman ps -a
'httpd' 容器在停止后会自动被删除。这是因为你运行容器时使用了参数 '--rm'。

使用自定义数据卷运行容器
在本示例中,你将使用自定义数据卷运行一个新容器。这会把宿主机上的本地目录挂载到容器中。
在用户 alice 的主目录中创建一个新 'data' 目录。然后使用 nano 编辑器在 'data' 目录中创建一个新文件 'index.html'。
mkdir -p ~/data/
nano ~/data/index.html
插入以下 HTML 脚本。
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Welcome to Container Nginx</title> </head> <body> <h2>Hello from httpd container - Managed with Podman</h2> </body> </html>
保存并关闭文件。
现在,执行以下命令运行一个名为 'httpd' 的新容器,并将 'data' 目录作为自定义数据卷挂载到容器内的 '/usr/local/apache2/htdocs' 目录。
podman run --privileged=true -it --rm -d -p 8080:80 --name httpd -v ~/data:/usr/local/apache2/htdocs docker.io/library/httpd:alpine
此外,该容器运行时还带有一个附加参数 '--privileged=true'。这仅用于测试,但容器仍会以用户 'alice' 而非 root 用户身份运行。可获取更多关于 Podman 上 privileged 标志的信息。
接下来,运行以下命令查看系统上正在运行的容器。
podman ps
如果成功,你应该会看到状态为 'Up'、在宿主机上暴露 8080 端口的新 'httpd' 容器。

运行以下 curl 命令来验证新的 'httpd' 容器。
curl http://192.168.5.21:8080/
你应该会得到刚才创建的 index.html 脚本的输出内容。

在浏览器中访问 http://192.168.5.21:8080/,你应该会看到如下的自定义页面:

登录到容器
在 'httpd' 容器运行期间,你可以使用 'podman exec' 命令通过 shell 访问容器。
使用以下命令登录到 'httpd' 容器。这将在 'httpd' 容器上执行 '/bin/sh' shell,并将其附加到当前会话。
podman exec -it httpd /bin/sh
登录后,你应位于 'WorkingDir' 目录。在本示例中,默认的 WorkingDir 是 '/usr/local/apache2' 目录。
现在在 'httpd' 容器上运行以下命令。检查当前用户、容器的本地 IP 地址以及容器的默认网关。
id
ip a
route -n
你得到的输出中 IP 地址和网关可能不同,但应与以下类似:

运行与管理 Pod
在 Podman 中,你可以创建并运行 Pod。Pod 是容器的封装,意味着多个容器可以运行在单个 Pod 上。如同在 Kubernetes 中一样,Pod 是运行你应用的最小实体。
借助 Podman,即使没有 Kubernetes,你也可以创建并运行 Pod。
运行以下命令创建一个名为 httpdTest 的新 Pod,使用 'httpd:alpine' 镜像,并在宿主机上暴露 9090 端口。
podman run -dt --pod new:httpdTest -p 9090:80 docker.io/library/httpd:alpine
如果成功,你应该会得到由随机字符串和数字组成的 Pod ID。
现在运行以下命令查看系统上正在运行的 Pod。
podman pod ls
你应该会看到状态为 'Running'、包含 2 个容器的 'httpdTest' Pod。

你现在可以像下面这样使用 Pod 的 'inspect' 选项。
podman pod inspect httpdTest
你应该会获得 httpdTest Pod 的详细信息。

你还可以使用以下命令,查看 Pod 中运行的容器数量以及各容器的名称。
podman pod inspect --format="containers: {{.NumContainers}}" httpdTest
podman pod inspect --format "{{.Containers}}" httpdTest
你将得到类似如下的输出:

最后,运行以下命令访问运行在宿主机 9090 端口上的 httpdTest Pod。如果成功,你应该会获取到运行在 httpdTest Pod 上的默认 index.html 页面。
curl http://192.168.5.21:9090/
结语
恭喜!你已在 AlmaLinux 9 上安装了 Podman,并学习了使用 Podman 管理镜像和容器的基础用法。此外,你还学习了如何使用 Podman 创建并运行 Pod。