您的位置:网站首页 > 源码环境 > 正文

Docker源码分析四:Docker Daemon之NewDaemon实现2014年12月3日星

类别:源码环境 日期:2014-12-3 15:44:41 人气: 来源:
火影之狂鬼自来也,音速犬技能表,势不可挡的泥浆,我应该去爱你mp3,夫君爱使坏,章鱼搜索不能用了,神灯阿拉甲,邓小平之子携款潜逃,非诚勿扰洛奇牵手,伊丽莎白瓜热量,乡村爱情杨总,up222.com,风流大官人,大桥未久内涵图,米国小裤裤,和之匣nds,暗矛巨魔声望,runningman13,96900网上订票,巨兽岛稀有,川by0008,海南特区七星彩,夏莉夫人,碎空刀txt下载,veromoda中国官网,沙滩上的夏娃,bbb565.com,kb2259539,易购360玩具枪,钢铁神拳,天元神诀5200,雷迪嘎嘎被绑架,世纪宝鼎的象征意义,7xxaa.com,批评的反义词是什么,大连市河道费

  【编者按】在《深入浅出Docker》系列文章的基础上,InfoQ推出了《Docker源码分析》系列文章。《深入浅出Docker》系列文章更多的是从使用角度出发,帮助读者了解Docker的来龙去脉,而《Docker源码分析》系列文章通过分析解读Docker源码,来让读者了解Docker的内部实现,以更好的使用Docker。总之,我们的目标是促进Docker在国内的发展以及。另外,欢迎加入InfoQ Docker技术交流群,QQ群号:272489193。

  Docker的生态系统日趋完善,开发者群体也在日趋庞大,这让业界对Docker持续抱有极其乐观的态度。如今,对于广大开发者而言,使用Docker这项技术已然不是门槛,享受Docker带来的技术福利也不再是困难。然而,如何探寻Docker适应的场景,如何发展Docker周边的技术,以及如何弥合Docker新技术与传统物理机或VM技术的鸿沟,已经占据Docker研究者们的思考与实践。

  本文为《Docker源码分析》第四篇——Docker Daemon之NewDaemon实现,力求帮助广大Docker爱好者更多得理解Docker 的核心——Docker Daemon的实现。

  在NewDaemonFromDirectory的实现过程中,第一个工作是:如何应用传入的配置信息。这部分配置信息服务于Docker Daemon的运行,并在Docker Daemon启动初期就初始化完毕。配置信息的主要功能是:供用户配置Docker的可选功能,使得Docker的运行更贴近用户期待的运行场景。

  配置信息的处理包含4部分:

  以上代码的含义为:若config中BridgeIce和BridgeIP两个属性均不为空,则返回nil对象,并返回错误信息,错误信息内容为:用户同时指定了BridgeIce和BridgeIP,这两个属性属于互斥类型,只能至多指定其中之一。而在默认配置文件中,BridgeIce和BridgeIP均为空。

  代码含义为:若EnableIptables和InterContainerCommunication两个属性的值均为lse,则返回nil对象以及错误信息。其中错误信息为:用户将以上两属性均置为lse,container间通信需要iptables的支持,需设置至少其中之一为true。而在默认配置文件中,这两个属性的值均为true。

  代码执行过程中,首先检测config中的Pidfile属性是否为空,若为空,则跳过代码块继续执行;若不为空,则首先在文件系统中创建具体的Pidfile,然后向eng的onShutdown属性添加一个处理函数,函数具体完成的工作为utils.RemovePidFile(config.Pidfile),即在Docker Daemon进行shutdown操作的时候,删除Pidfile文件。在默认配置文件中,Pidfile文件的初始值为” /var/run/docker.pid”。

  以上便是关于配置信息处理的分析。

  首先,通过runtime.GOOS,检测操作系统的类型。runtime.GOOS返回运行程序所在操作系统的类型,可以是Linux,Darwin,FreeBSD等。结合具体代码,可以发现,若操作系统不为Linux的话,将报出Fatal错误日志,内容为“Docker Daemon只能支持Linux操作系统”。

  接着,通过os.Geteuid(),检测程序用户是否拥有足够权限。os.Geteuid()返回调用者所在组的group id。结合具体代码,也就是说,若返回不为0,则说明不是以root用户的身份运行,报出Fatal日志。

  最后,通过checkKernelAndArch(),检测内核的版本以及主机处理器类型。checkKernelAndArch()的实现同样位于./docker/daemon/daemon.go。实现过程中,第一个工作是:检测程序运行所在的处理器架构是否为“amd64”,而目前Docker运行时只能支持amd64的处理器架构。第二个工作是:检测Linux内核版本是否满足要求,而目前Docker Daemon运行所需的内核版本若过低,则必须升级至3.8.0。

  其中Root表示graph的工作根目录,一般为”/var/lib/docker/graph”;idIndex使得检索字符串标识符时,允许使用任意一个该字符串唯一的前缀,在这里idIndex用于通过简短有效的字符串前缀检索镜像与容器的ID;最后driver表示具体的graphdriver类型。

  分析以上源码可知,通过config中的DisableNetwork属性来判断,在默认配置文件中,该属性有过定义,却没有初始值。但是在应用配置信息中处理网络功能配置的时候,将DisableNetwork属性赋值为lse,故判断语句结果,执行相应的代码块。

  首先创建名为”init_networkdriver”的job,随后为该job设置变量,变量的值如下:

  创建Docker网络设备,属于Docker Daemon创建网络的第一步,实际工作是创建名为“docker0”的网桥设备。

  在InitDriver函数运行过程中,首先使用job的变量初始化内部变量;然后根据目前网络,判断是否创建docker0网桥,若Docker专属网桥已存在,则继续往下执行;否则的话,创建docker0网桥。具体实现为createBridge(bridgeIP),以及createBridgeIce(bridgeIce)。

  createBridge的功能是:在host主机上启动创建指定名称网桥设备的任务,并为该网桥设备配置一个与其他设备不冲突的网络地址。而createBridgeIce通过系统调用负责创建具体实际的网桥设备,并设置MAC地址,通过libcontainer中netlink包的CreateBridge来实现。

  本文从源码的角度深度分析了Docker Daemon启动过程中daemon对象的创建与加载。在这一环节中涉及内容极多,本文归纳总结daemon实现的逻辑,一一深入,具体全面。

  在Docker的架构中,Docker Daemon的内容是最为丰富以及全面的,而NewDaemon的实现而是涵盖了Docker Daemon启动过程中的绝大部分。可以认为NewDaemon是Docker Daemon实现过程中的精华所在。深入理解NewDaemon的实现,即掌握了Docker Daemon运行的来龙去脉。

  孙宏亮,浙江大学VLIS实验室硕士研究生。两年来在云计算方面主要研究PaaS领域的相关知识与技术。轻量级虚拟化容器的技术,会给PaaS领域带来深度影响,甚至决定未来PaaS技术的。邮箱:

关键词:源码环境
0
0
0
0
0
0
0
0
下一篇:没有资料

网友评论 ()条 查看

姓名: 验证码: 看不清楚,换一个

推荐文章更多

热门图文更多

最新文章更多

关于联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助

CopyRight 2002-2012 技术支持 源码吧 FXT All Rights Reserved

赞助合作: