码迷,mamicode.com
首页 > 其他好文 > 详细

【原创】docker源码分析(4)---execdriver

时间:2016-05-06 13:03:10      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:

本文的QQ空间链接:http://user.qzone.qq.com/29185807/blog/1462433268

本文的csdn博文的链接:http://blog.csdn.net/screscent/article/details/51323358

execdriver通过lxc或者libcontainer来实现资源隔离。本文就来简单分析下execdriver。

 

1、上层初始化

代码在docker\daemon\daemon.go

在函数NewDaemonFromDirectory

技术分享

初始化了execdriver,并将其赋值到daemon的成员变量中。

这里就是execdriver的开启地方。

 

 

2、execdriver插件

目前execdriver支持两种模式

代码在docker\daemon\execdriver\execdrivers\execdrivers.go

技术分享

这里面有lxc模式,还有native模式(这个模式其实就是对libcontainer的封装)

 

2.1、Driver接口

然后我们看看Driver的接口

代码在docker\daemon\execdriver\driver.go

技术分享

看到这里,我们就应该很兴奋了,这里就封装了容器的运行。

 

里面的参数都需要一个Command

我们看看这个结构体

技术分享

封装了容器运行所需要的参数

 

其中command里面有几个成员是比较值得注意的。

技术分享

技术分享

上面两个是Network的信息,这个就需要用到networkdriver了

 

还有ipc、pid、resources、mount等就不贴图出来了。

 

 

3、native

下面就简单看下native的driver

代码在docker\daemon\execdriver\native\driver.go

先看结构体

技术分享

里面有一个activeContainers用于保存container

接着是初始化函数

技术分享

里面封装了libcontainer的东西

 

下面我们看看其提供的一些操作

 

 

 

3.1、createContainer

在看createContainer之前我们先看看InitContainer

代码在docker\daemon\execdriver\driver.go

技术分享

做了一些参数的设置

下面我们进入createContainer

代码在docker\daemon\execdriver\native\create.go

技术分享

先初始化Container,然后创建ipc、pid、network

技术分享

设置了capabilities和groups

技术分享

设置mount,labels,还有limit,最后返回了libContainer中的对象Container

 

3.2、 Run

代码在docker\daemon\execdriver\native\driver.go

技术分享

先创建了Container,然后初始化了一个process

技术分享

接着设置tty

技术分享

然后又封装了一层,由libcontaer的Factory生成了cont

最后将cont添加到了activeContainers(这个就是driver结构体中用来保存的Container的一个map)

 

下面就是启动了

技术分享

技术分享

  

3.3、Exec

我们看源码

代码在docker\daemon\execdriver\native\exec.go

技术分享

exec流程和Run流程基本是一样的,不同的地方就是Run是新创建Container,而exec则是从activeContainer中去查找已经创建过的Container

查找到了之后,流程就是一样的了

技术分享 

3.4 Kill

代码在docker\daemon\execdriver\native\driver.go

技术分享

kill很简单,就是查找到相对于的Container,然后发送一个信号给他

 

3.5 小结

还有很多的操作,这里就不一一贴图出来了。大致的流程应该是比较清晰了。如果还需要继续深入的话,那就需要去分析libContainer的代码了

4、总结

execdriver依旧采用的插件方式。代码还是很清晰的。只是底层涉及到lxc和libContainer,如果还需要继续深入的话,就需要对这两个东西做一些分析。

 

 

文中如果有哪里讲解的不对的地方,还请见谅,望指正。

龚浩华

QQ 月牙寂 29185807

2016年5月5日

(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)


【原创】docker源码分析(4)---execdriver

标签:

原文地址:http://blog.csdn.net/screscent/article/details/51323358

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!