Docker源码分析.html.pdf

上传人:紫竹语嫣 文档编号:5518494 上传时间:2020-05-28 格式:PDF 页数:65 大小:1.75MB
返回 下载 相关 举报
Docker源码分析.html.pdf_第1页
第1页 / 共65页
Docker源码分析.html.pdf_第2页
第2页 / 共65页
Docker源码分析.html.pdf_第3页
第3页 / 共65页
Docker源码分析.html.pdf_第4页
第4页 / 共65页
Docker源码分析.html.pdf_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《Docker源码分析.html.pdf》由会员分享,可在线阅读,更多相关《Docker源码分析.html.pdf(65页珍藏版)》请在三一文库上搜索。

1、赞誉 像谷歌一样部署自己的应用,这是很多软件工程师的梦想。Docker的目标是圆很多人的梦。自从InfoQ推出Docker系列文章,作为操作系统课程教师的我一直在学习并关注Docker的茁壮成长。 当我发现这上面刊登的“Docker源码分析”系列文章的作者居然是我们课程组的研究生助教孙宏亮时,惊喜之情溢于言表。宏亮对Docker的理解十分深刻,他本人是Docker的积极拥护者、倡导者和 贡献者。他在研究生毕业以后投身到了创业公司DaoCloud,去为Docker的梦想开创美好的未来。 最近,我又欣喜地发现,这系列文章以及后续章节即将正式出版成书,有机会同更多的Docker用户、开发者、学习者见

2、面。本书通过分析解读Docker源码,让读者了解Docker的内部结构和实现,以 便更好地使用Docker。该书的内容组织深入浅出,表述准确到位,有大量流程图和代码片段帮助读者理解Docker各个功能模块的流程,是学习Docker开源系统的良师益友。 寿黎旦,浙江大学计算机学院教授 近年来,Docker迅速风靡了云计算世界,但是专门针对Docker的技术实现进行深入分析的文章却相对较少。这一方面由于Docker技术变化很快,源码分析很快会跟不上版本发展;另一方面,对源代 码的解析,需要对整个Docker设计具备全局的视角,才能深入浅出地找到源码中的脉络。 宏亮的这本Docker源码分析,恰如其

3、时的出现,弥补了这个空白,对于希望参与到Docker社区、参与代码贡献或构建自己的Docker应用环境的读者来说,应是一本案头必备书籍。 王兴宇,Linux中国创始人 在崇尚源码至上的工程师文化里,文档介绍、发布会材料都是苍白的,唯有研读源码,才能深刻理解软件背后的原理。与所有其他软件一样,读源码并不是学习Docker最快的途径,但是如果有人通读 源码后给出了详细分析,你就可以轻松地站在巨人的肩膀上。 很高兴看到国内这么快就出版源码分析的书籍。对于所有想在Docker方面进阶和想晋升为高端用户的读者,都值得阅读本书,也希望通过Docker源码分析一书,可以诞生更多的社区贡献者,共 同推动Doc

4、ker的发展。 黄强,华为Docker Committer 值得自豪的是,就在Docker蓬勃发展之际,第一本详尽剖析Docker源码的著作出自国人之手。 本书在每章宏观的流程梳理背后都伴随有更加细致深入的源码分析。无论读者是只想了解使用Docker,还是抱着深入理解Docker并参与社区开发、二次开发的心态,本书都值得一读。 胡科平,华为Docker Committer 这本书从源码的角度对Docker的实现原理进行了深入的探讨和细腻的讲解,将当前热门的容器技术的背后机理讲解得深入浅出明白透彻。无论是Docker的用户还是开发者,通过阅读本书都可以对 Docker有更深刻的理解,能够更好地使

5、用或者开发Docker。 雷继棠,华为Docker Committer Docker已经是一个成长2年时间的云计算技术,它正在以惊人的速度在全球范围内扩张自己的“疆土”。我作为Docker中国区的开发者,非常希望能看到有一本书详细地告诉我,Docker的每一个细 节是如何实现的。所以当我在InfoQ上看到宏亮的“Docker源码分析”专栏时眼前一亮。今天,它终于汇编成书摆在你我的眼前。我希望你能在这本书上学到更多Docker技术的精髓思想,在实战Docker 技术时可以运用自如! 肖德时,数人科技CTO 我家里的书柜中至今仍然保留着一本Linux内核完全注释,它伴随我很长一段时间,使我受益匪浅

6、。10年之后,当我拿到宏亮的Docker源代码分析草稿,昨日又重现。这本书无论是对学习 Docker,还是掌握Go语言,都是非常好的一手资源。雷锋不常有,大家要支持! 赵鹏,VisualOps创始人 序 三年前,我在VMware负责Cloud Foundry这一款开源PaaS产品在中国的开发者社区和生态系统建设工作。当时关于Cloud Foundry的中文文档非常少,更不用说有深度的技术干货了,所以当CSDN 上出现了一个专门从底层模块和源码的角度,对Cloud Foundry做深度剖析的系列博客文章时,一下子就引起了我的注意。 经过一番“人肉搜索”,我非常惊奇的发现,这一系列干货的作者孙宏亮

7、,竟然是浙江大学计算系的一年级研究生。当时,VMware跟浙江大学在Cloud Foundry方面有比较深入的合作,浙大计算机 系的SEL实验室,投入了精锐的师资力量,从事分布式系统和新一代PaaS的研究工作。宏亮初入浙江大学,就在这样的氛围下开始了他的研究生求学生涯,应当说是非常幸运的。 宏亮在CSDN上的系列文章,主打“源码分析”,这正是当时开源社区内比较缺少的内容。提笔写“源码分析”,需要一定的勇气,阅读源码需要耗费大量的精力,需要从数十万行代码中整理出清晰 的逻辑,从中抽丝拨茧、概括精华,这是一份非常辛苦的工作。而且,分析源码也需要一些“挑战权威”的精神,不仅仅是简单的代码解析,更需要

8、提炼出自己的观点,甚至敢于发现和纠正一些已有的问 题。 在源码分析方面,宏亮充分体现了“初生牛犊不怕虎”的精神,非常详细地剖析了当时Cloud Foundry的几个主要模块,条理清晰,技术分析准确到位。宏亮这一系列文章帮助了包括一线互联网公司 在内的许多企业了解、认识和最终使用Cloud Foundry,宏亮也借此奠定了他在PaaS社区的“江湖地位”。 从去年开始,Docker的热潮开始波及中国开发者社区。我有幸跟宏亮一起在CSDN主办的第一届Container技术大会上发表联合主题演讲,向来宾介绍Cloud Foundry内部的容器技术实现,以及对 Docker的一些展望。那次大会是一个很重

9、要的里程碑,在那之后,宏亮开始深入研究Docker的底层实现,并在InfoQ连载“Docker源码分析”系列文章。 对PaaS平台的研究越深入,越能够发现和体会Docker对开发和运维的价值。如果说当初的Cloud Foundry模块和源码分析文章,是读研期间的学习笔记,那这次宏亮的Docker源码分析,则是一 个经过了深思熟虑、系统性、结构化的工作。Docker开源项目发展速度非常快,这次在文章连载内容的基础上出书,为了保证内容的准确性和时效性,宏亮补充了大量Docker最新项目的内容,特别是对 Swarm、Machine和Compose这三个模块的开发进展做了紧密的追踪。 这是一本从架构和

10、代码角度讲解Docker底层实现的技术图书,我从连载第一篇开始就对这个系列的文章保持了紧密的关注,也目睹了宏亮在后期整理加工成书过程中的辛勤努力。在Docker源码分 析成书付梓出版之际,非常幸运,能够为宏亮写着一篇推荐序。这本书非常适合以下三类读者学习和阅读。 希望以Docker容器交付软件的程序员。 Docker是未来互联网软件的交付件,这件事随着OCP标准的制定,正在逐渐成为事实。程序员和运维工程师都需要了解Docker的工作方式,尤其是Docker镜像的结构,软件通过Dockerfile打包时的 优化方式等,这些内容在本书中都有非常详细的阐述。 Docker化云计算平台的建设者和维护者

11、。 Docker公司在今年的全球开发者大会上提出了“Production Ready”的口号,有越来越多的互联网公司和传统企业采用Docker来构建开发、测试和运维平台。Docker在网络、存储、安全等领域的细 节,是平台建设者和维护者必须深入了解的部分,这些领域还在不断变化,新的项目也层出不穷,但本书对网络、存储和安全的基本知识和概念,做了非常清晰的介绍,也深入到了底层实现的代码。 Go语言程序员。 即使不在项目中使用Docker,本书也能够为Go语言程序员带来帮助。Docker项目中大量采用了Go语言,尤其是在处理并发场景时,Docker对Go语言的运用可谓出神入化。本书可以帮助Go语言程

12、序 员亲身体验特大型项目中Go语言的威力,以及实战场景中Golang模式和功能的用法。 最后,预祝宏亮在Docker的学习和工作中再创佳绩,也希望读者可以从本书收获知识,开阔眼界。 喻勇 2015年7月13日 前言 Docker是什么 Docker从2013年诞生,短短两年时间就在全球IT技术圈内迅速走红,实乃技术圈内不可忽视的一阵飓风。然而,Docker是什么,Docker带来了什么? Docker官方如此描述Docker:“Build,Ship,Run.An open platform for distributed applications for developers and sysa

13、dmins”。换言之,Docker为开发者与系统管理者提供了分布式应用 的开放平台,从而可以便捷地构建、迁移与运行分布式应用。 多年来,IT行业中开发与运维一直是两个界限清晰的词。开发工程师专门从事软件的开发工作,最终交付软件代码;运维工程师则部署前者交付的软件,并接管软件的运行与管理。然而,在长时间的 实践过程中,开发与运维分离的方式难免存在弊病,两者职责的过分清晰导致软件效率的降低。随着分布式系统的流行,系统规模越来越大,软件越来越复杂,系统环境配置暴露的问题层出不穷。究其缘 由,还是因为开发人员缺少软件运行环境的认知,而运维人员对软件逻辑所知甚少。在这样的背景下,DevOps横空出世,提

14、倡开发与运维不可分割,协调并进。 Docker无疑是DevOps大潮中最具实践价值的不二法宝。Docker从Linux内核的角度出发,属于轻量级虚拟化技术,有能力秒级提供应用隔离环境,完成云计算时代分布式应用的第一需求“隔离”。 另外,Docker的镜像技术利用联合文件系统的优势,自下至上打包系统软件、系统环境以及软件程序,将运行环境与应用程序灵活地结合,快速运行Docker化的应用程序。同时,可读性极强的 Dockerfile,极大地简化镜像的复杂性,并为镜像的转移与重新构建提供了可能性。 Docker提供轻便的资源分配方式,解决应用运行与系统环境的依赖,弥合应用跨节点迁移的鸿沟,种种特性都

15、表明Docker几乎就是为“云计算”而生的。如今,Docker社区不断扩大并健康发展,多 家国际IT巨头也纷纷宣布支持Docker,这一切更是让全球IT人士对Docker的未来充满信心。 本书的内容 本书是一本引导读者了解Docker实现原理的技术普及书。笔者一直坚信,了解软件或者系统最直接、最透彻的方式就是研读它们的源码。“源码即文档”也是鼓励开发者能更多地从源码的角度去学习 软件或系统的本质。 本书的内容主要集中于3个部分:Docker的架构,Docker的模块,Docker的三驾马车Swarm、Machine以及Compose。 第一部分,主要从宏观的角度和读者一起领略Docker的架构

16、设计,并初步介绍架构中各模块的职责。 第二部分是本书的主体部分,主要针对Docker中多个重要的模块进行具体深入分析,包括:Docker Client、Docker Daemon、Docker Server、Docker网络、Docker镜像、Docker容器等。读者可 以发现,Docker的模块之间耦合度非常低,很适合循序渐进,层层深入。第2章至第8章主要从Docker软件的架构入手,勾勒骨架;第9章至第11章重点讨论Docker镜像技术,夯实基础;第12章至第14章 则进一步分析Docker容器的始末,阐述本质。 第三部分介绍Docker生态三驾马车Swarm、Machine、Compos

17、e。Docker拥有强大的单机能力,三驾马车可以很好地补充Docker的跨主机能力以及部署能力。读者可以通过第15章至第17章感受 Docker生态圈中其他功能强大的软件。 希望本书能够让读者最大化地感受Docker的神奇与魅力。 关于勘误 由于时间与水平都比较有限,因此本书难免会存在一些纰漏和错误。如果读者发现了问题,请及时与我联系。我也会在本书后续的版本中加以改正。我的邮箱是:allen.sundaocloud.io。我非常希 望和大家一起学习与讨论Docker,并共同推动Docker在社区的发展。 致谢 最后,向本书编写过程中给予我巨大帮助的人们表示最诚挚的感谢。感谢我的父母,没有他们的

18、鼓励和支持,此书不可能在如此短的时间内完成。感谢我的母校浙江大学以及SEL实验室的老师与同学 们,是他们在我求学过程中给予无私的指引与帮助。感谢我的同事熊中祥,是他在本书编写过程中提出了很多宝贵的建议,尤其在Machine和Compose部分。感谢我的同事喻勇和冯钊,他们为本书的编写 做了很多沟通与协调工作。最后,还要感谢华章公司的编辑们,她们认真细致的工作,使本书以完美的形式展现给各位读者。 孙宏亮 2015年6月 第1章 Docker架构 1.1 引言 Docker是Linux平台上的一款轻量级虚拟化容器的管理引擎。在全球范围内,Docker还是一个开源项目,整个项目基于Go语言开发,代码

19、托管于GitHub网站上,并遵从Apache 2.0协议。目 前,Docker可以帮助用户在容器内部快速自动化部署应用,并利用Linux内核特性命名空间(namespaces)及控制组(cgroups)等为容器提供隔离的运行环境。Docker借助操作系统层的虚拟化实现资 源的隔离,因此Docker容器在运行时与虚拟机(VM)的运行有很大的区别,Docker容器与宿主机共享同一个操作系统,不会有额外的操作系统开销。这样的优势很明显,因而大大提高了资源利用率,并 且提升了I/O等方面的性能。 众多新颖的特性以及项目本身的开放性,导致Docker在不到两年的时间里迅速获得了诸多厂商的青睐,其中更是包

20、括Google、Microsoft、VMware等行业领航者。Google在2014年6月推出了 Kubernetes,宣布支持Docker容器的调度管理,而2014年8月Microsoft则宣布Azure上支持Kubernetes,随后传统虚拟化巨头VMware宣布与Docker强强合作。2014年9月中旬,Docker更是获得4000 万美元的C轮融资,以推动分布式应用的发展。 目前,Docker的前景被普遍看好。未来的云计算领域乃至整个IT领域,Docker都必将扮演不可或缺的角色。为了帮助大家更好地认识Docker、理解Docker并掌握Docker,本书从Docker源码的角度 出发

21、,详细介绍Docker的架构、Docker的运行以及Docker的特性。本章主要介绍Docker架构。 本书关于Docker的分析均基于Docker 1.2.0版本的源码。 本章目的是在理解Docker源码的基础上分析Docker架构,分析过程主要按照以下三个部分进行: Docker的总架构图。 Docker架构内部各模块功能与实现的分析。 通过具体的Docker命令,阐述Docker的运行流程。 第1章 Docker架构 1.1 引言 Docker是Linux平台上的一款轻量级虚拟化容器的管理引擎。在全球范围内,Docker还是一个开源项目,整个项目基于Go语言开发,代码托管于GitHub网

22、站上,并遵从Apache 2.0协议。目 前,Docker可以帮助用户在容器内部快速自动化部署应用,并利用Linux内核特性命名空间(namespaces)及控制组(cgroups)等为容器提供隔离的运行环境。Docker借助操作系统层的虚拟化实现资 源的隔离,因此Docker容器在运行时与虚拟机(VM)的运行有很大的区别,Docker容器与宿主机共享同一个操作系统,不会有额外的操作系统开销。这样的优势很明显,因而大大提高了资源利用率,并 且提升了I/O等方面的性能。 众多新颖的特性以及项目本身的开放性,导致Docker在不到两年的时间里迅速获得了诸多厂商的青睐,其中更是包括Google、Mi

23、crosoft、VMware等行业领航者。Google在2014年6月推出了 Kubernetes,宣布支持Docker容器的调度管理,而2014年8月Microsoft则宣布Azure上支持Kubernetes,随后传统虚拟化巨头VMware宣布与Docker强强合作。2014年9月中旬,Docker更是获得4000 万美元的C轮融资,以推动分布式应用的发展。 目前,Docker的前景被普遍看好。未来的云计算领域乃至整个IT领域,Docker都必将扮演不可或缺的角色。为了帮助大家更好地认识Docker、理解Docker并掌握Docker,本书从Docker源码的角度 出发,详细介绍Docke

24、r的架构、Docker的运行以及Docker的特性。本章主要介绍Docker架构。 本书关于Docker的分析均基于Docker 1.2.0版本的源码。 本章目的是在理解Docker源码的基础上分析Docker架构,分析过程主要按照以下三个部分进行: Docker的总架构图。 Docker架构内部各模块功能与实现的分析。 通过具体的Docker命令,阐述Docker的运行流程。 1.2 Docker总架构图 作为Linux平台上的一种容器的管理引擎,Docker并不像其他大型分布式系统那样复杂。Docker的源码总量并不多,而且清晰的源码结构使得Docker的学习成本并不高。换言之,Docke

25、r源码的学习 过程并不枯燥,我们可以从中学到很多东西,如Go语言的运用、Docker架构的设计原理等。Docker对用户而言是一个简单的C/S架构,用户通过客户端与服务器端建立通信,而Docker的后端是一个松耦 合的架构,架构中的模块各司其职、有机组合,支撑着Docker运行。 Docker的总架构如图1-1所示。架构中主要的模块有:DockerClient、DockerDaemon、Docker Registry、Graph、Driver、libcontainer以及Docker Container。 对用户而言,Docker Client是与Docker Daemon建立通信的最佳途径。

26、用户通过Docker Client发起容器的管理请求,请求最终发往Docker Daemon。 Docker Daemon作为Docker架构中的主体部分,首先具备服务端的功能,有能力接收Docker Client发起的请求;其次具备Docker Client请求的处理能力。Docker Daemon内部所有的任务均由 Engine来完成,且每一项工作都以一个Job的形式存在。 Docker Daemon需要完成的任务很多,因此Job的种类也很多。若用户需要下载容器镜像,Docker Daemon则会创建一个名为“pull”的Job,运行时从Docker Registry中下载镜像,并通过镜像

27、管 理驱动graphdriver将下载的镜像存储在graph中;若用户需要为Docker容器创建网络环境,Docker Daemon则会创建一个名“allocate_interface”的Job,通过网络驱动networkdriver分配网络接口的 资源 libcontainer是一套独立的容器管理解决方案,这套解决方案涉及了大量Linux内核方面的特性,如:namespaces、cgroups以及capabilities等。libcontainer很好地抽象了Linux的内核特性,并提供 完整、明确的接口给Docker Daemon。 当用户执行运行容器这个命令之后,一个Docker容器就处

28、于运行状态,该容器拥有隔离的运行环境、独立的网络栈资源以及受限的资源等。 图1-1 Docker总架构图 1.3 Docker各模块功能与实现分析 下面我们将从Docker的总架构图入手,抽离出架构内的各个模块,并对各个模块进行更为细化的架构分析与功能阐述。 1.4 Docker运行案例分析 1.3节着重介绍了Docker架构中各个模块的功能,学完后我们可以对Docker的架构有一个宏观的认识。熟悉一款软件,研究一个系统,从静态的角度认识架构的各个模块,仅仅是第一步;从动态的角 度,掌握软件或者系统的运行原理,即熟知架构中模块间的通信逻辑,无疑会让自己对软件或系统的理解更上一层楼。本节将从实际

29、的Docker运行案例出发,串联Docker各模块,从而学习Docker的运行 流程。分析原型为Docker中的docker pull与docker run两个命令。 1.5 总结 本章从Docker 1.2.0的源码入手,首先分析抽象出Docker的架构图,并对该架构图中的各个模块进行功能与实现的简要分析,最后通过Docker的两个基础命令展示了Docker内部的运行。 通过对Docker架构的学习,可以全面深化对Docker设计、功能与价值的理解。同时在借助Docker实现用户定制的分布式系统时,也能更好地找到已有平台与Docker较为理想的契合点。另外,熟悉 Docker现有架构以及设计

30、思想,也能为云计算PaaS领域带来更多的启示,催生出更多创新想法。 第2章 Docker Client创建与命令执行 2.1 引言 如今,作为业界领先的轻量级虚拟化容器管理引擎,Docker给全球开发者提供了一种新颖、便捷的软件集成测试与部署之道。团队开发软件时,Docker可以提供可复用的运行环境、灵活的资源配 置、便捷的集成测试方法,以及一键式的部署方式。可以说,Docker在简化持续集成、运维部署方面将其功能发挥得淋漓尽致,它让开发者从重复的持续集成、运维部署中完全解放出来,把精力真正地倾 注在开发上。 然而,要把Docker的功能发挥到极致,并非一件易事。在深刻理解Docker架构的情

31、况下,熟练掌握Docker Client的使用也非常有必要。前者可以参阅第1章,本章主要针对后者,从源码的角度分析 Docker Client,力求帮助开发者更深刻地理解Docker Client的具体实现,最终更好地掌握Docker Client的使用方法。 本章基于Docker 1.2.0的源码,分析Docker Client的内容。主要包括两个部分,分别是DockerClient的创建与Docker Client对命令的执行。两部分分析的具体内容如下。 第一部分分析Docker Client的创建。这部分的分析可分为以下三个步骤: 分析如何通过docker命令,解析出命令行flag参数,

32、以及docker命令中的请求参数。 分析如何处理具体的flag参数信息,并收集Docker Client所需的配置信息。 分析如何创建一个Docker Client。 第二部分在已有Docker Client的基础上,分析如何执行docker命令。这部分的分析又可分为以下两个步骤。 分析如何解析docker命令中的请求参数,获取相应请求的类型。 分析Docker Client如何执行具体的请求命令,最终将请求发送至Docker Server。 第2章 Docker Client创建与命令执行 2.1 引言 如今,作为业界领先的轻量级虚拟化容器管理引擎,Docker给全球开发者提供了一种新颖、便

33、捷的软件集成测试与部署之道。团队开发软件时,Docker可以提供可复用的运行环境、灵活的资源配 置、便捷的集成测试方法,以及一键式的部署方式。可以说,Docker在简化持续集成、运维部署方面将其功能发挥得淋漓尽致,它让开发者从重复的持续集成、运维部署中完全解放出来,把精力真正地倾 注在开发上。 然而,要把Docker的功能发挥到极致,并非一件易事。在深刻理解Docker架构的情况下,熟练掌握Docker Client的使用也非常有必要。前者可以参阅第1章,本章主要针对后者,从源码的角度分析 Docker Client,力求帮助开发者更深刻地理解Docker Client的具体实现,最终更好地掌

34、握Docker Client的使用方法。 本章基于Docker 1.2.0的源码,分析Docker Client的内容。主要包括两个部分,分别是DockerClient的创建与Docker Client对命令的执行。两部分分析的具体内容如下。 第一部分分析Docker Client的创建。这部分的分析可分为以下三个步骤: 分析如何通过docker命令,解析出命令行flag参数,以及docker命令中的请求参数。 分析如何处理具体的flag参数信息,并收集Docker Client所需的配置信息。 分析如何创建一个Docker Client。 第二部分在已有Docker Client的基础上,分

35、析如何执行docker命令。这部分的分析又可分为以下两个步骤。 分析如何解析docker命令中的请求参数,获取相应请求的类型。 分析Docker Client如何执行具体的请求命令,最终将请求发送至Docker Server。 2.2 创建Docker Client 对于Docker这样一个Client/Server的架构,客户端的存在意味着Docker相应任务的发起。用户首先需要创建一个DockerClient,随后将特定的请求类型与参数传递至Docker Client,最终由Docker Client转义成Docker Server能识别的形式,并发送至Docker Server。 Doc

36、ker Client的创建实质上是Docker用户通过二进制可执行文件docker,创建与Docker Server建立联系的客户端。以下分3个小节分别阐述Docker Client的创建流程。 Docker Client完整的运行流程如图2-1所示。 图2-1 DockerClient的运行流程 通过学习图2-1,我们可以更为清晰地了解Docker Client创建及执行请求的过程。其中涉及诸多Docker源码层次中的专有名词,本章后续会一一解释与分析。 2.3 Docker命令执行 main函数执行到这个阶段,有以下内容需要为Docker命令的执行服务:创建完毕的Docker Client

37、,docker命令中的请求参数(经flag解析后存放于flag.Arg()。也就是说,程序需要使用Docker Client来分析Docker命令中的请求参数,得出请求的类型,转义为Docker Server可以识别的请求之后,最终发送给Docker Server。 Docker Client主要完成两方面的工作:解析请求命令,得出请求类型;执行具体类型的请求。本节将从这两个方面深入分析Docker Client。 2.4 总结 本章从源码的角度分析了如何通过docker可执行文件创建Docker Client,最终发送用户请求至Docker Server。 通过学习与理解Docker Cli

38、ent相关的源码实现,不仅可以让用户熟练掌握Docker命令的使用,还可以使用户在特殊情况下有能力修改Docker Client的源码,使其满足自身系统的某些特殊需求,以达 到定制Docker Client的目的,最大限度地发挥Docker开源思想的价值。 第3章 启动Docker Daemon 3.1 引言 自Docker诞生以来,便引领了轻量级虚拟化容器领域的技术热潮。在这一潮流下,Google、IBM、Redhat等业界翘楚纷纷加入Docker阵营。虽然目前Docker仍主要基于Linux平台,但是Microsoft 却多次宣布对Docker的支持,从先前宣布的Azure支持Docker

39、与Kubernetes,到如今宣布的下一代Windows Server原生态支持Docker。Microsoft的这一系列举措多少喻示着向Linux世界的妥协,当然 这也不得不让世人对Docker的巨大影响力有重新的认识。 Docker的影响力不言而喻,但如果需要深入学习Docker的内部实现,最重要的就是理解Docker Daemon。在Docker架构中,Docker Client通过特定的协议与Docker Daemon进行通信,而Docker Daemon主要承载了Docker运行过程中的大部分工作。 Docker Daemon是Docker架构中运行在后台的守护进程,大致可以分为Do

40、cker Server、Engine和Job三部分。三者的关系大致如下:Docker Daemon通过Docker Server模块接收Docker Client的 请求,并在Engine中处理请求,然后根据请求类型,创建出指定的Job并运行。由于用户的请求不同,DockerDaemon会创建不同的Job来完成任务,如:用户发起镜像下载请求,DockerDaemon创建名 为“pull”的Job;用户发起启动容器的请求,DockerDaemon创建名为“start”的Job Docker Daemon的架构如图3-1所示。 本章从源码的角度,主要分析Docker Daemon的启动流程。由于D

41、ocker Daemon和Docker Client的启动流程有很多的相似之处,故本章不再赘述Docker Daemon启动的前期工作、flag参数的解析 等内容,着重分析Docker Daemon启动流程中最为重要的环节:创建Daemon过程中mainDaemon()的实现。 图3-1 DockerDaemon架构示意图 第3章 启动Docker Daemon 3.1 引言 自Docker诞生以来,便引领了轻量级虚拟化容器领域的技术热潮。在这一潮流下,Google、IBM、Redhat等业界翘楚纷纷加入Docker阵营。虽然目前Docker仍主要基于Linux平台,但是Microsoft 却

42、多次宣布对Docker的支持,从先前宣布的Azure支持Docker与Kubernetes,到如今宣布的下一代Windows Server原生态支持Docker。Microsoft的这一系列举措多少喻示着向Linux世界的妥协,当然 这也不得不让世人对Docker的巨大影响力有重新的认识。 Docker的影响力不言而喻,但如果需要深入学习Docker的内部实现,最重要的就是理解Docker Daemon。在Docker架构中,Docker Client通过特定的协议与Docker Daemon进行通信,而Docker Daemon主要承载了Docker运行过程中的大部分工作。 Docker D

43、aemon是Docker架构中运行在后台的守护进程,大致可以分为Docker Server、Engine和Job三部分。三者的关系大致如下:Docker Daemon通过Docker Server模块接收Docker Client的 请求,并在Engine中处理请求,然后根据请求类型,创建出指定的Job并运行。由于用户的请求不同,DockerDaemon会创建不同的Job来完成任务,如:用户发起镜像下载请求,DockerDaemon创建名 为“pull”的Job;用户发起启动容器的请求,DockerDaemon创建名为“start”的Job Docker Daemon的架构如图3-1所示。 本

44、章从源码的角度,主要分析Docker Daemon的启动流程。由于Docker Daemon和Docker Client的启动流程有很多的相似之处,故本章不再赘述Docker Daemon启动的前期工作、flag参数的解析 等内容,着重分析Docker Daemon启动流程中最为重要的环节:创建Daemon过程中mainDaemon()的实现。 图3-1 DockerDaemon架构示意图 3.2 Docker Daemon的启动流程 Docker Daemon和Docker Client的启动均通过可执行文件docker完成,因此两者的启动流程非常相似。Docker可执行文件运行时,程序运行

45、通过不同的命令行flag参数,区分两者,并最终运行两者 各自相应的部分。 启动Docker Daemon时,一般可以使用以下命令:docker-daemon=true、dockerd;docker-d=true等。随后由Docker的main()函数来解析以上命令的相应flag参数,并最终完成Docker Daemon的启动。 首先,附上Docker Daemon的启动流程图,如图3-2所示。 图3-2 DockerDaemon启动流程图 本书第2章已经描述了Docker中main()函数运行的很多前期工作,Docker Daemon的启动也会涉及这些工作,故在此略去相同部分,主要针对后续仅和

46、Docker Daemon相关的内容进行深入分 析,即mainDaemon()的具体源码实现。 3.3 mainDaemon()的具体实现 Docker Daemon的启动流程图展示了DockerDaemon的从无到有。通过分析流程图,我们可以得出一个这样的结论:区分Docker Daemon与Docker Client的关键在于flag参数flDaemon的值。一 旦*flDaemon的值为真,则代表docker二进制需要启动的是Docker Daemon。有关Docker Daemon的所有的工作,都被包含在函数mainDaemon()的具体实现中。 宏观来讲,mainDaemon()的使

47、命是:创建一个守护进程,并保证其正常运行。 从功能的角度来说,mainDaemon()实现了两部分内容:第一,创建Docker运行环境;第二,服务于Docker Client,接收并处理相应请求(完成Docker Server的初始化)。 从实现细节来分析,mainDaemon()的实现流程主要包含以下步骤: 1)daemon的配置初始化。这部分在init()函数中实现,即在mainDaemon()运行前就执行,但由于这部分内容和mainDaemon()的运行息息相关,可以认为是mainDaemon()运行的先决 条件。 2)命令行flag参数检查。 3)创建engine对象。 4)设置eng

48、ine的信号捕获及处理方法。 5)加载builtins。 6)使用goroutine加载daemon对象并运行。 7)打印Docker版本及驱动信息。 8)serveapi的创建与运行。 对于以上内容,本章将一一深入分析。 3.4 总结 本章从源码的角度分析了Docker Daemon的启动,着重分析了mainDaemon()的实现。 Docker Daemon作为Docker架构中的主干部分,负责了Docker内部几乎所有操作的管理。学习Docker Daemon的具体实现,可以对Docker架构有一个较为全面的认识。总结而言,Docker的运行 载体为Daemon,调度管理由Engine负

49、责,任务执行靠Job。 第4章 Docker Daemon之NewDaemon实现 4.1 引言 Docker的生态系统日趋完善,开发者群体也在日趋庞大,这些现象都使得工业界对Docker持续抱有乐观的态度。如今,对于广大开发者而言,使用Docker已然不是门槛,享受Docker带来的福利也不 再困难。然而,如何探寻Docker适应的场景,如何发展Docker周边的技术,以及如何弥合Docker新技术与传统物理机或虚拟机技术之间的鸿沟,已经成为Docker研究者们要思考与解决的问题。 在Docker架构中Docker Daemon支撑着整个后台进程的运行,同时也统一化管理着Docker架构中graph、graphdriver、execdriver、volumes、Docke容器等众多资源。可以说,Docker Daemon 复杂的运作均由daemon对象来调度,而NewDaemon的实现恰巧可以帮助大家了解这一切的来龙去脉。通过本章内容的介绍,我们力求帮助广大Docker爱好者更多地理解Docker的核心Docker Daemon的实现。 本章从源码角度,分析Docker Daemon加载过程中NewDaemon的实现,整个分析过程如图4-1所示。 由图4-1可见,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料


经营许可证编号:宁ICP备18001539号-1