【原创】docker源码分析(2)---docker server
2016-04-29 10:20
826 查看
本文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1461895517
本文csdn博文链接:/article/9299814.html
上一节,分析了Engine和job。那这一节就开始讲下docker server。
我们从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是怎么注册的
在主体流程中,我们已经看到调用了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。
代码在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的接口
Server的运行已经知道了,现在我们来看看路由是怎么构建的
代码在docker\api\server\server.go
首先构建了一个mux.NewRouter(这是一个第三方库的路由库)
然后定义了一个路由表GET 所对应的路由路径和相关的处理函数
这里是post delete options
遍历所有的路由信息,构造成route,将其与对应的path相挂钩。
里面的handlerFunc我们看看怎么构建的
很简单就是对输入的函数进行了一层封装。前面的流程主要是一些参数的设置。
在Router的时候,我们看到了构建了很多的路由。下面我们简单的介绍几个具体的工作示例。
postContainerExecCreate
从函数中,我们看到,构建了一个job 其name是execCreate,然后对接收到的数据进行Decode,最后调用了job.Run,也就是execCreate对于的handler。这个需要去Engine中查找。
postContainerRename
这里也一样的,调用了container_rename对应的handler。
这里我们先不讲execCreate和container_rename的handler是在哪里,以及在哪里注册的。后续的文章我们会继续深入讲解。
Serveapi,从整体流程来看,也是很简单的。利用第三方库github.com/gorilla/mux来构建路由,而对应路由处理handler,需要继续调用其他模块的,都通过构建job方式来与其他模块进行联合工作
因为有用到mux来构建route,这里简单的分析下
源码在docker\vendor\src\github.com\gorilla\mux\mux.go
主要结构就是Router,用了一个切片来保存Route
下面在server中构建路由的整个过程
router path构建route调用route path
这里是构建route
这里是route的结构体,其中最主要的是handler
最后这里是设置handler
以上是初始化
ServeHttp就是其工作入口
通过match查找相对于的handler
遍历所有的route,进行匹配,匹配正确的则返回
以上就是router的基本工作流程
龚浩华
QQ 月牙寂 29185807
2016年4月29日
(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)
本文csdn博文链接:/article/9299814.html
上一节,分析了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 exec与Docker attach
- Docker Hub 的伟大在那里?
- 【Docker】容器、虚拟机与Docker概念全解析
- centos 安装部署docker与局域网主机相通详细配置
- docker 介绍
- docker入门时碰到的代理设置问题
- docker 报Error: docker-engine-selinux conflicts with docker-selinux-1.9.1-25.el7.centos.x86_64
- ubuntu下安装docker
- dockerfile 收集
- Docker是用来干什么的?
- docker 搭建php开发环境
- Use Docker Machine to provision hosts on cloud providers
- Get started with Docker Machine and a local VM
- Install Docker Machine
- Docker compose操作指南
- 【原创】docker源码分析(1)---框架与engine
- Centos 下安装Docker 遇到的一些错误
- Docker入门笔记_1_安装docker
- Docker--使用Dockerfile创建镜像--RHEL7.2
- Docker计划将镜像迁移至Alpine Linux平台,简化容器运行环境