OCI|再见Docker!使用Podman、Skopeo和Buildah下一代容器新架构


OCI|再见Docker!使用Podman、Skopeo和Buildah下一代容器新架构文章插图
缘起:很多人可能遇到过开机重启时 , 由于Docker守护程序在占用多核CPU使用100%C使用的情况 , 导致所有容器都无法启动 , 服务都不能用的情况 。 很悲催的是这事儿虫虫也遇到了 , 之前文章中虫虫介绍过利用Docker重构WP博客的新架构 。 由于VPS机器不是很稳定 , 时常会重启 , 重启时候就会遇到这个事情 , VPS负载很高 , 容器都没有起来 , 网站就无法访问了 。 这时候只能杀掉所有容器并重启守护进程 , 才能恢复 。 经过了解该问题是由于Docker守护进程引起 , 而且Docker守护进程是以root特权权限启动的 , 是一个安全问题 , 那么有什么方法解决呢?
为什么Docker需要一个守护进程呢?
Podman , Skopeo和Buildah这三个工具都是符合OCI计划下的工具(github/containers) 。 主要是由RedHat推动的 , 他们配合可以完成Docker所有的功能 , 而且不需要守护程序或访问有root权限的组 , 更加安全可靠 , 是下一代容器容器工具 。
Podman
OCI|再见Docker!使用Podman、Skopeo和Buildah下一代容器新架构文章插图
Podman可以替换Docker中了大多数子命令(RUN , PUSH , PULL等) 。 Podman不需要守护进程 , 而是使用用户命名空间来模拟容器中的root , 无需连接到具有root权限的套接字保证容器的体系安全 。
Podman专注于维护和修改OCI镜像的所有命令和功能 , 例如拉动和标记 。 它还允许我们创建 , 运行和维护从这些图像创建的容器 。
BuildahBuildah用来构建OCI图像 。 虽然Podman也可以用户构建Docker镜像 , 但是构建速度超慢 , 并且默认情况下使用vfs存储驱动程序会耗尽大量磁盘空间 。buildah bud(使用Dockerfile构建)则会非常快 , 并使用覆盖存储驱动程序 。
OCI|再见Docker!使用Podman、Skopeo和Buildah下一代容器新架构文章插图
Buildah专注于构建OCI镜像 。Buildah的命令复制了Dockerfile中的所有命令 。 可以使用Dockerfiles构建镜像 , 并且不需要任何root权限 。Buildah的最终目标是提供更低级别的coreutils界面来构建图像 。 Buildah也支持非Dockerfiles构建镜像 , 可以允许将其他脚本语言集成到构建过程中 。Buildah遵循一个简单的fork-exec模型 , 不以守护进程运行 , 但它基于golang中的综合API , 可以存储到其他工具中 。
SkopeoSkopeo是一个工具 , 允许我们通过推 , 拉和复制镜像来处理Docker和OC镜像 。
OCI|再见Docker!使用Podman、Skopeo和Buildah下一代容器新架构文章插图
Podman和Buildah对比Buildah构建容器 , Podman运行容器 , Skopeo传输容器镜像 。 这些都是由Github容器组织维护的开源工具(github/containers) 。 这些工具都不需要运行守护进程 , 并且大多数情况下也不需要root访问权限 。
Podman和Buildah之间的一个主要区别是他们的容器概念 。Podman允许用户创建"传统容器" 。 虽然Buildah容器实际上只是为了允许将内容添加回容器图像而创建的 。 一种简单方法是buildah run命令模拟Dockerfile中的RUN命令 , 而podman run命令模拟功能中的docker run命令 。
简而言之 , Buildah是创建OCI图像的有效方式 , 而Podman允许我们使用熟悉的容器cli命令在生产环境中管理和维护这些图像和容器 。
容器迁移安装基本上各大发行版都提供了二进制安装包 ,使用系统包管理就可以安装:
Fedora, CentOS:sudo yum -y install podman
Arch & Manjaro Linux: sudo pacman -S podman
Ubuntu安装:
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
迁移步骤【OCI|再见Docker!使用Podman、Skopeo和Buildah下一代容器新架构】首先 , 用podman替换了cron和CI作业中的所有docker实例 。
完成后第一步后使用sysdig来捕获对docker的引用 , 看看是否还有其他东西在调用docker:
sysdig | grep -w docker
如果您对性能敏感 , 这可能会大大降低系统速度 。
现在就可以删除docker了:
sudo:yum remove docker
或者
apt remove -y docker-ce
清理配置文件:
删除/etc/apt/*或者/etc/yum.repos.d/*中指向Docker的源
删除/etc/docker/* , /etc/default/docker和/var/lib/ docker中的任何遗留文件
删除docker组:delgroup docker
总结使用Podman , Skopeo和Buildah的新一代容器架构后 , 可以解决由于docker守护程序导致的启动和安全问题 。 使用新架构后除了"没有守护进程"和"不需要sudo访问"之外 , 没有发现很多不同之处 。 构建的容器都位于用户目录下(~/.local/containers中)而不是全局的(在/var/lib/docker中) , 即面向用户而不是面向守护进程 。 与Docker相比 , podman pull会并行下载获取所有层 。