配置工具链
鉴于不同的 Linux 发行版存在打包上的差异,这直接导致 Podman、Buildah 和 Skopeo 的默认配置并不一致。所以,在将这些工具链安装完成之后,我们还需对其配置作些调整。我们主要介绍 Registry 镜像仓库、非 root 模式、以及其它配置等内容。
配置 Registry 镜像仓库
Registry 镜像仓库是用来存储和分发容器镜像的服务。对 Podman、Buildah 和 Skopeo 来说,它们所使用的 Registry 镜像仓库是通过 /etc/containers/registries.conf
文件定义的。registries.conf
文件采用 TOML 文件格式。使用文本编辑器打开该文件,我们可以看到,除了注释(开头为 #
号的行)外,它主要包括下面 3 节:
-
[registries.search]
:搜索的 Registry 镜像仓库列表。在 CentOS 和 Arch Linux 中,其下的内容为:registries = ['docker.io', 'registry.fedoraproject.org', 'quay.io', 'registry.access.redhat.com', 'registry.centos.org']
该配置说明我们可以使用 Docker、Quay、Fedora、RedHat、以及 CentOS 的 Registry 镜像仓库。但是,在 Ubuntu 上,这个配置却为空:
registries = []
因此,为了从 Registry 镜像仓库搜索容器镜像,我们需要添加一些 Registry 镜像仓库地址,比如:
registries = ['docker.io', 'quay.io']
当执行
podman search
时,它将按列表中的 Registry 镜像仓库顺序进行搜索。 -
[registries.insecure]
:不安全的 Registry 镜像仓库列表。要是你使用的 Registry 镜像仓库为 HTTP 协议,没有 SSL 证书,或者不需要进行身份验证,那么可以将其加到这个列表中。自架的私有 Registry 镜像仓库可能是这种情况,如localhost:5000
。 -
[registries.block]
:屏蔽的 Registry 镜像仓库列表。仅支持 Docker,这个列表中的 Registry 镜像仓库将不允许 Pull 访问。
配置非 root 模式
比 Docker 更好的是,Podman、Buildah 和 Skopeo 都支持非 root 用户使用。因为这些工具的非 root 模式利用了 Linux 的 User Namespaces(用户命名空间)特性,故而需要先行配置。用户命名空间用于隔离宿主机和容器之间的用户 ID 和组 ID。比如,容器中的特权用户 root 可以映射到宿主机中的非特权用户。一个用户在用户命名空间中可用的用户 ID 和组 ID 是由 subuid
和 subgid
这两个文件决定的。
假设 xiaodong
这个普通用户想要使用这些工具,我们将下列内容分别追加到 /etc/subuid
和 /etc/subgid
中:
root@codeland:~# echo xiaodong:10000:65536 >> /etc/subuid
root@codeland:~# echo xiaodong:10000:65536 >> /etc/subgid
subuid
为每个用户的从属用户 ID,而 subgid
则为每个用户的从属组 ID。这两个文件的内容格式是一样的。每行由 3 个部分组成,中间使用 :
(冒号)分隔。
-
第一个字段为用户名称或 UID,本例中为
xiaodong
。 -
第二个字段为从属用户 ID(subuid)或从属组 ID(subgid),在我们的例子中都为
10000
。 -
最后一个字段为从属用户 ID 数量(subuid)或从属组 ID 数量(subgid),此例中是
65536
。
综合来看,我们在此分配的从属用户 ID 和从属组 ID 从 10000
开始,到 75536
(由 10000 + 65536
计算得到)结束。被分配的从属用户 ID 和从属组 ID 分别通过 newuidmap
和 newgidmap
这两个命令映射到用户命名空间。
其它配置
在 CentOS 7.6 中,为了使用用户命名空间特性,我们还需进行如下配置:
xiaodong@centos:~# echo "user.max_user_namespaces=28633" > /etc/sysctl.d/userns.conf
xiaodong@centos:~# sysctl -p /etc/sysctl.d/userns.conf
否则,将会遇到如下错误信息:
user namespaces are not enabled in /proc/sys/user/max_user_namespaces
ERRO[0000] cannot re-exec process
另外,在 Arch Linux 上,我们需要执行以下配置:
xiaodong@arch:~# echo "kernel.unprivileged_userns_clone=1" > /etc/sysctl.d/userns.conf
xiaodong@arch:~# sysctl -p /etc/sysctl.d/userns.conf
否则,会碰到下列错误:
user namespaces are not enabled in /proc/sys/kernel/
unprivileged_userns_clone
ERRO[0000] cannot re-exec process
验证工具链
经过安装和配置,Podman、Buildah 和 Skopeo 这套工具链算是在我们的系统中安家了。要验证它们的功能是否正常,不妨让我们来运行一个容器看看效果:
xiaodong@codeland:~$ podman run hello-world
Trying to pull docker.io/hello-world:latest...
Getting image source signatures
Copying blob sha256:1b930d010525941c1d56ec53b9
7bd057a67ae1865eebf042686d2a2d18271ced
977 B / 977 B [===============================
=============================] 0s
Copying config sha256:fce289e99eb9bca977dae136
fbe2a82b6b7d4c372474c9235adc1741675f587e
1.47 KB / 1.47 KB [===========================
=============================] 0s
Writing manifest to image destination
Storing signatures
Hello from Docker!
This message shows that your installation appears
to be working correctly.
$
提示符表明我们通过普通用户(xiaodong
)运行容器。当从 Docker Registry 镜像仓库 Pull 完毕 hello-world
容器镜像后,Podman 立即运行了容器。输出信息“Hello from Docker!”则说明一切正常。
我们还可以执行其它的命令来获得更多的容器信息:
xiaodong@codeland:~$ podman ps -l
CONTAINER ID IMAGE
COMMAND CREATED STATUS
PORTS NAMES
61fc906ee66f docker.io/library/hello-world:latest
/hello 30 minutes ago Exited (0) 30 minutes ago
vibrant_chandrasekhar
此外,执行 podman info
命令能够了解有关工具和系统的其它有用信息,包括主机、仓库以及存储等等,如下图所示。
xiaodong@codeland:~$ podman info | less