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

【原创】docker源码分析(2)---docker server

时间:2016-04-29 15:08:51      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:

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

本文csdn博文链接:http://blog.csdn.net/screscent/article/details/51279632

上一节,分析了Engine和job。那这一节就开始讲下docker server。

1、docker server

1.1 主体流程

我们从main函数开始,看看docker server是怎么初始化的

docker\docker\docker.go

func main() {

...

技术分享

...

}

因为我们研究的是docker daemon。所以main最终会进入mainDaem

 

我们进入mainDaemon。(这里会跳过一些其他的代码,直接只分析docker server)

代码在docker\docker\daemon.go

技术分享

这里初始化了一个Engine,然后针对docker server来说,重要的是builtins.Register,这里面注册了serverapi的handler。等会我们会进入到里面详细分析

技术分享 

另外在代码的下面,生成了一个serveapi的job,设置了一些环境变量,最后,job Run起来。我们知道job Run里面运行的就是serveapi对应的handler。那么我们继续看看serveapi是怎么注册的

 

1.2 serveapi

在主体流程中,我们已经看到调用了builtins  Register。那么我们看看这里的代码

代码在docker\builtins\builtins.go

技术分享

在Register中,注册了好几个东西。我们这里只看下remote就好。

在remote中,注册了serveapi对应的handler是apiserver.ServeApi

 

下面我们继续跟踪看看serveapi

代码在docker\api\server\server.go

技术分享

主要是protoAddr的识别

技术分享

接下来就是针对每一个protoAddr都开起来一个NewServer,然后向Engine的Shutdown注册回收函数。然后开启服务srv.Serve。

 

1.3、Serve

代码在docker\api\server\server_linux.go (注:我们这里以linux平台源码分析)

技术分享

从NewServer中可以看出,目前支持3个方式。然后通过不同方式构建Server

下面是Server的interface

技术分享

 

这里就以tcp为例

代码在docker\api\server\server.go

技术分享

首先通过createRouter构建了路由

接着构建了一个listener

最后将其封装成了HttpServer,其中的http.Server的handler就是上面构造的路由r

技术分享

这个是newListener函数具体实现

技术分享

这个是HttpServer的接口

 

1.4 Router

Server的运行已经知道了,现在我们来看看路由是怎么构建的

代码在docker\api\server\server.go

技术分享

首先构建了一个mux.NewRouter(这是一个第三方库的路由库)

然后定义了一个路由表GET 所对应的路由路径和相关的处理函数

技术分享

这里是post delete options

技术分享

遍历所有的路由信息,构造成route,将其与对应的path相挂钩。

 

里面的handlerFunc我们看看怎么构建的

技术分享

很简单就是对输入的函数进行了一层封装。前面的流程主要是一些参数的设置。

 

1.5、具体的工作

在Router的时候,我们看到了构建了很多的路由。下面我们简单的介绍几个具体的工作示例。

postContainerExecCreate

技术分享

从函数中,我们看到,构建了一个job 其name是execCreate,然后对接收到的数据进行Decode,最后调用了job.Run,也就是execCreate对于的handler。这个需要去Engine中查找。

 

postContainerRename

技术分享

这里也一样的,调用了container_rename对应的handler。

 

这里我们先不讲execCreate和container_rename的handler是在哪里,以及在哪里注册的。后续的文章我们会继续深入讲解。

 

1.6 小结

Serveapi,从整体流程来看,也是很简单的。利用第三方库github.com/gorilla/mux来构建路由,而对应路由处理handler,需要继续调用其他模块的,都通过构建job方式来与其他模块进行联合工作

 

2、github.com/gorilla/mux

因为有用到mux来构建route,这里简单的分析下

2.1 初始化

源码在docker\vendor\src\github.com\gorilla\mux\mux.go

技术分享

主要结构就是Router,用了一个切片来保存Route

 

下面在server中构建路由的整个过程

技术分享

router path构建route调用route path

技术分享

这里是构建route

 技术分享

这里是route的结构体,其中最主要的是handler

 技术分享

技术分享

技术分享

最后这里是设置handler

 

以上是初始化

 

2.2 工作

ServeHttp就是其工作入口

技术分享

通过match查找相对于的handler

技术分享

遍历所有的route,进行匹配,匹配正确的则返回

 

 

以上就是router的基本工作流程

 

 

 

 

 

龚浩华

QQ 月牙寂 29185807

2016年4月29日

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


【原创】docker源码分析(2)---docker server

标签:

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

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