背景
目前,随着容器技术的快速发展,围绕着容出现了越来越多的技术。原本集所有功能为一体的Docker也进行了模块化,但是Docker将大多数的功能都集中到了Docker daemon,这里不利用系统发展的,系统耦合度高,在一些场景下,Docker不适合应用,所以Podman就诞生了。
Podman原来是CRI-O项目的一部分,后来被分离成了一个单独的项目libpod。容器化始于Docker,Docker的守护进程管理着容器的一切。但是随着OCI标准出台后,容器管理被分成了一个一个的部分,被模块化成一个个小工具,每个工具各司其职,而不是像Docker一样,守护进程管理着一切。图1为它们架构的对比。
图1 Docker vs podman
什么是Docker
与传统的虚拟机不同,Docker共享主机的内核,利用linux的namespace进行资源隔离,cgroups进行资源控制,使得应用程序像在一个个的集装箱中运行,而承载集装箱的就是docker守护进程。从图2中,我们可以看出容器和传统的虚拟机的对比,容器比虚拟机更轻量。
图2Docker的架构
Docker Client是Docker的客户端程序,用于将用户请求发送给Dockerd。Dockerd实际调用的是containerd的API接口,containerd是Dockerd和runc之间的一个中间交流组件,主要负责容器运行、镜像管理等。containerd向上为Dockerd提供了gRPC接口,使得Dockerd屏蔽下面的结构变化,确保原有接口向下兼容;向下,通过containerd-shim与runc结合创建及运行容器。值得一提的是,守护进程使用REST API,利用HTTP的客户端就能访问Docker的守护进程。
但是Docker也存在着一些问题:
1. Docker在单个进程上运行,可能会导致单点故障。
2. 所有子进程均归此守护进程所有。
3. 在任何时候,如果Docker守护程序失败,所有子进程都会失去其跟踪。
4. 并进入孤立状态。
5. 安全漏洞。
6. 对于Docker操作,所有步骤都需要由root执行。
什么是Podman
Podman是一个由 RedHat 公司推出的无守护程序的容器引擎,用于在Linux系统上开发,管理和运行OCI容器。容器可以以root用户或无root权限模式运行。无root权限运行容器,能够使得容器更加安全。
如图1所示,和Docker不一样的是,Podman分散了容器管理所需的所有组件,并将它们个性化为较小的组件,仅在必要时使用。
Podman使用buildah管理镜像,通过skopeo来和镜像仓库进行交互,使用容器运行时Runc来直接运行容器。所以Podman启动容器的速度相对快一些,不需要一个庞大臃肿的守护进程就能运行容器。并且使用起来和Docker没有太大的区别,甚至可以alias docker=podman,Podman几乎复制了Docker的所有命令,所以你可以很轻松的从Docker转移到Podman。
Podman、 Buildah 和 Skopeo都是OCI容器生态计划中的一部分,相关的生态软件都能在<u style="box-sizing: inherit;">https://github.com/containers</u>中找到。并且这些工具都是符合CRI标准的,基于 unix 传统的 fork-exec 模型,解决了由于 Docker 守护程序导致的启动和安全问题,提高了容器的性能和安全。
从RHEL8开始,已经移除了docker,并且使用Podman代替,虽然你依然可以从别处安装Docker,但是不是RHEL官方所推荐的。当然,Podman还可以管理pod,从其名就能看出。
Podman可以运行Rootless容器
由于Podman的模块化体系结构,因此不必以root用户身份运行容器。这是一个很大的优势,因为你可以与具有不同特权的其他用户一起运行容器,而不必冒有人可以访问容器服务并以root用户身份运行容器的风险,并且不会对服务器造成破坏。
Podman以非root用户身份运行时所执行的操作是在用户的主目录中创建一个目录,并将该用户拥有的图像和容器的所有信息存储在那里。因此,例如,如果你与非root用户一起制作Podman映像,它将仅显示该用户创建或下载的映像。
Podman的另一个优点是它能够使用使用命名空间的UID分隔,这在运行容器时提供了额外的隔离层。在安全性方面,Docker服务泄漏比获得root(sudo)特权更加危险。
当你获得管理员许可权(sudo)并在系统上执行某项操作时,它总是在系统审核日志中注册,因此总会有一条跟踪记录。但是,如果你访问Docker服务并从具有特权的容器中进行操作并摆脱该容器,那么几乎不可能知道你做了什么。它不会保存在任何日志中,也不会保存你的操作记录。这表明Podman是一种更安全的工具。
总结
本文主要介绍了Docker和Podman的区别,分析了Docker的缺点和Podman的优点。
使用Podman,Skopeo和Buildah的新一代容器架构后,可以解决由于docker守护程序导致的启动和安全问题。使用新架构后除了"没有守护进程"和"不需要sudo访问"之外,没有发现很多不同之处。构建的Rootless容器都位于用户目录下(~/.local/containers中)而不是全局的(在/var/lib/docker中),即面向用户而不是面向守护进程。
延伸阅读
什么是 OCI?
OCI (Open Container Initiative),是一个轻量级,开放的治理结构(项目)。在 Linux 基金会的支持下成立,致力于围绕容器格式和运行时创建开放的行业标准。
OCI 项目由 Docker、CoreOS 和容器行业中的其它领导者在 2015 年 6 月的时候启动,OCI 的技术委员会成员包括 Red Hat、Microsoft、Docker、Cruise、IBM、Google、Red Hat 和 SUSE 等。
什么是 CRI?
CRI(Container Runtime Interface)是 Kubernetes v1.5 引入的容器运行时接口,它将 Kubelet 与容器运行时解耦,将原来完全面向 Pod 级别的内部接口拆分成面向 Sandbox 和 Container 的 gRPC 接口,并将镜像管理和容器管理分离到不同的服务。