【原创】docker源码分析(1)---框架与engine
2016-04-28 11:33
579 查看
本文的QQ空间链接:http://user.qzone.qq.com/29185807/blog/1461813727
本文的csdn博文链接:/article/9299813.html
源码为docker 1.6.2版本
为啥要用1.6.2版本,这是因为我买了一本书《Docker容器与容器云》,这本书里面也是用的1.6.2版本。
一边可以学习这本书,一边研究源码,事半功倍。除了这本书,现在网上也有很多讲解docker分析的。为了和其他的不同,我们这里主要是针对源代码进行分析。
那么首先大致介绍下框架
现在在网上已经有很多这样的框架介绍。如果没有看过的,我推荐http://www.sel.zju.edu.cn/?p=112 这里有完整的框架介绍。下面的图片就转自于此
![](http://img.blog.csdn.net/20160428112615268)
这个框架图,已经完整的体现出了整个docker的流程。其中engine是整个框架中的一个胶水模块,起着粘连其他所有模块的重要部分。下面我们就先对engine源码做详细分析
废话不多说,直接看源码
源码在docker\engine\engine.go
![](http://img.blog.csdn.net/20160428112635909)
Engine功能很简单,主要有几个功能
1、handler管理功能。其他所有模块都会将其带有的功能,以handler的方式注册到Engine中。涉及的变量有handlers,是一个map
2、job管理功能,这里有sync.WaitGroup,用于记录当前工作的job
那么看看Engine都提供了哪些接口
![](http://img.blog.csdn.net/20160428112648806)
两个handler注册接口
Register用于其他模块注册其提供的工作handler。很简单就是一个map,用于保存对应的handler
RegisterCatchall 用于注册非法job,获取的handler
handler接口为一个函数对象
![](http://img.blog.csdn.net/20160428112723743)
另外还有一个全局的handler
![](http://img.blog.csdn.net/20160428112736212)
也是一个全局的handler map,用于在初始化Engine之前注册
![](http://img.blog.csdn.net/20160428112829754)
初始化很简单,主要工作就是注册了一个commands的handler,另外将全局的handlers拷贝到自己的handlers中
我们看看commands提供的具体handler
![](http://img.blog.csdn.net/20160428112845349)
这里就是将handlers中所有提供的操作,收集起来,方便提供查询
![](http://img.blog.csdn.net/20160428112914021)
创建job。从源码来看,初始化了job的结构体。 然后最主要的是handler的初始化,这里从Engine中已经注册的handlers中,根据name,来查找相对于的handler。如果没有查找到,就属于非法的,就赋值为catchall
在系统结束的时候,会调用Engine的shutdown。
在shutdown之前,也可以注册callback,用于在shutdown的时候进行处理
![](http://img.blog.csdn.net/20160428112928302)
将h添加到onShutdown切片中,并用shutdownWait记录数量
shutdown函数提供几个功能
1、拒绝新的job
2、等待所有active jobs工作完成(这里的job指的是没有超时的job)
3、调用onShutdown注册的所有回调函数
4、当所有的jobs完成时,或者超时15秒的时候,return
![](http://img.blog.csdn.net/20160428112941771)
首先将shutdown,标志位设置为true
![](http://img.blog.csdn.net/20160428112954740)
接着等待jobs完成工作,或等待5秒超时
![](http://img.blog.csdn.net/20160428113007756)
启动所有的Shutdown回调,并等待回调结束,或者是超时10秒,然后退出。
Engine功能简单,代码也很简单,就是一个job的管理器,以及handler的管理器
job是整个docker源码中的基本工作单位,下面我们看看job是怎么 的
![](http://img.blog.csdn.net/20160428113026944)
结构体中,最重要的东西有
handler,这个就是job重点,是在Engine Create job的时候,获取到的
name,是job的工作command
env,这个是一个环境变量
整体来讲,job就是一个对任务的包装,它将任务的所需要的所有东西都准备好
前面我们将job所需要的所有前期东西都准备好,那么现在就要开始工作了
![](http://img.blog.csdn.net/20160428113057257)
这里有一个特殊的job serveapi,它将不记录在eng的task中,其余所有的job都将记录在eng的task中,这个主要用于eng在Shutdown的时候,用于等待job完成工作
![](http://img.blog.csdn.net/20160428113111539)
真正的工作,是在这里,在handler中。
![](http://img.blog.csdn.net/20160428113127526)
最后,就是将io关闭。
job的源码更简单,就是一个简单的前期的准备,然后工作的时候,调用了相对应的handler
龚浩华
QQ 月牙寂 29185807
2016年4月28日
(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)
本文的csdn博文链接:/article/9299813.html
源码为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日
(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)
相关文章推荐
- Centos 下安装Docker 遇到的一些错误
- Docker入门笔记_1_安装docker
- Docker--使用Dockerfile创建镜像--RHEL7.2
- Docker计划将镜像迁移至Alpine Linux平台,简化容器运行环境
- 为Docker容器设置固定IP实现网络联通(1)——通过Pipework为Docker容器设置
- CentOS6.5 下安装Docker
- 自己学Docker:6.Docker的数据持久化之数据卷容器
- centos7安装docker并设置开机启动
- Docker网络基础配置--RHEL7.2
- 【云计算虚拟化】Docker的基本命令使用
- kubernetes调度详解
- Docker配置指南系列(三):Dockerfile(一)
- kubernetes1.2如何操作Docker
- 剖析Docker文件系统:Aufs与Devicemapper
- Docker基础技术:AUFS
- 从iso到docker image
- centos6.5上使用docker
- Docker--容器中数据管理--RHEL7.2
- namespaces之 User Namespace机制
- docker 报错Failed to start Docker Storage Setup. 的处理基本都是容器满了