11 Podman 概述 #
Podman 是 Pod Manager 工具的简称。它是一个无守护程序的容器引擎,用于在 Linux 系统上开发、管理和运行 Open Container Initiative (OCI) 容器,可以直接取代 Docker。Podman 是 openSUSE Kubic(基于 openSUSE 构建的 Kubernetes 认证发行套件)中的默认容器运行时。您可以使用 Podman 通过 Dockerfile 和一系列与 Docker 开源引擎相同的命令来创建符合 OCI 标准的容器映像。例如,docker build
能够执行的任务也可以通过 podman build
命令来执行。换言之,Podman 可以直接替代 Docker 开源引擎。
从 Docker 开源引擎迁移到 Podman 不需要对既有的工作流程进行任何更改。您无需重构建映像,可以使用完全相同的命令来构建和管理映像,以及运行和控制容器。
Podman 与 Docker 开源引擎的差别体现在两个重要方面。
Podman 不使用守护程序,因此容器引擎将直接与映像注册表、容器和映像储存服务交互。由于 Podman 没有守护程序,因此它提供了与 systemd 的集成。这样就可以通过 systemd 单元来控制容器。您可为现有容器创建这些单元,以及生成可启动容器的单元(如果系统中不存在这些单元)。此外,Podman 可以在容器内部运行 systemd。
由于 Podman 依赖于多个名称空间(用于为 Linux 进程提供隔离机制),因此无需 root 特权就能创建和运行容器。这意味着 Podman 既可以在 root 模式下运行,也可以在非特权环境中运行。此外,非特权用户创建的容器在主机上无法获得高于容器创建者的特权。
11.1 Podman 安装 #
要安装 Podman,请运行 sudo zypper in podman
命令。然后运行 podman --version
检查 Podman 是否已成功安装。
要在没有 root 特权的情况下运行 Podman,必须将 subuids 和 subgids 指派给运行 Podman 的用户。如果 /etc/subuid
文件中没有项,请使用以下命令添加项:
>
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 USER
要启用更改,请重引导计算机或停止当前用户的会话。要执行后一种操作,请运行 loginctl list-sessions | grep $USER
并记下会话 ID。然后运行 loginctl kill-session 会话 ID
以终止会话。
以上命令会在主机上定义一系列本地 UID,分配给容器中的用户的 UID 将映射到这些 UID。请注意,为不同用户定义的范围不得重叠。同样重要的是,这些范围不能重复使用现有本地用户或组的 UID。默认情况下,在 SLES 15 中使用 useradd
命令添加用户会自动分配 subUID 和 subGID 范围。
在 SUSE Linux Enterprise Server 上以无 root 权限模式使用 Podman 运行容器可能会失败,因为容器需要拥有 SUSE Customer Center 身份凭证的读取访问权限。例如,使用 podman run -it --rm registry.suse.com/suse/sle15 bash
命令运行容器,然后执行 zypper ref
会出现以下错误消息:
Refreshing service 'container-suseconnect-zypp'. Problem retrieving the repository index file for service 'container-suseconnect-zypp': [container-suseconnect-zypp|file:/usr/lib/zypp/plugins/services/container-suseconnect-zypp] Warning: Skipping service 'container-suseconnect-zypp' because of the above error. Warning: There are no enabled repositories defined. Use 'zypper addrepo' or 'zypper modifyrepo' commands to add or enable repositories
要解决该问题,请在主机上运行以下命令为当前用户授予所需的访问权限:
>
sudo setfacl -m u:$USER:r /etc/zypp/credentials.d/*
注销然后重新登录以应用更改。
要为多个用户授予所需的访问权限,请使用 groupadd GROUPNAME
命令创建一个专用组。然后使用以下命令更改 /etc/zypp/credentials.d/
目录中的文件的组所有权和权限。
>
sudo chgrp GROUPNAME /etc/zypp/credentials.d/*>
sudo chmod g+r /etc/zypp/credentials.d/*
之后,您便可以通过将特定用户添加到这个创建的组来为其授予写入访问权限。
11.2 Podman 基本用法 #
由于 Podman 与 Docker 开源引擎兼容,因此它具有相同的命令和选项。例如,podman pull
命令可从注册表中提取容器映像,而 podman build
命令可用于构建映像。
与 Docker 开源引擎相比,Podman 的其中一项优势是可配置为搜索多个注册表。要使 Podman 首先搜索 SUSE 注册表并使用 Docker Hub 作为回退搜索源,请在 /etc/containers/registries.conf
文件中添加以下配置:
[registries.search] registries = ["registry.suse.com", "docker.io"]
与 Docker 开源引擎类似,Podman 能够以交互模式运行容器,使您可以检查和处理映像。要以交互模式运行 suse/sle15
,请使用以下命令:
>
podman run --rm -ti suse/sle15
11.2.1 使用 Podman 构建映像 #
Podman 可以基于 Dockerfile 构建映像。podman build
命令的行为与 docker build
相同,并且接受相同的选项。
Podman 的配套工具 Buildah 提供了另一种构建映像的方式。有关 Buildah 的更多信息,请参见第 12 章 “Buildah 概述”。