没有容器的Docker:pulldocker和CVFS介绍


我们觉得容器是个很棒的主意,而Docker拥有一个巨大的仓库,任何人都可以从Docker Hub免费下载有用的应用。我们希望帮助Docker应用运行于更多地方,这也是为什么我们发布了pulldocker以及一个新的高效又极简的虚拟文件系统驱动。
$> sudo pulldocker busybox -o mybb
$> ls
mybb
$> sudo chroot mybb /bin/busybox | head -n1
BusyBox v1.22.1 (2014-05-22 23:22:11 UTC) multi-call binary.

这里下载pulldocker

很多开发人员受限于那些仍然无法使用Docker的机器,且因为无法修改内核,或没有AUFS而VFS又占用太多空间而永远无法使用上。但是所有的Linux环境都有chroot。Docker曾被称为“开了外挂的chroot(chroot on steroids)”(更准确的说,容器是“开了外挂的chroot”,而Docker程序是使用容器的一种方式),因此我们让在任何chroot环境中使用Docker hub的docker镜像变得简单。

什么是chroot牢笼(jail)?Chroot在1970年代被加入Unix,拥有悠久的经过检验的历史。它非常简单。基本上,chroot只是修改了程序的根目录(ch- root),从而模拟成处在一个不同系统中。例如,当程序在/usr/lib中查找一个共享库,它查找的是chroot目录的/usr/lib子目录而不是根目录下的/usr/lib。工程师们已经在测试与开发、依赖控制、兼容性、恢复、权限分离和部署中使用chroot长达数十年。

简单的给予pulldocker一个镜像名称,它会把镜像解压到一个目录中(比如pulldocker busybox会解压到busybox目录)。然后你可以chroot进这个环境(你大概希望先装载一些东西)。看起来你像是在一个完全不同的系统里,你甚至可以无缝的嵌套一个不同的发行版(比如,RedHat在Ubuntu中)。你可以从你的Dockerfile中启动一个你想要的应用程序、启动其他程序来记录数据、运行电子狗等等。

在chroot中运行docker镜像会有什么损失?你无法得到Dockerfile中的全部配置,如要运行的程序和要打开的端口。你也会失去Docker后台程序及它的远程API。但你依然可以通过以不同用户运行程序获得程序隔离。你可以使用nice模拟容器的一些CPU限制。Chroot自身无法也永远不能安全的运行不可信代码,而某天Docker承诺提供一个全面的安全方案。无论如何,如今多数Docker都运行在可信可控的环境中。完整的Docker对于运行你找到的或制作的应用非常有用,但对于进行Docker应用提交的完整工作流程则不是这样。不过,你不需要容器(甚至不需要文件系统的内核支持!)就可获得多数Docker的主要好处

table.jpg


pulldocker无后台独立静态程序是从Docker自身源码编译而来,这里是用于合并到主线分支的pull请求。内置的VFS引擎是个很好的起点,但它使用了太多空间以至于不实用,因此我们创建了CVFS(压缩的VFS)。比如,对于一个简单的Ubuntu镜像,VFS使用1.2GB,因为它保存了每一层几乎整个镜像的多个版本。另一方面,AUFS只使用了200MB来表示每一层使用文件系统差异对比下来的相同数据,而CVFS使用了与AUFS相同的空间数量,即使你的系统内核不支持联合文件系统。
compression.png

我们是如何做到这个压缩程度的?我们在文件系统层上重用了inodes。在不修改内核情况下,最简单的办法是使用硬连接,这就是CVFS如今的做法。对于2.0版本,我们正在考虑在你的文件系统支持的情况下(如同VServer所做),自动为CVFS添加写时复制(copy-on-write)的支持(cp--reflink选项)。
aufs.png

vfs.png

cvfs.png

CVFS文件系统驱动对缓存镜像层进行优化压缩,如果你运行的仅仅是装载读写卷的不可变容器,如这里推荐的pulldocker提供了只读选项将chroot环境装载为只读,从而不占用额外空间。请随意使用多个不可变Docker应用chroot牢笼。

如果你需要在文件系统上进行读/写(但你可能冒丢失这些数据的风险?),则chroot牢笼必须是整个文件系统的一个完整副本,这将比完整的写时复制的文件系统驱动(如AUFS或Btrfs)使用更多空间。当然,如果你的内核支持这些文件系统,(也许在2.0版本中)chroot也将可以。
diskutilrw.png

CVFS针对那些需要相对高效的存储,但无法保证内核、现存文件系统或root权限的系统而设计。在每台机器上运行少量镜像或拥有超额硬盘空间情况下,它将是快速且最优的。实际上,在面对大量层时,AUFS(Docker的默认文件系统)将变得非常慢,因为每次文件访问可能需要访问每个层以便读取文件(读的复杂度是O(层))。用于提速的docker squash提议补丁已经发布,不过合并层将造成AUFS的硬盘空间优势不再。
readspeed.png

(最后,CVFS是个仅针对pulldocker使用而设计的文件系统驱动,要作为一个存储后端在Docker主程序中得到完整的支持,可能需要对Docker的graph驱动API进行一些改进。)

我们在Terminal.com工作,为各类制造人员,不论是经验丰富的后台工程师、顾问、数据科学家,或是专业消费者或爱好者,提供快速、强大又简单的软件工具。

我们已经使用Linux容器多年,自从公开启动已经有成千上万的用户使用了基于我们安全容器技术的云端高速虚拟机。可通过pulldocker在上面使用Docker镜像,同时因为你有root权限你可以安装任何其他工具。

我们信奉开源,你可以在Twitter上关注我们,因为接下来几个月,我们将发布很多更快速、强大又易于使用的工具来协助你更快的完成更多事情。
$> wget https://www.terminal.com/pulldocker.tgz -O pulldocker.tgz
$> sudo tar -xzf pulldocker.tgz -C /usr/bin/
$> sudo pulldocker busybox -o mybb
$> ls
mybb
$> sudo chroot mybb /bin/busybox | head -n1
BusyBox v1.22.1 (2014-05-22 23:22:11 UTC) multi-call binary.


原文:Docker without containers: Introducing pulldocker and CVFS(翻译:梁晓勇 审校:李颖杰)

1 个评论

源码在这里 https://github.com/docker/docker/pull/9585/files

这应该是一个特定的案例。还没有被上游社区接受,请自行解决兼容问题。

要回复文章请先登录注册