配置工具链

鉴于不同的 Linux 发行版存在打包上的差异,这直接导致 Podman、Buildah 和 Skopeo 的默认配置并不一致。所以,在将这些工具链安装完成之后,我们还需对其配置作些调整。我们主要介绍 Registry 镜像仓库、非 root 模式、以及其它配置等内容。

配置 Registry 镜像仓库

Registry 镜像仓库是用来存储和分发容器镜像的服务。对 Podman、Buildah 和 Skopeo 来说,它们所使用的 Registry 镜像仓库是通过 /etc/containers/registries.conf 文件定义的。registries.conf 文件采用 TOML 文件格式。使用文本编辑器打开该文件,我们可以看到,除了注释(开头为 # 号的行)外,它主要包括下面 3 节:

  1. [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 镜像仓库顺序进行搜索。

  2. [registries.insecure]:不安全的 Registry 镜像仓库列表。要是你使用的 Registry 镜像仓库为 HTTP 协议,没有 SSL 证书,或者不需要进行身份验证,那么可以将其加到这个列表中。自架的私有 Registry 镜像仓库可能是这种情况,如 localhost:5000

  3. [registries.block]:屏蔽的 Registry 镜像仓库列表。仅支持 Docker,这个列表中的 Registry 镜像仓库将不允许 Pull 访问。

配置非 root 模式

比 Docker 更好的是,Podman、Buildah 和 Skopeo 都支持非 root 用户使用。因为这些工具的非 root 模式利用了 Linux 的 User Namespaces(用户命名空间)特性,故而需要先行配置。用户命名空间用于隔离宿主机和容器之间的用户 ID 和组 ID。比如,容器中的特权用户 root 可以映射到宿主机中的非特权用户。一个用户在用户命名空间中可用的用户 ID 和组 ID 是由 subuidsubgid 这两个文件决定的。

假设 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 个部分组成,中间使用 :(冒号)分隔。

  1. 第一个字段为用户名称或 UID,本例中为 xiaodong

  2. 第二个字段为从属用户 ID(subuid)或从属组 ID(subgid),在我们的例子中都为 10000

  3. 最后一个字段为从属用户 ID 数量(subuid)或从属组 ID 数量(subgid),此例中是 65536

综合来看,我们在此分配的从属用户 ID 和从属组 ID 从 10000 开始,到 75536(由 10000 + 65536 计算得到)结束。被分配的从属用户 ID 和从属组 ID 分别通过 newuidmapnewgidmap 这两个命令映射到用户命名空间。

其它配置

在 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

podman-info