实验特性

很多软件在发布的时候都会分为开发板和稳定版,稳定版可以供生产环境使用,开发版是让 感兴趣的用户使用,体验新特性,并报告BUG以助于官方改进。现在Docker在提供稳定版的 同时,也提供了集成了很多新特性的开发版供下载使用。

正式版的安装方式是用 https://get.docker.com/上的脚本, 开发版的安装类似,只不过用的脚本不一样 : https://experimental.docker.com/,二者最终会 启用不一样的软件源。目前开发版的版本是:1.8.0-dev,如下图所示:

注意其中的Experimental字段为TRUE

下面我就先来看看开发版里的比较重要的更新,以便了解Docker后续的发展状况:

插件支持

在介绍插件之前,我们首先回顾一下Docker本身的架构发展。Docker从一开始就是REST API + JSON 的架构,这是整个 Docker生态体系能迅速壮大的原因之一。但就Docker Server端的后台 Engine 来说,仍然是好多功能交织在一块,过于复杂。所以在 Docker 的后续版本中, 对 Engine 进行模块化重构一直是重中之重。从最初分离出来的 libcontainer,到 libtrust,然后现在的libnetwork,libkv,越来越多的子模块被独立出来,既简化了架 构,也增强了 Docker 对各个异构系统的适应能力。很多模块在使用上都有点类似于最早的 GraphDriver这一块,Docker 只提供一个通用的 Driver接口,各个文件系统 (aufs,overlay等)自己实现这些接口即可。如今的插件机制便是对这一功能的扩充。

如今的插件机制只支持 volume pluginnetwork driver plugins,后续肯定也会支持其他的 插件。如果你想现在自己尝试编写一个插件,请参考以下文档: Experimental: Docker Plugin API

官方文档里也列出了几个现存的插件,如下所示:

  • Flocker plugin volume plugin,是数据卷可在多个主机间无缝迁移。
  • Weave plugin netwrok driver plugin,提供虚拟的多主机间的容器网络环境
  • Calico plugin network driver plugin, 提供多主机间基于BGP的虚拟网络

网络和服务

大家期待已久的关于网络和服务的特性终于在这一版里有了重大更新。如今networkserver都已经成了Docker里面的一等公民,像ImageContainer一样,在命令行 里试一下:

注意,直接输入docker命令后的的帮助信息里并没有这两个子命令,估计是还没有同步更 新。

除了这些之外,也增加到了对不同主机间的容器网络的支持。在这之上,Docker原生的服务 发现功能也成为了可能。如果对 Docker 在网络方面的发展感兴趣,可关注一下 libnetwork项目。

下面将开始介绍稳定版里的新功能:

资源管理

CPU CFS quota

CFSCompletely Fair Scheduler,完全公平调度器。在 cgroups里可以用 cpu.cfs_period_uscpu.cfs_quota_us来限制该组中的所有进程在单位时间里可以使 用各CPU时间。其中前者是时间周期,默认为100ms,后者是在这时间内可使用的CPU时间,默 认为-1,即无限制。此次在docker run中增加了--cpu-quota参数可用来调节后者的值。

磁盘IO限制

Docker为进程提供了一个隔离的运行环境,但这个隔离并不是很完全,在很多资源的限制方 面都未实现。在1.7之前,一直没有对磁盘IO进行限制的功能,此次增加了 --blkio-weight参数正是为了解决这个问题。

ZFS

现在在实际中常用的两个graph driveraufsdevicemapper,分别在ubuntu系和 redhat系上用的最多。从源码上来看,推荐的使用顺序依次是 aufs,btrfs,zfs,devicemapper,overlay,vfs,可见zfs犹在 devicemapper之前,此次增加对ZFS的支持,也为大家以后选择文件系统提供了更多的 选择。

容器

Logs

logs方面的重大更新是在1.6版本,此次只是增加了--since参数用于截取自某个时间段之 后的日志。

Exec

之前的版本中,使用docker exec时,新的进程都会用root权限运行,这会带来很多安全 隐患。此次增加了--user参数,提升了容器的安全性。

命名空间

Docker将容器与宿主机隔离起来,但在有些场景下,我们也需要在某些方面让容器和主机共享 资源。比如我们知道--net=host参数,通过使用主机网络,可以避免虚拟网络的性能损耗, --pid参数可以用来选择PID的命名空间。此次增加了UTS(hostname)命名空间共享的支持,给用户在使用上带来了更 多的选择。

userland-proxy

userland proxy一直以来的作用是通过0.0.0.0地址对容器映射出来的端口进行访问, 在很多场景下,这个功能并不是必须的,而且docker-proxy所占用的资源过多也一直被诟病, 所以在此版本增加了--userland-proxy选项,让用户来选择是否开启这个功能。

参考链接

  1. ANNOUNCING DOCKER 1.7: MULTI-HOST NETWORKING, PLUGINS AND ORCHESTRATION UPDATES
  2. DOCKER’S EXPERIMENTAL BINARY