docker源码分析(5)---daemon

说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。

申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。

龚浩华,QQ 29185807,月牙寂 道长

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

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,是整个的核心部分。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏互联网高可用架构

初识消息队列处理机模板KClientKafka客户端(KClient)

1513
来自专栏钟绍威的专栏

装配bean

spring有三种装配bean的方式:隐式装配、java代码装配、xml装配 隐式装配最为省事方便,也称为自动化装配 这三种装配方式可以混搭着来用 在这里通...

1739
来自专栏蓝天

Zookeeper客户端cli_st为何在crontab中运行不正常?

实践中,发现直接在命令行终端运行cli_st时,能够得到预期的结果,但一将它放到crontab中,则只收到:

831
来自专栏编程软文

快速上手友盟推送前后端

2415
来自专栏静默虚空的博客

spring 4 升级踩雷指南

spring 4 升级踩雷指南 前言 最近,一直在为公司老项目做核心库升级工作。本来只是想升级一下 JDK8 ,却因为兼容性问题而不得不升级一些其他的库,而其他...

3399
来自专栏Java架构师学习

Java程序员必知的并发编程艺术——并发机制的底层原理实现

Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。 volatile借助Java内存模型...

36311
来自专栏从零开始的linux

kvm安装

yum install -y kvm virt-* libvirt bridge-utils qemu-img 是否加载模块 lsmod |grep kvm...

3215
来自专栏Python

flask celery 使用方法

由于celery4.0不支持window,如果在window上安装celery4.0将会出现下面的错误

2840
来自专栏用户2442861的专栏

tinyhttpd 剖析

http://blog.csdn.net/jcjc918/article/details/42129311

862
来自专栏闵开慧

tomcat6.0下找不到jasper-runtime.jar

今天有点需求,需要用jasper-runtime.jar包。但是我在我的\apache-tomcat-6.0.16\lib目录下,怎么也找不到这个jar包。结果...

2975

扫码关注云+社区