说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。
申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。
龚浩华,QQ 29185807,月牙寂 道长
第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang
execdriver通过lxc或者libcontainer来实现资源隔离。本文就来简单分析下execdriver。
代码在docker\daemon\daemon.go
在函数NewDaemonFromDirectory中
初始化了execdriver,并将其赋值到daemon的成员变量中。
这里就是execdriver的开启地方。
目前execdriver支持两种模式
代码在docker\daemon\execdriver\execdrivers\execdrivers.go
这里面有lxc模式,还有native模式(这个模式其实就是对libcontainer的封装)
然后我们看看Driver的接口
代码在docker\daemon\execdriver\driver.go
看到这里,我们就应该很兴奋了,这里就封装了容器的运行。
里面的参数都需要一个Command
我们看看这个结构体
封装了容器运行所需要的参数
其中command里面有几个成员是比较值得注意的。
上面两个是Network的信息,这个就需要用到networkdriver了
还有ipc、pid、resources、mount等就不贴图出来了。
下面就简单看下native的driver
代码在docker\daemon\execdriver\native\driver.go
先看结构体
里面有一个activeContainers用于保存container
接着是初始化函数
里面封装了libcontainer的东西
下面我们看看其提供的一些操作
在看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
代码在docker\daemon\execdriver\native\driver.go
先创建了Container,然后初始化了一个process
接着设置tty
然后又封装了一层,由libcontaer的Factory生成了cont
最后将cont添加到了activeContainers(这个就是driver结构体中用来保存的Container的一个map)
下面就是启动了
我们看源码
代码在docker\daemon\execdriver\native\exec.go
exec流程和Run流程基本是一样的,不同的地方就是Run是新创建Container,而exec则是从activeContainer中去查找已经创建过的Container
查找到了之后,流程就是一样的了
代码在docker\daemon\execdriver\native\driver.go
kill很简单,就是查找到相对于的Container,然后发送一个信号给他
还有很多的操作,这里就不一一贴图出来了。大致的流程应该是比较清晰了。如果还需要继续深入的话,那就需要去分析libContainer的代码了
execdriver依旧采用的插件方式。代码还是很清晰的。只是底层涉及到lxc和libContainer,如果还需要继续深入的话,就需要对这两个东西做一些分析。
文中如果有哪里讲解的不对的地方,还请见谅,望指正。