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

3.3 mainDaemon()的具体实现

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

宏观来讲,mainDaemon()的使命是:创建一个守护进程,并保证其正常运行。

从功能的角度来说,mainDaemon()实现了两部分内容:第一,创建Docker运行环境;第二,服务于Docker Client,接收并处理相应请求(完成Docker Server的初始化)。

从实现细节来分析,mainDaemon()的实现流程主要包含以下步骤:

1)daemon的配置初始化。这部分在init()函数中实现,即在mainDaemon()运行前就执行,但由于这部分内容和mainDaemon()的运行息息相关,可以认为是mainDaemon()运行的先决条件。

2)命令行flag参数检查。

3)创建engine对象。

4)设置engine的信号捕获及处理方法。

5)加载builtins。

6)使用goroutine加载daemon对象并运行。

7)打印Docker版本及驱动信息。

8)serveapi的创建与运行。

对于以上内容,本章将一一深入分析。