docker 与 podman 的故事:一个方兴未艾,一个异军突起

摘要:podman 虽然与 docker 有替代关系,但是在“弃用 docker”事件中,podman 并非是主角。Kubernetes 所进行的“弃用 docker”的主角是 CRI 的其他实现方式,而由 RedHat 推出的 podman 则更加前沿。在现实的应用中,docker 方兴未艾,podman 却已经异军突起。

docker 与 podman 的故事:一个方兴未艾,一个异军突起_第1张图片

1 podman 是什么?

podman(Pod Manager) 是一个由 RedHat 公司推出的容器管理工具,它的定位就是 docker 的替代品,在使用上与 docker 的体验类似。podman 源于 CRI-O 项目,可以直接访问 OCI 的实现(如 runC),流程比 docker 要短。

docker 与 podman 的故事:一个方兴未艾,一个异军突起_第2张图片

二者主要的区别在于,podman 是一个开源的产品;而 docker 已经是商业化的产品。

podman 的开源代码,由 RedHatOpenShift 项目维护。podman.io 上面的文档还不算很健全,作为普通开发者,将其当成 docker 去用,难度也不算很大。

  • https://podman.io/
  • https://github.com/containers/podman

虽然 RedHat 推行 podman 的方式,还有一些“象牙塔”、“学院派”,但由于 docker 自身的问题,从开源社区江湖地位的考虑,podman 有替代昔日 docker 地位的趋势,甚至可以说是大势所趋。

2 podman 和 Docker 的主要区别是什么?

dockers 在实现 CRI 的时候,它需要一个守护进程,其次需要以 root 运行,因此这也带来了安全隐患。

podman 不需要守护程序,也不需要 root 用户运行,从逻辑架构上,比 docker 更加合理。

docker 的运行体系中,需要多个 daemon 才能调用到 OCI 的实现 RunC

docker 与 podman 的故事:一个方兴未艾,一个异军突起_第3张图片

在容器管理的链路中,Docker Engine 的实现就是 dockerd daemon,它在 linux 中需要以 root 运行, dockerd 调用 containerd,containerd 调用 containerd-shim,然后才能调用 runC。顾名思义 shim 起的作用也就是“垫片”,避免父进程退出影响容器的运训。

podman 直接调用 OCI runtime(runC),通过 common 作为容器进程的管理工具,但不需要 dockerd 这种以 root 身份运行的守护进程。

podman 体系中,有个称之为 common 的守护进程,其运行路径通常是 /usr/libexec/podman/conmon,它是各个容器进程的父进程,每个容器各有一个,common 的父则通常是 1 号进程。podman 中的 common 其实相当于 docker 体系中的 containerd-shim

下图常用来描述 podmandocker 的区别。

docker 与 podman 的故事:一个方兴未艾,一个异军突起_第4张图片

图中所体现的事情是,podman 不需要守护进程,而 dorker 需要守护进程。在这个图的示意中,dorckercontainerd-shimpodmancommon 被归在 Container 一层。

3 podman 的使用与 docker 有什么区别?

podman 的定位也是与 docker 兼容,因此在使用上面尽量靠近 docker。在使用方面,可以分成两个方面来说,一是系统构建者的角度,二是使用者的角度。

在系统构建者方面,用 podman 的默认软件,与 docker 的区别不大,只是在进程模型、进程关系方面有所区别。如果习惯了 docker 几个关联进程的调试方法,在 podman 中则需要适应。可以通过 pstree 命令查看进程的树状结构。总体来看,podman 比 docker 要简单。由于 podmandocker 少了一层 daemon,因此重启的机制也就不同了。

在使用者方面,podmandocker 的命令基本兼容,都包括容器运行时(run/start/kill/ps/inspect),本地镜像(images/rmi/build)、镜像仓库(login/pull/push)等几个方面。因此 podman 的命令行工具与 docker 类似,比如构建镜像、启停容器等。甚至可以通过 alias docker=podman 可以进行替换。因此,即便使用了 podman,仍然可以使用 docker.io 作为镜像仓库,这也是兼容性最关键的部分。

下图表示 docker、podman 的二级命令,它们相当接近。

docker 与 podman 的故事:一个方兴未艾,一个异军突起_第5张图片

podman 相比 docker 也缺失了一些功能,比如不支持 windows,不支持 docker-compoese 编排工具。显然在 Kubernetes 或者 OpenShift 体系中,这些并不重要。

4 podman 相关的东西还有什么?

podmangithubContainers 项目的一部分,这里面还包括几个相关的项目,它们都是用 go 语言组成的。

docker 与 podman 的故事:一个方兴未艾,一个异军突起_第6张图片

下面是 podman、buildah、skopeo 三个软件的图标。

docker 与 podman 的故事:一个方兴未艾,一个异军突起_第7张图片

podman、buildah、skopeo 组成了一个完整的容器工具体系:

  • podman 项目对标的是 docker 命令的代替,官方说明是 A tool for managing OCI containers and pods
  • buildah 项目实现的是 Dockerfile 的脚本化执行,官方说明是 A tool that facilitates building OCI images
  • skopeo 项目负责处理镜像相关的工作,比如检查、复制、签名,官方说明是 Work with remote images registries - retrieving information, images, signing content

buildah 完成对镜像的操作,类似 docker build,也可以进行 push 等操作;skopeo 完成对镜像仓库的操作,包括 cp、inspect、delete 等操作。它们的功能都比较纯粹,它们都是对 podman 功能的补充。

Centos 8 中,已经不适用 docker 作为默认的容器化工具,替代品也就是使用 podman、buildah、skopeo

原文地址:

  • docker 与 podman 的故事:一个方兴未艾,一个异军突起
  • 作者:晓川,发表于 2020-12-10

你可能感兴趣的:(Docker,&,Podman,docker,容器,CRI,RunC,podman)