Docker 1.10版本发布
【编者的话】 Docker 1 .10 于二月初发布了,这是容器社区最近的重大事件,除了修复很多bug和功能增强之外,Docker1.10还引入了几个我们一直期待的重大改进和特性。在本文中我将会着重阐述我个人认为最有用和最令人兴奋的特性。
Docker Compose对于网络和卷的支持
Docker Compse 1.6 是与Docker 1.10一起发布的,在Docker 1.9中引入了完全重新设计的网络和卷系统后,这一版中增加了对于将网络和卷作为顶级实体的支持。
最新版本的Docker Compose向后兼容老的文件格式,为了迁移到Docker Compose的Version 2文件格式,在顶部增加了 version:’2’
这一行,将所有已存在的服务定义移动到新的 service:
分段中,并且可选择性地为网络和卷创建 volumn:
和 network:
分段。
通过这些新增加的特性,用户可以在 docker-compose.yml
文件中定义更加复杂的网络和存储设置,在这些环境中开发应用程序,只需要使用Docker Compose和Docker Swarm就可以在持续集成、测试和最终的生产环境中采用相同的设置,这是非常神奇的!
在 docker-compose.yml
文件中一个小而美的语义上的改进就是用户可以为一个容器定义 镜像
名字和 构建
目录,并且保存一段时间,如果已经存在了,那么就不需要每次都重建了。
网络相关的甜点
在Docker 1.10版本中添加了更多与网络相关的特性,如下所示:
● 内部网络,可以用来创建限制内外流量的网络
● 容器可以分配自定义的IP地址
● 容器间的连接可以使用各种类型的网络,不仅仅是默认的桥接网络
● 默认使用内嵌的DNS服务,代替了早期使用的基于 /etc/host
文件的解决方案,因为DNS的扩展性更好。
Docker 1.10的新的安全特性
作为Docker 1.10发行版的一部分,几个关键的安全改进也被添加了进来。Seccomp模板(Linux系统调用过滤)、内容可寻址的镜像ID和User Namespace是最其中重要的几点。
Docker中的User Namespace
Linux 命名空间(UTS、PID、NET、MNT和IPC)是允许我们创建Linux容器的其中之一的 概念 ,这个概念允许我们在不同的上下文环境中用相同的名字调用不同的东西,就像编程语言的命名空间,User Namespace(简写为USER)是添加到Linux内核中的最新的容器命名空间。
在User Namespace引入到Docker之前,容器中的Root用户与宿主机系统的Root用户具有相同的UID,其它容器可能也是如此,这显然是一个安全问题。借助于User Namespace,容器提供了UID和GID的映射,这就允许容器中的进程认为自己以UID 0运行(通常是Root用户),而实际上它们是以UID 1234、42或者其它的一些UID运行的,这意味着这些进程从容器的角度而言具有Root访问权限,但是从宿主机系统角度而言不具备这个权限的。
黑客将会经历更加艰难的破解时间(也许是更加有趣)来再次打破容器的安全限制。
目前UID和GID的映射是在Docker守护进程级别指定的(使用flag —userns-remap
),然而,未来我们可以期望努力实现在每个容器上允许有不同的映射集,这样就可以在一个Docker主机上实现安全的多租户了。
Docker中的安全计算模式
安全计算模式或者简写为seccomp是Linux内核的沙盒机制,出现自2.6.12内核版本,所以这不是一个新概念。
Seccomp本质上允许用户过滤有效进程的系统调用,它可以显著降低攻击面,只使能应用程序/进程实际需要使用其功能的那些系统调用。你的每个PHP应用平均需要访问300个以上的有效系统调用吗?也许不用。
在Docker 1.10中,用户要么使用 完整的默认seccomp模板 以JSON文件来定义他们自己的配置并且使用参数 security-opt
传给容器,要么不用任何seccomp模板(不推荐)运行容器。
内容可寻址的IDs
每一个Docker镜像代表一个镜像层的堆栈,这些镜像层是镜像文件系统的快照,存在于对最初的Dockerfile文件 docker build
过程中的每一步命令执行之后,这些镜像层,要么是从Docker Registry拉取的,要么是本地构建的,都是只读的对象,在它们的顶层增加一个读写层就创建了一个容器。
在过去版本的Docker中,镜像层(以及容器)是通过一个随机的UUID来识别的,从Docker 1.10版本开始,镜像层是通过一个内容的哈希来识别的,这使得在对镜像拉取、推送、载入和保存之后的完整性校验更加容易和透明,因为没有两个不同的镜像层意外地具有相同的ID,反之亦然。
由早期版本的Docke构建的现有镜像不得不迁移,当升级到Docker 1.10版本后,Docker守护进程会自动将同一主机上的所有镜像作迁移,如果有很多镜像需要做哈希的话,这会持续几分钟。如果你不想等待那样长的时间,有一个离线迁移的脚本。
注意:在Docker 1.10中容器ID仍然是随机的UUID。
更多的更新
这一版本中还有更多的甜点。添加了命令 docker update
,该命令允许更新已运行容器的资源约束,在更改资源约束配置文件之后,不需要重启Docker守护进程。资源约束用于磁盘的I/O,下载/更新管理器也被重构允许更快的镜像拉取和并行推送,等等。
总结
Docker 1.10是一个非凡的发行版。一周前我已经迁移所有的主机到了新版本,没有遇到任何问题(就像我上次升级到1.9后)。我鼓励每个人都考虑升级。
原文链接:(翻译:胡震)