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

本文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日

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

时间: 2024-07-29 23:25:11

【原创】docker源码分析(5)---daemon的相关文章

docker 源码分析 一(基于1.8.2版本),docker daemon启动过程;

最近在研究golang,也学习一下比较火的开源项目docker的源代码,国内比较出名的docker源码分析是孙宏亮大牛写的一系列文章,但是基于的docker版本有点老:索性自己就git 了一下最新的代码研读: docker是c/s的架构,分为docker client 和 docker daemon,client端发送命令,daemon端负责完成client发送过来的命令(如获取和存储镜像.管理容器等).两者之间可以通过TCP,HTTP和UNIX SOCKET来进行通信: docker的启动入口

Docker源码分析(三):Docker Daemon启动

1 前言 Docker诞生以来,便引领了轻量级虚拟化容器领域的技术热潮.在这一潮流下,Google.IBM.Redhat等业界翘楚纷纷加入Docker阵营.虽然目前Docker仍然主要基于Linux平台,但是Microsoft却多次宣布对Docker的支持,从先前宣布的Azure支持Docker与Kubernetes,到如今宣布的下一代Windows Server原生态支持Docker.Microsoft的这一系列举措多少喻示着向Linux世界的妥协,当然这也不得不让世人对Docker的巨大影响

Docker源码分析(四):Docker Daemon之NewDaemon实现

1. 前言 Docker的生态系统日趋完善,开发者群体也在日趋庞大,这让业界对Docker持续抱有极其乐观的态度.如今,对于广大开发者而言,使用Docker这项技术已然不是门槛,享受Docker带来的技术福利也不再是困难.然而,如何探寻Docker适应的场景,如何发展Docker周边的技术,以及如何弥合Docker新技术与传统物理机或VM技术的鸿沟,已经占据Docker研究者们的思考与实践. 本文为<Docker源码分析>第四篇——Docker Daemon之NewDaemon实现,力求帮助广

Docker源码分析(六):Docker Daemon网络

1. 前言 Docker作为一个开源的轻量级虚拟化容器引擎技术,已然给云计算领域带来了新的发展模式.Docker借助容器技术彻底释放了轻量级虚拟化技术的威力,让容器的伸缩.应用的运行都变得前所未有的方便与高效.同时,Docker借助强大的镜像技术,让应用的分发.部署与管理变得史无前例的便捷.然而,Docker毕竟是一项较为新颖的技术,在Docker的世界中,用户并非一劳永逸,其中最为典型的便是Docker的网络问题. 毋庸置疑,对于Docker管理者和开发者而言,如何有效.高效的管理Docker

Docker源码分析之——Docker Client的启动与命令执行

在上文Docker源码分析之--Docker Daemon的启动 中,介绍了Docker Daemon进程的启动.Docker Daemon可以认为是一个Docker作为Server的运行载体,而真正发送关于docker container操作的请求的载体,在于Docker Client.本文从Docker源码的角度,分析Docker Client启动与执行请求的过程. Docker Client启动的流程与Docker Daemon启动的过程相仿.首先执行reexec.Init():随后解析f

docker 源码分析 四(基于1.8.2版本),Docker镜像的获取和存储

前段时间一直忙些其他事情,docker源码分析的事情耽搁了,今天接着写,上一章了解了docker client 和 docker daemon(会启动一个http server)是C/S的结构,client端发出的命令由docker daemon接收并处理. 我们在运行docker的时候,可能会使用到docker run命令(当然通过Dockerfile运行docker build命令也是一样的)时,如果本地没有你需要的镜像,docker daemon首先会去下载你需要的docker镜像,然后存

Docker源码分析(一):Docker架构

[编者按]在<深入浅出Docker>系列文章的基础上,InfoQ推出了<Docker源码分析>系列文章.<深入浅出Docker>系列文章更多的是从使用角度出发,帮助读者了解Docker的来龙去脉,而<Docker源码分析>系列文章通过分析解读Docker源码,来让读者了解Docker的内部实现,以更好的使用Docker.总之,我们的目标是促进Docker在国内的发展以及传播.另外,欢迎加入InfoQ Docker技术交流群,QQ群号:272489193. 1

Docker源码分析(二):Docker Client创建与命令执行

1. 前言 如今,Docker作为业界领先的轻量级虚拟化容器管理引擎,给全球开发者提供了一种新颖.便捷的软件集成测试与部署之道.在团队开发软件时,Docker可以提供可复用的运行环境.灵活的资源配置.便捷的集成测试方法以及一键式的部署方式.可以说,Docker的优势在简化持续集成.运维部署方面体现得淋漓尽致,它完全让开发者从持续集成.运维部署方面中解放出来,把精力真正地倾注在开发上. 然而,把Docker的功能发挥到极致,并非一件易事.在深刻理解Docker架构的情况下,熟练掌握Docker C

Docker源码分析(五):Docker Server的创建

1.Docker Server简介 Docker架构中,Docker Server是Docker Daemon的重要组成部分.Docker Server最主要的功能是:接受用户通过Docker Client发送的请求,并按照相应的路由规则实现路由分发. 同时,Docker Server具备十分优秀的用户友好性,多种通信协议的支持大大降低Docker用户使用Docker的门槛.除此之外,Docker Server设计实现了详尽清晰的API接口,以供Docker用户选择使用.通信安全方面,Docke

Docker源码分析(九):Docker镜像

1.前言 回首过去的2014年,大家可以看到Docker在全球刮起了一阵又一阵的“容器风”,工业界对Docker的探索与实践更是一波高过一波.在如今的2015年以及未来,Docker似乎并不会像其他昙花一现的技术一样,在历史的舞台上热潮褪去,反而在工业界实践与评估之后,显现了前所未有的发展潜力. 究其本质,“Docker提供容器服务”这句话,相信很少有人会有异议.那么,既然Docker提供的服务属于“容器”技术,那么反观“容器”技术的本质与历史,我们又可以发现什么呢?正如前文所提到的,Docke