Podman、Skopeo和Buildah下一代容器代替Docker

缘起

在Docker实践中,很多人应该都遇到过开机重启时,由于Docker守护程序在占用多核CPU使用100%C使用的情况,此时所有容器都无法正常工作,所有服务都不能用。解决唯一方法只能杀掉所有容器并重启守护进程,才能恢复。经过了解该问题是由于Docker守护进程引起,而且Docker守护进程是以root特权权限启动的,是一个安全问题,那么有什么方法解决呢?本文介绍一下基于CRI 等标准(Docker新架构也符合CRI标准)的新一代容器工具PodmanSkoperoBuiddah套件。

OCI

为了防止容器被Docker一家垄断,巨头们(谷歌,Redhat、微软、IBM、Intel、思科)聚在一起决定要成立一个组织(OCI),大家一起商量指定了一套规范(CRI、CNI),大家一致统一只兼容符合这套规范的工具。Docker虽然心有不甘但是毕竟胳膊拧不过大腿,只能该架构兼容规范。

在该规范的指导下就有了本文的三个主人公,这三个工具都是符合OCI计划下的工具(https://github.com/containers)。他们主要是由RedHat推动,三者各司其职,配合完成Docker所有的功能和新扩展功能,并且对docker的问题进行了改良:包括不需要守护程序或访问有root权限的组;容器架构基于fork/exec模型创建容器,更加安全可靠;所以是更先进、高效和安全的下一代容器容器工具。

Podman

podman

Podman是该工具套件的核心,用来替换Docker中了大多数子命令(RUN,PUSH,PULL等)。Podman无需守护进程,使用用户命名空间来模拟容器中的root,无需连接到具有root权限的套接字保证容器的体系安全。

Podman专注于维护和修改OCI镜像的所有命令和功能,例如拉动和标记。它还允许我们创建,运行和维护从这些镜像创建的容器。

Buildah

Buildah用来构建OCI图像。虽然Podman也可以用户构建Docker镜像,但是构建速度超慢,并且默认情况下使用vfs存储驱动程序会耗尽大量磁盘空间。 buildah bud(使用Dockerfile构建)则会非常快,并使用覆盖存储驱动程序。

buildah

Buildah专注于构建OCI镜像。 Buildah的命令复制了Dockerfile中的所有命令。可以使用Dockerfiles构建镜像,并且不需要任何root权限。 Buildah的最终目标是提供更低级别的coreutils界面来构建图像。Buildah也支持非Dockerfiles构建镜像,可以允许将其他脚本语言集成到构建过程中。 Buildah遵循一个简单的fork-exec模型,不以守护进程运行,但它基于golang中的综合API,可以存储到其他工具中。

Skopeo

Skopeo是一个工具,允许我们通过推,拉和复制镜像来处理Docker和OC镜像。

skopeo

三个工具对比

Buildah构建容器,Podman运行容器,Skopeo传输容器镜像。这些都是由Github容器组织维护的开源工具(https://github.com/containers)。这些工具都不需要运行守护进程,并且大多数情况下也不需要root访问权限。

Podman和Buildah之间的一个主要区别是他们的容器概念。 Podman允许用户创建”传统容器”。虽然Buildah容器实际上只是为了允许将内容添加回容器图像而创建的。一种简单方法是buildah run命令模拟Dockerfile中的RUN命令,而podman run命令模拟功能中的docker run命令。

总之,Buildah是创建OCI镜像的有效方式,而Podman允许我们使用熟悉的容器cli命令在生产环境中管理和维护这些镜像和容器。

容器迁移

套件安装

各大Linux发行版都提供了二进制安装包, 可以使用发行版的系统包管理工具一键安装:

1
2
Fedora, CentOS:sudo yum -y install podman
Arch & Manjaro Linux: sudo pacman -S podman

Ubuntu不支持一键安装,需要先添加第三方私有ppa仓库:

1
2
3
4
5
sudo apt-get update -qq
sudo apt-get install -qq -y software-properties-common uidmap
sudo add-apt-repository -y ppa:projectatomic/ppa
sudo apt-get update -qq
sudo apt-get -qq -y install podman

实践迁移

安装了套件的三个工具后,就可以对docker实例进行迁移了。

替换cron或者CI作业(脚本)中的所有docker实例,把docker替换为podman,可以使用后面提到的别名的方式。

1、停止和删除所有的运行的docker。

为了确保没有有差错,可以使用sysdig来捕获系统中docker的引用,看看是否还有其他东西在调用docker。

2、删除docker

现在就可以删除docker了:

1
yum remove docker || apt remove -y docker-ce

3、环境清理

最后清理下docker文件,我们建个一目录docker备份目录,把以下目录mv到备份目录即可:

1
/etc/docker/*,/etc/default/docker和/var/lib/ docker中的任何遗留文件

删除docker组

1
delgroup docker

现在可以吧docker别名成podman来无缝使用了

1
alias docker = podman

总结

本文介绍了符合CIR标准的 cri-o 容器套件Podman,Skopeo和Buildah。该新一代容器套件架构基于*nix传统的fork-exec模型,解决了由于docker守护程序导致的启动和安全问题,提提高了容器的性能和安全。

来源:

  • zhuanlan.zhihu.com
-------------本文结束感谢您的阅读-------------