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

【原创】docker源码分析(5)---daemon

时间:2016-05-06 12:10:35      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:

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

本文csdn博客链接为:http://blog.csdn.net/screscent/article/details/51328946

daemon是docker中最主要的部分,其中封装了所有的东西。

下面我们直接看代码吧

 

1、初始化流程

main函数

docker\docker\docker.go

技术分享

main函数中进入mainDaemon

技术分享

在mainDaemon中,初始化 NewDaemon

 

代码在docker\daemon\daemon.go

技术分享

其实是调用了NewDaemonFromDirectory

技术分享

网络部分参数的检查

技术分享

我们继续

技术分享

再继续

技术分享

我们看到了graphdriver的初始化

技术分享

还有很多的driver的初始化

技术分享

tagStore的初始化,networkdriver的初始化

技术分享

graphdb的初始化

技术分享

execdriver的初始化,然后是Daemon结构体初始化

技术分享

 整个初始化,很长,但所有的准备工作都初始化好了。

 

2、Install

向Engine中注册处理handler

技术分享

技术分享

这里注册了很多的处理命令,在注册完之后,也还调用了repositores的注册,和trustStore的注册。

看到上面所注册的命令,我们应该很熟悉了(如果对docker命令有用过的话)

 

 

3、Handler

下面就简单讲解下注册的handler

3.1、Create

Create命令,相对应的注册为ContainerCreate

我们进入跟踪看看

代码在docker\daemon\create.go

技术分享

获取参数,然后对参数进行检查

技术分享

参数准备好后,进入了Create函数

技术分享 

我们来看看Create函数

技术分享

先查找image

技术分享

接着参数检查,创建了一个新的Container,然后将其注册放到一个存储里。一会会介绍

技术分享

然后就是一些其他的操作。

 

3.1.1、 newContainer

我们看看newContainer

技术分享


3.1.2、 register

这里要讲下Daemon结构体有一个成员

技术分享

contStore

代码在docker\daemon\daemon.go

技术分享

代码很简单,就是一个带锁的map

 

现在进入register

技术分享

技术分享

首先是防止重入,判断是否已经存在。

然后依旧还是一些参数的初始化,继续

技术分享

这里面将其添加到containers中

技术分享

技术分享

这里的操作是Create,如果Container正在运行的话,将其kill掉

 

 

3.2、execCreate

execCreate对应的handler是ContainerExecCreate

代码在docker\daemon\exec.go

技术分享

先从getActiveContainer获取到Container,然后从获取config等

技术分享

然后构建了execConfig,调用registerExecCommand进行注册

 

3.2.1 getActiveContainer

这里是获取Container

技术分享

并判断是否是存活的

 技术分享

这里的get就是从Containers(一个带锁的map)中获取到的

 

3.2.2 registerExecCommand

在讲解着 之前,我们看看Daemon结构体中有一个成员execStore

技术分享

技术分享

execStore也是一个带锁的map

技术分享

从这里来看在Container结构体中冶有一个execStore的map

 

 

3.3 execStart

execStart 对应的handler是ContainerExecStart

技术分享

先获取execconfig

技术分享

技术分享

 上面有一个Attach,就是一个输入输出的attach。

最关键的地方在这里,调用了Container.Exec

技术分享

 

 

3.3.1 getExecConfig

技术分享

这里就是从execStore中查找到对应的execConfig

 

3.3.2 Container. Exec

最终进入的是Container.Exec

我们看看这个函数

技术分享

构造了一个callback

技术分享

调用了monitorExec

继续跟踪

技术分享

这里又重新回到了Daemon.Exec

 

3.3.3、Daemon.Exec

最终的执行还是进入到了Daemon.Exec

技术分享

从代码中看出,最后进入了execDriver.Exec

 

3.3.4 小结

这里讲解了部分的handler,但基本流程都已经清晰了。其他的handler就不再做详细讲解

4、总结

Daemon是整个框架的管理员,管理着几乎所有的模块。并向Engine注册了很多的command handler,是整个的核心部分。

 

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

 

龚浩华

QQ 月牙寂 29185807

2016年5月6日

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


【原创】docker源码分析(5)---daemon

标签:

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

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