本页内容

  • 前提条件
  • 安装 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。

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

由于 Podman 是无守护进程的,你无需启动任何守护进程即可直接运行它。

运行以下命令来检查 Podman 版本以及安装的详细信息。

podman version

以下是编写本教程时的当前 Podman 版本输出:

AlmaLinux 9 系统上 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

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

运行以下 'podman' 命令,使用 'hello-world' 镜像运行一个新容器。

podman run hello-world

如果成功,你应该会得到类似如下的输出:

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

最后,运行以下 'podman' 命令来确认正在运行和已退出的容器列表。

podman ps -a

如果配置成功,你应该会看到基础镜像为 'hello-world'、状态为 'Exited' 的容器。

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

查找容器镜像

默认情况下,Podman 会从多个镜像仓库拉取容器镜像,例如 Redhat 镜像仓库、quay.io 以及 DockerHub。你可以在配置文件 '/etc/containers/registries.conf' 中添加更多容器镜像仓库。

本示例将使用 DockerHub 作为容器仓库,那么我们开始吧。

运行以下命令,查找包含 'httpd' 的容器镜像。

podman search httpd

以下是你将在终端上看到的输出:

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

你也可以使用 '--limit' 选项来限制输出,如下所示。

podman search httpd --limit 3

这将只显示每个容器镜像仓库中排名前三的容器镜像。

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

最后,你还可以使用 '--filter' 选项,如下所示。

podman search httpd --filter=is-official

这将只显示官方的容器镜像。

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

下载镜像

找到容器镜像后,下一步是从仓库下载容器镜像。

运行以下命令,下载标签为 'alpine' 的 'httpd' 镜像。

podman pull httpd:alpine

选择你想要使用的镜像仓库。本示例将使用 DockerHub。

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

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

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

下载完成后,运行以下命令查看 AlmaLinux 服务器上可用的镜像。

podman images

此时,如果成功,你应该会获得两个容器镜像:来自 quay.io 的 'hello-world' 镜像,以及来自 DockerHub 的 'httpd' 镜像。

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

检查镜像

检查镜像是一种获取容器启动细节信息的强大手段。在 Podman 和 Docker 中,你都可以使用 'inspect' 选项来检查镜像。

运行以下命令,获取 'httpd:alpine' 镜像的详细信息。

podman inspect docker.io/library/httpd:alpine

这将显示镜像的详细信息,例如创建日期、大小、默认工作目录、启动命令、暴露的端口等。

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

你还可以使用如下附加参数,指定要查看的具体部分。

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

这将显示镜像的大小、默认暴露的端口以及默认工作目录。

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

运行容器

在本节中,你将学习如何使用 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

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

接下来,你可以使用以下 curl 命令检查 'httpd' 容器。请务必将示例中的 IP 地址替换为你的服务器 IP 地址。

curl http://192.168.5.20:8080/

如果成功,你应该会得到类似如下的输出:

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

此外,你还可以通过网页浏览器访问 'httpd' 容器。打开浏览器并访问服务器 IP 地址加上容器端口 8080(例如:http://192.168.5.20:8080/)。

如果成功,你应该会看到来自 'httpd' 容器的默认 index.html 页面,如下:

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

查看容器日志

在 'httpd' 容器已启动并运行的情况下,现在你将对容器的日志进行检查。了解这一点对调试你的应用很有帮助。

要显示 'httpd' 容器的全部日志,运行以下命令。

podman logs httpd

以下是 'httpd' 容器日志的一个示例。

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

接下来,你可以使用 '--tail' 参数来减少日志输出,如下所示。

podman logs --tail 20 httpd

在此示例中,参数 'tail 20' 将显示 'httpd' 容器日志的最新 20 行。

停止容器

现在,如果你想停止容器,只需运行 `podman stop` 即可。

运行以下命令停止 'httpd' 容器。

podman stop httpd

一旦 'httpd' 容器停止,运行以下命令查看系统上可用的容器列表。

podman ps
podman ps -a

'httpd' 容器在停止后会自动被删除。这是因为你运行容器时使用了参数 '--rm'。

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

使用自定义数据卷运行容器

在本示例中,你将使用自定义数据卷运行一个新容器。这会把宿主机上的本地目录挂载到容器中。

在用户 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' 容器。

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

运行以下 curl 命令来验证新的 'httpd' 容器。

curl http://192.168.5.21:8080/

你应该会得到刚才创建的 index.html 脚本的输出内容。

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

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

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

登录到容器

在 '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 地址和网关可能不同,但应与以下类似:

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

运行与管理 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。

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

你现在可以像下面这样使用 Pod 的 'inspect' 选项。

podman pod inspect httpdTest

你应该会获得 httpdTest Pod 的详细信息。

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

你还可以使用以下命令,查看 Pod 中运行的容器数量以及各容器的名称。

podman pod inspect --format="containers: {{.NumContainers}}" httpdTest
podman pod inspect --format "{{.Containers}}" httpdTest

你将得到类似如下的输出:

AlmaLinux 9 系统上 Podman 容器安装配置与入门教程

最后,运行以下命令访问运行在宿主机 9090 端口上的 httpdTest Pod。如果成功,你应该会获取到运行在 httpdTest Pod 上的默认 index.html 页面。

curl http://192.168.5.21:9090/

结语

恭喜!你已在 AlmaLinux 9 上安装了 Podman,并学习了使用 Podman 管理镜像和容器的基础用法。此外,你还学习了如何使用 Podman 创建并运行 Pod。