用户命名空间已经来到Docker!

by estesp · October 13, 2015

好的,在如何实现和展示给用户的问题上,经过一路的拖延和很多细节的讨论,我很高兴的宣布:Docker容器用户命名空间的最初版本已经可用了!正如下面这条来自Arnaud的Tweet中所言,在Docker 1.9 发布时间表中,启用用户命名空间的功能已在试验版本可用,我们已经更加了解这个功能的边界和它是如何与Docker生态系统中的其他功能如何协作的。

Phase 1 @Docker support for user namespaces is now in experimental branch! Congratulations @estesp! 👏 https://t.co/a25LizygRV

—Arnaud Porterie (@icecrime) October 10, 2015

当然,兴奋之余,你的第一个问题肯定是,“用户命名空间到底是什么呢?”。用户命名空间是Linux内核中的一个可用的容器命名空间(最年轻的那个),类似于用来创建容器的关键命名空间——mount, uts, pid, and network。如果命名空间对你而言是一个全新的话题,那么Michael Crosby的文章 “Creating Containers”值得一读。如果想要了解Linux中用户命名空间的更多详尽细节,可以在LWN.net上Michael Kerrisk整理的“Namespaces in Operation, part 5”中找到。一旦你对命名空间有所了解,深入学习了一些用户命名空间的知识,你就会明白,用户命名空间最重要的功能之一就是可以让容器拥有看起来和宿主系统中不同的uidgid。特别的,进程(在我们的例子中,是容器中的进程)可以作为宿主系统中的一组映像被提供。当这个进程以为它是以uid 0(一般被认为是“root”)运行的时候,它在宿主系统中实际上可能是uid 1000,或者是uid 10000,甚至是uid 34934322。这完全由我们在用户命名空间中创建这个进程的时候提供的mappings决定。从安全方面来说,这是一个伟大的功能,因为这允许进程在容器中以root权限运行,但容器在宿主系统中却没有真正拥有root权限。

在Docker的实例中,我们已经提供了一个新的后台程序启动标志,来允许管理员提供一个用户名,或者一个可选的用户组(或者用户和组的数字ID),作为remapping user。Linux命名空间功能的创建者已经考虑到,通过提供名为下级范围的用户和组的数字ID,来区分使用/etx/subuid/etc/subgid文件的用户,Docker可以接着在用户下属范围内寻找 remapping user的范围。这个范围被用来创建程序创建过程中的映像,无论这些程序是通过docker run还是docker exex启动的。有关Docker是如何使用这些范围的更多完整文档,可以在用户命名空间试验文档中可以找到。

当然,用户(尤其是容器云操作员)下一步想要在每个容器而不是每个后台程序中指定某个映像。对公有云操作员来说,这将允许每个新增的租户(tenant)安全的拥有自己的uidgid范围,并且不会与其它租户的范围重叠。当然,我们提供了这个功能。然而,这里有一个关键功能的缺失,那就是在Linux系统中挂载文件系统同时“平移转换”每个文件系统的所有属性条目。如果没有这个功能,Docker就必须“不共享”现在通过各种写拷贝后台已经共享的文件系统中的内容。这意味着Docker中原本提供的磁盘空间节省功能的失效:容器间共享的文件系统层,比如ubuntu:14.04镜像的层。由于没有mount-with-uid-gid、shift-like功能,Docker不得不拷贝每个根文件系统,手动平移转换修改整个文件树的属权,来获取指定的容器在文件系统中运行所需的镜像的权限。在Linux社区已经有人在尝试从文件系统层上来实现,但这遥遥无期,因此,用户命名空间的“第二阶段”很难预测能否被正确执行。

已经开始使用用户命名空间的人们,请提供关于这个实验性功能的反馈,来让我们继续完善出一个稳定的版本。如果这一切听起来很有趣,但你不知道如何开始,那就阅读用户命名空间的文档,然后从https://experimental.docker.com/获取一个试验构建来尝试吧!

重要笔记:由于将映像提供的Docker的层数据在本地缓存中的内容,一旦使用了带有用户命名空间的实验版本,镜像根目录(默认是/var/lib/docker)就会多出一个间接附加的重映像的根uid和gid。例如,如果提供给--userns-remap标志的remapping user,有从10000开始的用户和组的ID,那么所有运行映像设置的镜像和容器的根目录将存放在/var/lib/docker/10000.10000中。如果你使用不提供用户命名空间重映射的实验版本,
如果你使用的是没有用户命名空间的实验版本,现有内容将会被转移到/var/lib/docker/0.0来与重映像的内容相区分。如果需要返回到没有用户命名空间的Docker版本,最简单的方法是终止现有的试验后台进程,将/var/lib/docker/0.0中的内容移回到/var/lib/docker中,最后重启没有用户命名空间的Docker二进制程序文件。

期待你们的来信,等待用户命名空间已久的用户们!

转载请注明出处和原文出处

需要译稿请联系QQ:545870054
或者邮件:fan_xq@live.com

发表评论

电子邮件地址不会被公开。 必填项已用*标注