6月16日,Docker 1.7.0 发布,重磅炸弹在Docker圈引起巨大轰动,同时也为6月22日在旧金山举办的DockerCon大会献礼。

show_meitu_1.jpg

早在Docker 1.6.0之际,Docker官方的工程师即宣称:1.7.0版本将会带来很大的变化,包括:Docker的bug修改以及功能添加;并且还体现在Docker的架构上,如网络模块等。

话不多说,赶紧让我们进入Docker 1.7.0的深度解析。从Docker的版本变更日志来看,Docker 1.7.0在四个方面会有或多或少的变动,分别是:Docker运行时(Runtime),Docker的代码变化,Docker的builder模块,以及Docker的bug修复。

本文主要涉及Docker 1.7.0的runtime。

1. 增添了一个仍然处于试验阶段的特性:支持out of process的数据卷插件。

何为试验性质的特性,换言之Docker的这部分特性还不支持在生产环境中采用,这些特性更多的希望用户仅仅在测试环境,以及沙箱环境中采用。试验性特性完全是Docker 1.7.0的一大亮点。

在以上的基础上理解out-of-process,就容易很多,插件本身与Docker Daemon无耦合,即插即用,在Docker Daemon范畴之外发挥作用。

目前Docker的试验性特性可以从两个方面来描述,首先Docker目前已经支持用户自定义第三方插件的使用;另外在这基础上,Docker自身支持了容器数据卷volume插件。此外,Docker还定义了一整套与插件相关的API,方便用户使用。当然,相信后续在该领域,不论是Docker官方,还是整个社区,都会不断有新的插件诞生。值得一提的,在数据卷volume插件方面,出现了Flocker的身影,这也意味着容器的数据存储问题,真正被提上台面,并由相应合理的解决方案。

2.从docker daemon的角度,添加了userland-proxy的起停开关。

首先介绍userland-proxy一直以来的作用。众所周知,在Docker的桥接bridge网络模式下,Docker容器时是通过宿主机上的NAT模式,建立与宿主机之外世界的通信。然而在宿主机上,一般情况下,进程可以通过三种方式访问容器,分别为:<eth0IP>:<hostPort>, <containerIP>:<containerPort>,以及<0.0.0.0>:<hostPort>。实际上,最后一种方式的成功访问完全得益于userland-proxy,即Docker Daemon在启动一个Docker容器时,每为容器在宿主机上映射一个端口,都会启动一个docker-proxy进程,实现宿主机上0.0.0.0地址上对容器的访问代理。

当时引入userland-proxy时,也许是因为设计者意识到了0.0.0.0地址对容器访问上的功能缺陷。然而,在docker-proxy加入Docker之后相当长的一段时间内。Docker爱好者普遍感受到,很多场景下,docker-proxy并非必需,甚至会带来一些其他的弊端。

影响较大的场景主要有两种:

第一,单个容器需要和宿主机有多个端口的映射。此场景下,若容器需要映射1000个端口甚至更多,那么宿主机上就会创建1000个甚至更多的docker-proxy进程。据不完全测试,每一个docker-proxy占用的内存是4-10MB不等。如此一来,直接消耗至少4-10GB内存,以及至少1000个进程,无论是从系统内存,还是从系统CPU资源来分析,这都会是很大的负担。

第二,众多容器同时存在于宿主机的情况,单个容器映射端口极少。这种场景下,关于宿主机资源的消耗并没有如第一种场景下那样暴力,而且一种较为慢性的方式侵噬资源。

如今,Docker Daemon引入- -userland-proxy这个flag,将以上场景的控制权完全交给了用户,由用户决定是否开启,也为用户的场景的proxy代理提供了灵活性。

3. docker exec命令增加- -user参数,用户控制docker exec在容器中执行命令时所处的用户。

自从docker 1.3.0引入docker exec之后,用户对容器的操纵能力被大大释放,容器对用户而言不再是一个运行的黑盒。然而,docker exec带来巨大好处的同时,我们也能看到这其中的一些瑕疵,当然Docker社区也在不断地完善docker exec。

首先,docker exec在容器中运行的进程会以root权限运行,在权限方面缺乏灵活性的同时,容器的安全很有可能失控。参数- -user恰好弥补了这方面的不足。其次,docker exec的存在打破了容器内进程呈现树状关系的现状,而设计初期Docker容器的很多概念均以树的思想从init process入手,因此目前docker exec的进程并不能和原生态容器进程完全一样地被Docker Daemon管理。

4. 增强Docker容器网关地址的配置广度。

Docker 1.7.0发布之前,在bridge桥接模式下,Docker容器的网关地址是默认生成的,一般为Docker环境中的docker0网桥地址。从容器通信的角度而言,默认的方式已经可以满足需要。但是,我们依然可以发现,这种模式存在一些弊端,比如网络配置的灵活性以及网络安全性。

Docker容器的网络一直广受关注,缺乏可配置的特性,在如今的软件发展中,几乎就意味着封闭。 --default-gateway 以及--default-gateway-v6 这两个参数,很大程度上提高了用户自定义容器网络的灵活性,用户更多场景的覆盖,似乎从Docker的发展中若影若现。结合最近几次新版本,功能的增强与丰富,不难猜测,Docker的企业化以及生产化,已经更上一层楼。

默认网关的设置,为什么说会和容器的网络安全相关呢?过去很长一段时间内,docker0作为容器的网关地址,这种方式将容器与宿主机的耦合关系体现的很彻底。docker0作为宿主机上的网络接口,充当容器与宿主机的桥梁。然而,也正是桥梁的存在,使得容器内部进程很容易穿过网关,到达宿主机,此过程并非对用户透明。

5. 容器CFS quota的支持

完善Docker对内核cgoups的支持,指的是对于一个组内的进程组在一个周期内被内核CFS调度算法调度的时间限额,单位为微秒。该配置项在cgroups中相应的文件为/sys/fs/cgroup/cpu/cpu.cfs_quota_us。

6. 容器磁盘IO限制的支持

众所周知,容器将会为用户提供一个隔离的运行环境,容器内部的进程或者进程组使用资源时将受到限制,这样的资源,包括:内存资源(物理内存以及swap),CPU资源(CPU时间片以及CPU核等),磁盘空间资源等,以上这部分内容或多或少,Docker的新版本之前或多或少都可以实现,然而隔离维度依旧不够完美,这次Docker添加了—blkio-weight参数,实现对容器磁盘IO限制的支持。隔离更加完备,用户也不再需要担心容器间磁盘IO资源的竞争。

7. ZFS支持

Docker 1.7.0 正式宣布支持ZFS文件系统。此举也意味着Docker容器文件系统的支持从原先的5种增加到6种。此前,Docker支持aufs,devmapper,btrfs,ovelayfs,vfs(用于支持volume),如今添加对ZFS的支持。ZFS的支持,不禁让人联想到与Docker的数据卷volume插件的Flocker。错进错出,似乎关系较为微妙。

值得一提的是,除了支持ZFS之外,笔者发现在负责容器文件系统的graph模块中,添加了driver_windows.go,虽然内容极其简易,并非完全实现对windows的全盘支持,但是至少让大家看到Docker支持windows的步伐在不断迈进。

8. docker logs的功能扩展

查看容器日志,相信很多Docker爱好者都体验过,这也是用户查看容器运行状态的重要依据。

可以简单了解Docker容器日志的原理:对于每一个创建的Docker容器,Docker Daemon均会在内部创建一个goroutine来监听容器内部进程的标准输出stdout以及标准错误stderr,并将内容传递至日志文件中。每当用户发通过Docker Client发起查看容器日志的请求docker logs之后,Docker Daemon会将日志文件的内容传递至Docker Client显示。

docker logs的发展,几乎可以分为4个阶段:Docker诞生初期的原生态日志打印;允许用户follow容器的日志;开启容器容器的tail功能,以及容器日志的since功能,打印从某一个时间戳开始之后的容器日志。

虽然容器日志的功能在逐渐增强,但是不可否认的是,容器日志是容器本身与Docker Daemon耦合最大的模块之一,而这涉及Docker设计之初的计划,绝非完美,但的确是短时间内最易用的方案。

9. 容器与宿主机共享UTS命名空间的支持

不同的场景下,容器与宿主机可以完全隔离,容器也可能与宿主机存在共享信息的情况,Docker网络的host模式就是一个很好的例子,该模式下的容器共享宿主机的网络命名空间。

共享UTS命名空间的支持,意味着容器与宿主机的关系越来越微妙。也许目前很多Docker爱好者已经习惯容器与宿主机完全隔离的运行,当然也会有一些用户曾经抱怨完全隔离的运行环境并不能平滑的将传统遗留业务容器化。那么,目前Docker在兼顾两者的情况下,更多地在满足后者的需求,不久的将来,Docker容器的运用场景必将更加丰富,这也是Docker走向企业化以及生产化必须要趟的路。

总体而言,Docker 1.7.0给笔者的感受是:功能上逐渐向企业需求靠拢,在production-ready的路上不断优化,另外在安全方面在不涉及内核基础上也不断完善。

原文发布时间为:2015-06-23

本文来自云栖社区合作伙伴“Linux中国”

Docker 1.7.0 深度解析相关推荐

  1. IDC 首都在线 | 渲染算力云2.0深度解析

    根据IDC 2022年调查显示,在数字化转型的驱动下,无论是个人消费者买单的消费级市场,还是以公司为支出单位的企业级市场,两者在新兴技术.数字化产品.数字化基础设施.服务解决方案等方面的投入都将呈现迅 ...

  2. 深度解析:mPaaS 3.0全新组件

    摘要:以"数字金融新原力(The New Force of Digital Finance)"为主题,蚂蚁金服ATEC城市峰会于2019年1月4日上海如期举办.分论坛上,蚂蚁金服产 ...

  3. 深度解析ASP.NET2.0中的Callback机制

    callback的一般使用方法还算简单,直接参照msdn的帮助和范例就足够了.但是想要真正用好.用精,或者想开发一些基于callback机制的WEB组件,那么,就要先深入了解callback的实现机制 ...

  4. 不要再纠结卷积的公式啦!0公式深度解析全连接前馈网络与卷积神经网络!

    文章转载自订阅号「夕小瑶的卖萌屋」中的文章<不要再纠结卷积的公式啦!0公式深度解析全连接前馈网络与卷积神经网络>. Hello~你们的小夕终于吐泡泡了-前几天小夕又加班赶project啦, ...

  5. flac3d命令流实例大全_Activiti6.0工作流引擎深度解析

    本课程将系统且深入源码讲解Activiti6.0工作流引擎的使用.配置.核心api以及BPMN2.0规范.数据库设计及模型映射,Spring Boot2.0集成,工作流平台搭建.部署与运维等,通过本课 ...

  6. 深度解析:mPaaS 3.0全新组件 1

    摘要:以"数字金融新原力(The New Force of Digital Finance)"为主题,蚂蚁金服ATEC城市峰会于2019年1月4日上海如期举办.分论坛上,蚂蚁金服产 ...

  7. Nature重磅:人工智能从0到1, 无师自通完爆阿法狗100-0 | 深度解析

    本文授权转载自知社学术圈(微信id:zhishexueshuquan) 去年,有个小孩读遍人世所有的棋谱,辛勤打谱,苦思冥想,棋艺精进,4-1打败世界冠军李世石,从此人间无敌手.他的名字叫阿法狗. 今 ...

  8. 舒工深度解析不规则场地座位二维码生成规则

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  9. 推荐:微服务架构的深度解析!

    通过采用微服务架构,企业最大的收益是帮助内部IT建设沿着可演进的方向发展.支持灵活扩展.降低运维成本.快速响应业务变化. 这些底层技术能力的提升让业务更加敏捷.成本可控,企业也可以从中获得技术红利和市 ...

最新文章

  1. 省技术市场举办中小企业专利法律风险防范及专利战略制定讲座
  2. BZOJ.4144.[AMPPZ2014]Petrol(Kruskal重构树)
  3. C#数据结构与算法揭秘17
  4. 独立按键控制数码管c语言,各位大佬,独立按键控制数码管为什么按下的时候要加一呢?...
  5. pip install mysql-connector 安装出错
  6. 【Redis笔记】数据结构与对象:链表
  7. mysql基础8-运算符、函数、索引
  8. 最大子数组问题 时间复杂度为Θ(n)
  9. 计算机存储信息的单位
  10. 怎么将苹果手机屏幕投屏到电脑上
  11. 精读《磁贴布局 - 功能分析》
  12. 我在蚂蚁金服做后端:那些坚持在一个岗位做八年的人,后来怎么样了?...
  13. 威廉玛丽学院计算机专业好吗,威廉玛丽学院商学院BA专业怎么样?
  14. cpu对计算机性能的影响,雷神告诉你CPU制程对性能的影响有多大?
  15. python音乐可视化效果_python 音频可视化
  16. 安装elasticsearch后,本地访问不了
  17. 压测报502 badgateway问题解决
  18. Cholesterol-PEG-Maleimide|胆固醇-聚乙二醇-马来酰亚胺修饰蛋白用
  19. java图片去掉文字_java解出图片中的文字
  20. hrbust 1424 哈理工oj 1424 Hrbust的校车【水题】【思维】

热门文章

  1. 使用SSM开发一个校友联络的平台系统
  2. 如何批量创建网页的快捷方式
  3. 通过 运行实现快速打开应用程序
  4. matlab中的科学记数法变成小数形式
  5. configparser模块
  6. 「luogu3704」[SDOI2017]数字表格
  7. 亚麻:Round Robin
  8. UVA - 11478 Halum 二分+差分约束
  9. 利用Mircosoft URLRewriter.dll实现asp.net页面伪静态
  10. 关于C#值类型,引用类型,值传递,引用传递