快速跳转

什么是 Podman?

复制 URL

Podman(全称 POD 管理器)是一款用于在 Linux® 系统上开发、管理和运行容器的开源工具。Podman 最初由红帽® 工程师联合开源社区一同开发,它可利用 lipod 库来管理整个容器生态系统。 

Podman 采用无守护进程的包容性架构,因此可以更安全、更简单地进行容器管理,再加上 BuildahSkopeo 等与之配套的工具和功能,开发人员能够按照自身需求来量身定制容器环境。 

容器集是一组在一起运行并共享相同资源的容器,与 Kubernetes 容器集类似。Podman 通过简单命令行接口(CLI)和 libpod 库来管理容器集,libpod 库提供用于管理容器、容器集、容器镜像和卷的 API。Podman 的 CLI 创建并支持开放容器计划(OCI)容器,这种容器旨在满足容器运行时和格式的业界标准,但其相辅相成的 Buildah 项目可以提供更加先进的构建功能。用户可以在不同的 Linux 发行版本上运行 Podman,如红帽企业 LinuxFedoraCentOsUbuntu。 

每个容器集都由一个基础架构容器和任意数量的普通容器构成。基础架构容器负责保障容器集正常运行并维护(用来将容器与主机隔离开的)用户命名空间。其他容器各自都有一个监控器,来跟踪自己的进程并提防死亡容器(不再正常有作用的容器,但由于其资源仍在被使用而无法从环境中删除)。

Podman 与其他容器引擎的区别在于它没有守护进程。守护进程是在系统后台运行的进程,可在无用户接口的情况下完成运行容器的繁重工作。我们可以把守护进程看作在用户和容器本身之间通信的中介。 

尽管守护进程有助于容器环境的管理,但它们也可能会带来安全漏洞。许多守护进程使用根特权来运行。在 Linux 系统中,根帐户作为具有管理员访问权限(同时无需进行管理员验证)的超级用户,可以读取文件、安装程序、编辑应用和执行其他操作。如此一来,对于企图控制您的容器并渗透主机系统的黑客而言,守护进程就是他们的理想攻击目标。 

Podman 剔除了守护进程,允许普通用户无需与由根帐户所有的守护进程交互就能运行容器,或者允许使用无根容器。通过无根形式,用户无需使用具有管理员特权的进程,就能创建、运行和管理容器,不仅使容器环境变得更易访问,又可降低安全性风险。此外,Podman 使用安全增强型 Linux (SELinux)标签来启动各个容器,提高了管理员控制向容器进程提供哪些资源和功能的掌控力。

用户可以从命令行调用 Podman,以便从存储库拉取容器并运行它们。Podman 调用配置好的容器运行时来创建运行的容器。不过,由于没有专门的守护进程,Podman 使用 systemd(一种用于 Linux 操作系统的系统和服务管理器)来进行更新并让容器在后台保持运行。通过将 systemd 和 Podman 集成,您可以为容器生成控制单元,并在自动启用 systemd 的前提下运行它们。

用户可以在系统上管理自有的存储库,也可通过 systemd 单元来控制自有容器的自动启动和管理。允许用户管理自己的资源并使容器以无根方式运行,可以阻止诸如使 /var/lib/containers 目录可被写入等不良做法,或防范可能会导致应用暴露于额外安全问题的其他系统管理做法。这样也可确保每一用户具有单独的容器和镜像集合,并可在同一主机上同步使用 Podman,而不会彼此干扰。用户完成自己的工作时,可将变更推送到共有的镜像仓库,将他们的镜像共享给其他人。

Podman 也可部署 RESTful API(REST API)来管理容器。REST 是表述性状态传递的英文缩写。REST API 是遵循 REST 架构规范的应用编程接口,支持与 RESTful Web 服务进行交互。借助 REST API,您可以从 cURL、Postman 和 Google 的 Advanced REST 客户端等许多平台调用 Podman。

Podman 是一种模块化容器引擎,因此必须与 Buildah 和 Skopeo 等工具搭配使用才能构建和移动容器。使用 Buildah 时,您可以从头开始构建容器,也可将某个镜像用作起点来构建。Skopeo 可在不同类型的存储系统之间移动容器镜像,允许您在不同镜像仓库(例如 docker.io、quay.io 和您的内部镜像仓库)之间以及本地系统上不同类型的存储之间复制镜像。这种模块式的容器化工具有助于生成灵活的轻量型环境,减小开销并隔离您实现目标所需的功能。工具的体量越小、模块化程度越高,演进发展的速度也越快,而且每一工具也能专注于单一用途。 

我们可以把 Podman、Buildah 和 Skopeo 比喻成一套特殊的瑞士军刀,它们彼此互补,几乎能满足所有容器用例的需求。Podman 就是这套刀中最大的一把。 

Podman 和 Buildah 默认使用 runC(OCI 运行时)来启动容器。您可以构建和运行镜像,也可通过 runC 运行 docker 格式的镜像。Buildah 由 Go 语言编写,可读取运行时规范,配置 Linux 内核,最终创建并启动容器进程。在更改一些配置后,您也可以将 Podman 与 crun 等其他工具搭配使用。

Docker 是支持创建和使用 Linux 容器的一种容器化技术。Podman 和 Docker 的主要区别在于 Podman 采用无守护进程架构。Podman 容器一直是无根的,而 Docker 最近才将无根模式添加到其守护进程配置中。Docker 是用于创建和管理容器的一体化工具,而 Podman 以及 Buildah 和 Skopeo 等相关工具则更擅长承担某些方面的容器化工作,让您能够根据自己在云原生应用中的需求来进行自定义。 

Podman 具有替代 Docker 的强大实力,但两者也可搭配使用。用户可以将 Docker 别名设置为 Podman(alias docker=podman)或反之,在这两者之间轻松切换。此外,一个叫做 podman-docker 的 rpm 可以将"docker"置入系统应用 PATH,从 Docker 轻松切换过来,在需要"docker"命令时对这些环境调用 Podman。Podman 的 CLI 与 Docker 容器引擎类似,熟悉其中之一的用户也能快速上手使用另一个。 

一些开发人员会一起使用 Podman 和 Docker,在开发阶段使用 Docker,然后在运行时环境中将程序转移到 Podman,享受其更好的安全性。 

Podman 非常适合不使用 Kubernetes 或 OpenShift 容器平台来运行容器的开发人员。CRI-O 是一个用于 Kubernetes 容器编排系统(例如红帽 OpenShift® 容器平台)的社区推动的开源容器引擎。

Podman 改变了容器格局,它不仅提供比肩领先容器引擎的高性能功能,而且具有如今许多开发团队迫切需要的灵活性、可访问性和高安全性。Podman 可以帮助您:

  • 管理容器镜像和完整的容器生命周期,包括运行、联网、检查和下线。
  • 为无根容器和容器集运行和隔离资源。
  • 支持 OCI 和 Docker 镜像,以及与 Docker 兼容的 CLI。
  • 打造一个无守护进程的环境,提高安全性并减少闲置资源消耗。 
  • 部署 REST API 来支持 Podman 的高级功能。
  • 借助 checkpoint/restore in userspace(CRIU),实施面向 Linux 容器的检查点/恢复功能。CRIU 可以冻结正在运行的容器,并将其内存内容和状态保存到磁盘,以便容器化工作负载能够更快地重新启动。
  • 自动更新容器。Podman 会检测更新的容器是否无法启动,并自动回滚到上一个工作版本。这可以将应用的可靠性提升到新的水平。 

红帽企业 Linux 订阅中包含了 Podman,因此您可以运行符合 OCI 要求的容器,这些容器是利用可信、可靠并享有支持的通用基础镜像(UBI)构建的。红帽企业 Linux 是在企业环境中运行 Linux 容器的标杆,它允许开发人员轻松地启动容器、管理部署并加快开发新应用。在开放混合云中基于红帽企业 Linux 构建可移植的应用和容器,您就能够始终保持敏捷,并随着技术发展快速达成您的转型目标。

红帽企业 Linux Web 控制台通过易于使用的 Web 界面简化系统的部署和日常管理。Podman 可作为一个 Web 控制台组件,帮助您管理容器和镜像。在 Web 控制台的控制面板中访问容器主机并监控系统负载,以此来监控容器占用的 CPU 和内存。借助 Web 控制台,您既可以简化常见任务,也可以简化复杂操作,从而精简容器管理。

此外,您还可以使用红帽 Ansible® 自动化平台,利用其 Ansible Playbook 自动化 Podman 的功能,如安装容器、部署容器以及执行通常比较耗费时间和资源的其他任务。 

在 Podman 和其他开放标准容器工具的加持下,红帽企业 Linux 成为了一个强大的容器主机,不仅能提供生产级的支持、稳定性和安全功能,也能为迈向 Kubernetes 和红帽 OpenShift 奠定良好的基础。

继续阅读

文章

容器与虚拟机

Linux 容器和虚拟机(VM)都是封装型计算环境,里面组合了各种 IT 组件并独立于系统的其余部分。

文章

什么是容器编排?

容器编排是指自动化容器的部署、管理、扩展和联网。

文章

什么是 Linux 容器?

Linux 容器是与系统隔离开的一系列进程,它从单独的镜像运行,并由该镜像提供支持进程所需的全部文件。