docker源码分析(1)---框架与engine

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

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

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

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

源码为docker 1.6.2版本

为啥要用1.6.2版本,这是因为我买了一本书《Docker容器与容器云》,这本书里面也是用的1.6.2版本。

一边可以学习这本书,一边研究源码,事半功倍。除了这本书,现在网上也有很多讲解docker分析的。为了和其他的不同,我们这里主要是针对源代码进行分析。

那么首先大致介绍下框架

1、框架

现在在网上已经有很多这样的框架介绍。如果没有看过的,我推荐http://www.sel.zju.edu.cn/?p=112 这里有完整的框架介绍。下面的图片就转自于此

这个框架图,已经完整的体现出了整个docker的流程。其中engine是整个框架中的一个胶水模块,起着粘连其他所有模块的重要部分。下面我们就先对engine源码做详细分析

2、engine

废话不多说,直接看源码

源码在docker\engine\engine.go

2.1、结构体

Engine功能很简单,主要有几个功能

1、handler管理功能。其他所有模块都会将其带有的功能,以handler的方式注册到Engine中。涉及的变量有handlers,是一个map

2、job管理功能,这里有sync.WaitGroup,用于记录当前工作的job

那么看看Engine都提供了哪些接口

2.2、 注册接口

两个handler注册接口

Register用于其他模块注册其提供的工作handler。很简单就是一个map,用于保存对应的handler

RegisterCatchall 用于注册非法job,获取的handler

handler接口为一个函数对象

另外还有一个全局的handler

也是一个全局的handler map,用于在初始化Engine之前注册

2.3、初始化

初始化很简单,主要工作就是注册了一个commands的handler,另外将全局的handlers拷贝到自己的handlers中

我们看看commands提供的具体handler

这里就是将handlers中所有提供的操作,收集起来,方便提供查询

2.4、Create job

创建job。从源码来看,初始化了job的结构体。 然后最主要的是handler的初始化,这里从Engine中已经注册的handlers中,根据name,来查找相对于的handler。如果没有查找到,就属于非法的,就赋值为catchall

2.5、shutdown

在系统结束的时候,会调用Engine的shutdown。

在shutdown之前,也可以注册callback,用于在shutdown的时候进行处理

将h添加到onShutdown切片中,并用shutdownWait记录数量

shutdown函数提供几个功能

1、拒绝新的job

2、等待所有active jobs工作完成(这里的job指的是没有超时的job)

3、调用onShutdown注册的所有回调函数

4、当所有的jobs完成时,或者超时15秒的时候,return

首先将shutdown,标志位设置为true

接着等待jobs完成工作,或等待5秒超时

启动所有的Shutdown回调,并等待回调结束,或者是超时10秒,然后退出。

2.6、小结

Engine功能简单,代码也很简单,就是一个job的管理器,以及handler的管理器

3、job

job是整个docker源码中的基本工作单位,下面我们看看job是怎么 的

3.1、结构体

结构体中,最重要的东西有

handler,这个就是job重点,是在Engine Create job的时候,获取到的

name,是job的工作command

env,这个是一个环境变量

整体来讲,job就是一个对任务的包装,它将任务的所需要的所有东西都准备好

3.2 Run

前面我们将job所需要的所有前期东西都准备好,那么现在就要开始工作了

这里有一个特殊的job serveapi,它将不记录在eng的task中,其余所有的job都将记录在eng的task中,这个主要用于eng在Shutdown的时候,用于等待job完成工作

真正的工作,是在这里,在handler中。

最后,就是将io关闭。

3.3、小结

job的源码更简单,就是一个简单的前期的准备,然后工作的时候,调用了相对应的handler

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏互扯程序

30分钟如何学会使用Shiro

现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。

1075
来自专栏落影的专栏

iOS开发笔记(六)

前言 专注、坚持,是优良的品格。 正文 1、cell和cell.contentView 的区别 在给UITableViewCell添加视图的时候,我们有以下两种...

3245
来自专栏编程微刊

ajax和axios请求本地json数据对比

AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术,通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重...

1324
来自专栏为数不多的Android技巧

如何安全地打印日志

如何打印日志?这不是很简单,直接使用android.util.Log这个类不就行了?然而,日志属于非常敏感的信息;逆向工程师在逆向你的程序的时候,本来需要捕捉你...

783
来自专栏xingoo, 一个梦想做发明家的程序员

TDDL与Spring Boot集成Version报错——跟踪与解决

先说背景:公司采用diamond+tddl,这套技术来做web管理。本人处于好奇率先体验了下spring-boot,于是就有了spring-boot+tddl...

2079
来自专栏进击的程序猿

php异常处理 之 BooBoo库介绍

本文介绍php开源库BooBoo,是一个处理php异常和错误的开源库,通过简单的分析代码,我们知道了实际项目中怎么正确的设置错误和异常。

632
来自专栏高性能服务器开发

+从零实现一款12306刷票软件1.1

郑重申明一下:这里介绍的技术仅供用于学习,不可用于恶意攻击12306服务器,请勿滥用本文介绍的技术。对12306服务器造成的任何损失,后果自负。

992
来自专栏十月梦想

Express框架之路由初识

Express框架是后台的Node框架,所以和jQuery、zepto、yui、bootstrap都不一个东西。

443
来自专栏IT笔记

SpringBoot开发案例之奇技淫巧

程序员都有着一种天生的好奇心,这种好奇心引导着我们的编程生涯。写几行代码,装载到计算机里,让它按照你的思路工作,这是非常有趣的事情。但随着开发的东西越来越多,我...

54110
来自专栏王磊的博客

IE与IE内核浏览器的那点事

真正的IE浏览器与IE内核的浏览器是不是一回事呢,是不是完全一样咧?如果不一样又有什么关系咧?下面一起来找答案吧! 知识补给:   1.浏览内核 简介   2....

3336

扫码关注云+社区