Docker源码分析
上QQ阅读APP看书,第一时间看更新

第3章 启动Docker Daemon

3.1 引言

自Docker诞生以来,便引领了轻量级虚拟化容器领域的技术热潮。在这一潮流下,Google、IBM、Redhat等业界翘楚纷纷加入Docker阵营。虽然目前Docker仍主要基于Linux平台,但是Microsoft却多次宣布对Docker的支持,从先前宣布的Azure支持Docker与Kubernetes,到如今宣布的下一代Windows Server原生态支持Docker。Microsoft的这一系列举措多少喻示着向Linux世界的妥协,当然这也不得不让世人对Docker的巨大影响力有重新的认识。

Docker的影响力不言而喻,但如果需要深入学习Docker的内部实现,最重要的就是理解Docker Daemon。在Docker架构中,Docker Client通过特定的协议与Docker Daemon进行通信,而Docker Daemon主要承载了Docker运行过程中的大部分工作。

Docker Daemon是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所示。

本章从源码的角度,主要分析Docker Daemon的启动流程。由于Docker Daemon和Docker Client的启动流程有很多的相似之处,故本章不再赘述Docker Daemon启动的前期工作、flag参数的解析等内容,着重分析Docker Daemon启动流程中最为重要的环节:创建Daemon过程中mainDaemon()的实现。

图3-1 DockerDaemon架构示意图