docker源码分析(2)---docker server

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

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

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

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

上一节,分析了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的基本工作流程

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏格子的个人博客

Jmeter系列二:CSV参数化、BeanShell、服务器监控等进阶使用

关于Jmeter,关于压力/性能测试,本不是我的专业范畴,但是由于前线需要,所以我就上阵了,粗浅涉猎并没有精通,所以哪里有写的不好的,请果断指出,反正我是不会改...

882
来自专栏信安之路

通过POC来学习漏洞的原理

本文介绍的是 easyFTPServer 1.7.0.2 ‘Http’ remote Buffer Overflow 的漏洞执行流程,通过已知的 POC 来推断...

1180
来自专栏嵌入式程序猿

SAE J1939 协议简介(大结局)

由于应用层会根据不同的行业和需求有所不同,所以应用层的开发可以参考标准自行研究,关于这个系列,今天是最后一集,我们来讲讲 J1939的网络管理层(J1939/8...

2918
来自专栏企鹅号快讯

持久层框架—MyBatis

这几天回顾了下以前学的mybatis,特写这篇文章来总结一下。此篇文章只适合有一定编程基础的人。(因为最近想捡一捡我大学学的东西,技术性的文章相对较多,还请谅解...

36811
来自专栏小灰灰

Quick-Task 动态脚本支持框架之使用介绍篇

文章链接:https://liuyueyi.github.io/hexblog/2018/07/19/180719-Quick-Task-动态脚本支持框架之使用...

712
来自专栏专注研发

PageHelper分页插件及通用分页js

物理分页依赖的是某一物理实体,这个物理实体就是数据库,比如MySQL数据库提供了limit关键字,程序员只需要编写带有limit关键字的SQL语句,数据库返回的...

871
来自专栏技术博文

URI与URL的区别

Web上可用的每种资源 - HTML文档、图像、视频片段、程序等 - 由一个通过通用资源标志符(Universal Resource Identifier, 简...

2806
来自专栏伦少的博客

Spark Streamming+Kafka提交offset实现有且仅有一次

3412
来自专栏熊二哥

MyBatis快速入门

这部分内容不是很多,主要在于具体的应用,之后会针对痛点持续更新。 ? 概念 相对于全自动映射框架Hibernate,MyBatis是一个半自动映射框架,其需...

1966
来自专栏酷玩时刻

PC 微信扫码登陆

网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。进一步了解OAuth2.0-----理解OAuth2.0 官方介绍资料

864

扫码关注云+社区