本文的QQ空间链接:http://user.qzone.qq.com/29185807/blog/1461813727
本文的csdn博文链接:http://blog.csdn.net/screscent/article/details/51272978
源码为docker 1.6.2版本
为啥要用1.6.2版本,这是因为我买了一本书《Docker容器与容器云》,这本书里面也是用的1.6.2版本。
一边可以学习这本书,一边研究源码,事半功倍。除了这本书,现在网上也有很多讲解docker分析的。为了和其他的不同,我们这里主要是针对源代码进行分析。
那么首先大致介绍下框架
1、框架
现在在网上已经有很多这样的框架介绍。如果没有看过的,我推荐http://www.sel.zju.edu.cn/?p=112 这里有完整的框架介绍。下面的图片就转自于此
这个框架图,已经完整的体现出了整个docker的流程。其中engine是整个框架中的一个胶水模块,起着粘连其他所有模块的重要部分。下面我们就先对engine源码做详细分析
2、engine
废话不多说,直接看源码
源码在docker\engine\engine.go
2.1、结构体
Engine功能很简单,主要有几个功能
1、handler管理功能。其他所有模块都会将其带有的功能,以handler的方式注册到Engine中。涉及的变量有handlers,是一个map
2、job管理功能,这里有sync.WaitGroup,用于记录当前工作的job
那么看看Engine都提供了哪些接口
2.2、 注册接口
两个handler注册接口
Register用于其他模块注册其提供的工作handler。很简单就是一个map,用于保存对应的handler
RegisterCatchall 用于注册非法job,获取的handler
handler接口为一个函数对象
另外还有一个全局的handler
也是一个全局的handler map,用于在初始化Engine之前注册
2.3、初始化
初始化很简单,主要工作就是注册了一个commands的handler,另外将全局的handlers拷贝到自己的handlers中
我们看看commands提供的具体handler
这里就是将handlers中所有提供的操作,收集起来,方便提供查询
2.4、Create job
创建job。从源码来看,初始化了job的结构体。 然后最主要的是handler的初始化,这里从Engine中已经注册的handlers中,根据name,来查找相对于的handler。如果没有查找到,就属于非法的,就赋值为catchall
2.5、shutdown
在系统结束的时候,会调用Engine的shutdown。
在shutdown之前,也可以注册callback,用于在shutdown的时候进行处理
将h添加到onShutdown切片中,并用shutdownWait记录数量
shutdown函数提供几个功能
1、拒绝新的job
2、等待所有active jobs工作完成(这里的job指的是没有超时的job)
3、调用onShutdown注册的所有回调函数
4、当所有的jobs完成时,或者超时15秒的时候,return
首先将shutdown,标志位设置为true
接着等待jobs完成工作,或等待5秒超时
启动所有的Shutdown回调,并等待回调结束,或者是超时10秒,然后退出。
2.6、小结
Engine功能简单,代码也很简单,就是一个job的管理器,以及handler的管理器
3、job
job是整个docker源码中的基本工作单位,下面我们看看job是怎么 的
3.1、结构体
结构体中,最重要的东西有
handler,这个就是job重点,是在Engine Create job的时候,获取到的
name,是job的工作command
env,这个是一个环境变量
整体来讲,job就是一个对任务的包装,它将任务的所需要的所有东西都准备好
3.2 Run
前面我们将job所需要的所有前期东西都准备好,那么现在就要开始工作了
这里有一个特殊的job serveapi,它将不记录在eng的task中,其余所有的job都将记录在eng的task中,这个主要用于eng在Shutdown的时候,用于等待job完成工作
真正的工作,是在这里,在handler中。
最后,就是将io关闭。
3.3、小结
job的源码更简单,就是一个简单的前期的准备,然后工作的时候,调用了相对应的handler
龚浩华
QQ 月牙寂 29185807
2016年4月28日
(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)