docker启动Container进程之启动流程
代码分析起点:daemon/container.go/Start
docker启动containter的起始点在daemon/container.go/Start
方法。
这个方法做了三大方面的事情:
- 配置启动container所需要的环境
- 启动container进程
- 如果container启动失败,做资源回收
1 配置启动container需要的环境
此部分为启动container进程做准备。包括一下几个方面:
1. 构建container的DNS
使用container的setupContainerDns
方法构建container的DNS。 –dns
2. 挂在文件系统
使用Mount
方法配置container的basefs
路径。
3. 初始化网络
使用initialize
方法配置container网络信息,详细分析见docker如果构建bridge网络 。–net
4. 更新parent hosts
使用container的updateParentHosts
方法更新与当前container相关container的etc/hosts
。
5. 验证container资源设置
使用container的verifyDaemonSetting
方法校验container的Me moryLimit
、SwapLimit
和IPv4ForwardingDisable
设置。
6. 卷准备
使用container的prepareVolumes
方法为container启动配置挂载数据卷。 –volume
7. 链接其他container
使用container的setupLinkedContainers
方法配置container需要连接的其他container。 –link
8. 构建工作路径
使用container的setupWorkingDirectory
方法配置container的工作路径。
9. 创建container进程环境
使用container的createDaemonEnvironment
方法配置container内的环境变量。 –env
10. populateCommand
根据步骤9收集到的环境变量,使用populateCommand
构建execdriver命令execdriver.Command
11. 构建mount点
使用container的setupMounts
方法设置container内部的mount配置。
2 启动container进程
在准备好启动container进程的配置后,docker开始创建container进程,使用container的waitForStart
方法完成此项任务。
通过为启动的container创建一个monitor来监控container进程的启动情况,这个地方使用了golang的一个特性:channel。
如果container进程正常启动,那么会在container.monitor.startSigbal
通道受到一个信号;如果在promise.Go(container.monitor.Start)