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 条评论
登录 后参与评论

相关文章

来自专栏极客猴

学会运用爬虫框架 Scrapy (三)

上篇文章介绍 Scrapy 框架爬取网站的基本用法。但是爬虫程序比较粗糙,很多细节还需打磨。本文主要是讲解 Scrapy 一些小技巧,能让爬虫程序更加完善。

753
来自专栏程序员宝库

IntelliJ IDEA 教程设置讲解

IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、 创新...

764
来自专栏行者常至

(Servlet)Ajax

691
来自专栏安恒信息

人见人爱的vDSO机制,如今也靠不住了

★ 本文旨在介绍vDSO在内核提权中绕过SMEP/PXN的应用 ★ 0x01 vDSO 是什么 孙子兵法最核心的价值观就是:知己知彼,百战不殆。 为了搞清楚v...

3674
来自专栏大内老A

.NET Core的文件系统[1]:读取并监控文件的变化

ASP.NET Core 具有很多针对文件读取的应用。比如我们倾向于采用JSON文件来定义配置,所以应用就会涉及针对配置文件读取。如果用户发送一个针对物理文件的...

4345
来自专栏安富莱嵌入式技术分享

【安富莱TCPnet网络教程】HTTP通信实例

本章节为大家讲解HTTP(HyperText Transfer Protocol,超文本传输协议),从本章节开始,正式进入嵌入式Web的设计和学习。

622
来自专栏前端儿

Web 前端性能优化准则

“只有10%-20%的最终用户响应时间花在接收请求的HTML文档上,剩下的80%-90%时间花在HTML文档所引用的所有组件(图片,script,css,fla...

851
来自专栏大史住在大前端

javascript基础修炼(6)——前端路由的基本原理

现代前端开发中最流行的页面模型,莫过于SPA单页应用架构。单页面应用指的是应用只有一个主页面,通过动态替换DOM内容并同步修改url地址,来模拟多页应用的效果,...

863
来自专栏开源优测

[接口测试 - http.client篇] 16 基于http.client之POM实战一下

概述 关注公众号回复: http.client_pom_demo 获取本文示例源码 你需要了解以下知识和技术,以便掌握后续的实例代码: http.client常...

3438
来自专栏从零开始学自动化测试

jenkins构建触发器定时任务Build periodically和Poll SCM

前言 跑自动化用例每次用手工点击jenkins出发自动化用例太麻烦了,我们希望能每天固定时间跑,这样就不用管了,坐等收测试报告结果就行。 一、定时构建语法 * ...

3955

扫码关注云+社区