没有容器的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的主要好处

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

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

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

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

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

 

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