跳到主要内容

初识 Podman

Podman 这个名字对很多人并不算陌生,Podman 全称为 Pod Manager,是由 Red Hat 开发并维护的一个开源项目,用于管理容器和容器镜像。其名字中的 “Pod” 来自于 Kubernetes 的概念,意为一组共享同一个网络命名空间(即,它们可以在 localhost 上相互通信)的容器。而 “man” 则来源于 Unix 中常见的命令行工具后缀,如 system manager 的 systemctl。

Podman 与 Docker 的区别 #

简单而言,Podman 的出现是为了解决开发者在使用 Docker 的过程中遇到的各类痛点。它和 Docker 的简要对比如下:

优势 #

  • 更高效:不需要守护进程 在 Docker 中,所有的命令都会被发送到守护进程,由其来执行和管理容器。而 Podman 则是利用了 Linux 的容器运行时技术,比如 Cgroups 和 namespaces,因此能够直接由用户进程来管理容器,而无需通过守护进程。Podman 不需要运行一个中央守护进程。这意味着每个 Podman 命令是一个独立的进程,而这个进程在完成任务后就会立即结束。这使得 Podman 更稳定,且更不容易发生错误。
  • 更安全:无需 root 权限 由于 Podman 不需要使用 root 权限,它避免了 Docker 容器使用 root 用户的风险。Podman 使用用户命名空间来隔离每个容器,从而提供了额外的安全性。
  • 云原生更友好:与 Kubernetes 的集成更加紧密 它能直接生成 Kubernetes 兼容的 YAML 文件。Podman并没有内建的集群管理功能,如 Docker 的 Docker Swarm。但是,Podman可以和 Kubernetes 集成,使用 Kubernetes 进行集群管理。

劣势 #

  • 兼容性 许多工具和服务都是以 Docker 为基础开发的,如 Docker Compose 和 Docker Swarm。如果你依赖这些工具,那么切换到 Podman 可能会带来一些不便。
  • 社区支持 Docker 有着庞大的用户基础和社区支持,提供了大量的镜像和文档。Podman 尽管在迅速增长,但其用户基础和社区规模仍远小于 Docker。
  • 缺乏一些高级特性 Podman 尚不支持 Docker 的一些高级特性,如 Docker Service 命令。但是,随着 Podman 项目的发展,这些问题有望被解决。

Podman 安装 #

Podman 的安装非常简单,官方文档提供了非常详尽的步骤,此处就不在赘述,安装完成后,在你的 terminal 中运行

podman info

来检查安装是否成功

运行你的第一个 Podman 容器 #

运行 Podman 容器的步骤与 Docker 容器非常相似。首先,我们将尝试运行一个“Hello, World”容器来验证 Podman 的安装情况。你可以使用以下命令来运行容器:

podman run hello-world

这个命令告诉 Podman 去运行一个名为 hello-world 的镜像。如果本地不存在这个镜像,Podman 会从默认的镜像仓库(大部分情况下是 Docker Hub )下载。然后 Podman 会启动一个新的容器并运行 hello-world 镜像。你应该会看到 “!… Hello Podman World …!” 的输出,这表示容器已经成功运行。

相信细心的你已经注意到了,这和 Docker 的运行机制及其类似。是的,没错。

  • Podman 和 Docker 都兼容 OCI 规范。这意味着任何适用于 Docker 的容器和镜像都可以在 Podman 中使用。
  • Podman 可以导入 Dockerfile 并构建镜像。它也可以推送镜像到 Docker 镜像仓库。

这使得 Podman 在许多场景下成为 Docker 的一个优秀的替代品。

从 Docker 迁移到 Podman #

如果你已经熟悉 Docker,并且想要迁移到 Podman,你会发现这个过程相当简单,因为 Podman 设计的目标之一就是让 Docker 用户能够无缝迁移。下面是迁移的过程中你需要注意的地方:

  • 学习新的命令 虽然 Podman 的 CLI 设计得和 Docker CLI 非常相似,但是它仍然有一些独特的命令。你需要花一些时间来了解和学习这些新的命令。
  • 检查应用权限 你可能需要检查你的应用是否需要特殊的权限或系统能力。比如应用可能需要执行一些特定的系统调用,例如修改网络设置或操作硬件设备。或者应用需要执行一些改变用户或组的操作。如果是的话,你可能需要添加或修改 Podman 容器的安全上下文(Security Context),或者修改你的应用以降低它的权限需求。
  • 检查文件权限 在 Docker 中,由于容器是可以以 root 用户运行的,它们可以访问和修改宿主机上的所有文件(除非文件的权限被特别限制)。然而,在 Podman 中,这不再可能,所以你可能需要检查和调整你的文件权限,确保你的应用可以访问所需的文件。应用可能需要读取、写入或执行某些文件或目录。在 Podman 中,这些权限可能会受到 rootless 模式的限制,因此你可能需要调整你的文件系统权限。
  • 检查端口映射: 在 rootless 模式下,你不能映射低于 1024 的端口(这些端口通常只能由 root 用户使用)。因此,你可能需要将你的应用配置为使用 1024 或以上的端口。

Podman 与 Kubernetes 协同工作 #

Podman 不仅能以与 Docker 类似的方式运行容器,还与 Kubernetes 完美结合,提供更深层次的集成。

  • Podman 生成 Kubernetes 配置 Podman 能将运行的容器和 Pod 转化为 Kubernetes 配置(YAML 文件)。这使得在本地测试和调试的容器或 Pod 可以快速地部署到 Kubernetes 集群中,无需额外的工作来创建 Kubernetes 配置。这对于开发人员和运维人员都非常有用,因为他们可以在本地开发和测试,然后直接部署到远程环境。这个功能可以通过podman generate kube命令实现。这个命令可以生成描述 Pod 或容器的 YAML 文件,然后可以直接用于 Kubernetes。
  • Podman 和 Kubernetes 的 Pod 概念 Podman 的 Pod 概念和 Kubernetes 的 Pod 非常类似,都是由一个或多个容器组成的一个运行环境,这些容器共享相同的网络命名空间,可以相互通信。这意味着如果你在本地使用 Podman 创建和管理 Pods,那么在将它们部署到 Kubernetes 时,你会发现它们的行为和你期望的完全一样。
  • Rootless 模式与 Kubernetes Podman 的 rootless 模式为 Kubernetes 提供了一种更安全的容器运行方式。由于在 Kubernetes 中,每个 Pod 都运行在自己的服务账户下,Podman 的 rootless 模式可以提供更强的安全性,因为每个 Pod 都由非 root 用户运行。

总结 #

Podman 是一个非常强大的工具,它提供了一种安全、高效的容器运行方式。Podman 的设计旨在与 Docker 的命令行接口兼容,使得从 Docker 迁移到 Podman 变得相对容易。然而,这并不意味着这个过程没有任何挑战。在迁移过程中,你可能会遇到一些需要解决的问题,例如修改 Dockerfile 和 Compose 文件中的 Docker 特有语法,或者迁移在 Docker 中创建的数据和配置。

此外,Podman 的一些特性,如 rootless 模式和 cgroup v2 的支持,使它在某些方面优于 Docker。但是,这也可能会给迁移带来一些额外的复杂性。例如,你可能需要调整安全设置,或者重新配置应用权限,以便在 rootless 模式下运行。

总的来说,如果你的日常工作会经常需要使用到 Kubernetes 这类的容器技术,虽然从 Docker 迁移到 Podman 需要一些工作,但是随着时间的推移,你会发现这是一次值得的投资。通过使用 Podman,你可以充分利用最新的 Linux 容器技术,同时享受更高的安全性和效率。