openSUSE 上的 Podman

2018年3月25日 | Valentin Rothberg | 无许可

对最新的容器技术感兴趣吗?

太好了,以下是 openSUSE 社区最近的工作进展。

许多用户对尝试 Docker 开源引擎的替代方案感兴趣,因此我们开始研究更大的社区能提供什么,事实上,选择还是很多的。在 Kubernetes 的上下文中,有 cri-containerd 和 CRI-O。这两个项目都有活跃的社区,最终目标是以比运行功能丰富但臃肿的 dockerd 更专业和更轻量级的方式为 Kubelet 服务。作为独立容器引擎的替代方案,例如 rkt 和 Podman。正如你所看到的,有很多可以讨论的,但在本文中,我想专注于 Podman。

CRI-O

Podman 简介

Podman,前身为 kpod,是一个相对较新的项目,于 2017 年中期推出。Podman 可以通过将其与 Docker 开源引擎的客户端进行比较来简单地描述。如果你熟悉 Docker 命令行界面 (CLI),那么使用 Podman 应该会很容易,因为 Podman 的 CLI 几乎是 Docker CLI 的完全复制。事实上,有传言说一些用户正在对其进行别名设置。

虽然与 Docker 开源引擎有一些相似之处,但 Podman 的架构却大不相同。Docker 开源引擎的架构遵循严格的客户端-服务器范例,这意味着传递给客户端的每个命令都会被转换为远程过程调用,最终传递给 dockerd 守护进程,而 dockerd 守护进程又与另一个守护进程 containerd 通信,containerd 负责容器的运行时和底层管理。

与客户端-服务器范例相反,Podman 采用更轻量级的方法,根本不需要任何重量级的守护进程,而只需要一个微小的层来处理监控任务,例如日志记录。事实上,所有容器进程都是 Podman 的直接后代。Podman 更传统的 fork/exec 模型减少了启动容器所需的步骤的复杂性。它可以像任何其他独立二进制文件一样使用,从而为一些有趣的用例打开了大门,例如将 Podman 直接集成到 systemd 单元文件中。这真是令人兴奋,不是吗?

openSUSE 上的 Podman

如果你正在使用 openSUSE 并想尝试 Podman,你无需自己构建它,只需通过 zypper install podman 安装软件包即可。它包含在 openSUSE Tumbleweed 的官方仓库中。如果你想在其他版本的 openSUSE 上尝试 Podman,请随时从 software.opensuse.org 安装它。

Podman 安装完成后,我们就可以开始了。正如我之前提到的,Podman 几乎是 Docker 开源引擎命令行界面的 1:1 复制。我认为这是一个明智的决定,因为 Docker 的 CLI 是事实上的标准;用户已经习惯了这种 CLI,并且不需要学习另一个工作流程来实现相同的结果。在接下来的内容中,我将介绍一些常用的命令,并解释如何使用 Podman,以及如何进行一些小的调整,使其使用起来更加方便。

拉取镜像

熟悉 Docker CLI 的人不会对通过 podman pull 拉取镜像感到惊讶。但是,Podman 默认情况下不使用官方 Docker 注册表来处理未限定的镜像,但我将演示如何解决这个问题。首先,我们可以始终使用完整的引用来拉取镜像,例如 podman pull docker.io/library/opensuse:42.3。但这有时可能会很烦人,甚至可能破坏现有的自动化,因为我们可能只想拉取 opensuse:42.3。但是,我们可以通过将“docker.io/library”添加到 /etc/containers/registries.conf 配置文件中的搜索注册表中来解决这个问题。通过此调整,Podman 在拉取镜像时将首先搜索指定的注册表命名空间,我们可以像使用 Docker 开源引擎一样使用它。搜索注册表是一个非常棒的功能,可以帮助用户解决自动化使用未限定引用或所需镜像驻留在注册表特定命名空间中的常见问题。

运行容器

再次说明,使用简单的 podman run --rm -it opensuse/tumbleweed sh 将运行一个 openSUSE Tumbleweed 镜像,给我们一个 shell,并在我们退出时最终删除容器,这不应该让人感到惊讶。最初,Podman 容器在 openSUSE 上的 DNS 解析不起作用,因为防火墙默认阻止网络桥接的 IP 转发,并且必须通过向 iptables 添加特定的转发规则手动启用。Podman 的上游社区已经知道这个问题,并且已经在 CNI 网络插件中努力解决根本原因。尽管如此,Podman 维护者还是欣然接受并实施了向 Podman 添加一个解决方法,使其默认情况下在 openSUSE 上可用,而无需手动添加 iptables 规则。由于每周的 Podman 版本发布以及 Podman 维护者的即时反馈,DNS 问题在两天内就为 openSUSE 用户解决了。感谢所有参与者使这次体验如此愉快!

挂载容器的 RootFS

虽然在撰写本文时,并非所有 Docker 命令都已实现(例如,容器重启),但 Podman 提供了一些有趣的补充。我特别兴奋的是能够通过 podman mount IDpodman unmount ID 分别挂载和卸载容器的根文件系统。这对于自动化场景来说,可以快速更改文件系统来说是一个非常好的特性。我们目前正在进行的一个场景是 openSUSE 镜像的无 zypper 和无 RPM 版本,其中可以通过挂载容器的 rootFS 并使用主机软件包管理器(即 zypper)来执行打包任务来安装软件包;类似于 dnf 的 –installroot 标志。结果将是更精简的 openSUSE 镜像版本,可用于执行专门的实用程序功能。

如果你对 Podman 感兴趣,请查看它并向我们和上游社区反馈你的体验。目前,我们正在评估将无根容器的概念(请参阅 https://rootlesscontaine.rs)扩展到 Podman 和相关工具和库的方法,这将使非特权用户能够构建、运行和修改容器,从而覆盖更多的用例。未来还有很多乐趣!

类别: 博客

标签

分享这篇文章