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

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

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

时间: 2024-12-10 00:33:18

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

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源码分析之——Docker启动

在上文中,笔者通过分析Docker的架构,初步作了Docker的架构图.架构图本身更多的出于笔者的理解,为了便于理解,对于Docker代码本身做了一些抽象,例如Server的运行都是以一个Job的形式存在的,而架构图中并未明显的表明这一点. Docker模块简介 本文将从源码的角度分析Docker的启动,主要是作为一个daemon进程的启动.在这之前,需要先清晰Docker内部最主要的几个概念:Daemon,Engine以及Job. Daemon Daemon可以认为是Docker守护进程的载体

Docker源码分析之——Docker架构

Docker是PaaS圈内开源的基于LXC的应用容器引擎,基于Go语言开发,遵从Apache2.0协议. 最近一年来,Docker在云计算方面的热度持续升温,社区等活跃度也持续走高,使得大家对于Docker普遍持有积极态度. 笔者在研究生期间,主要从事PaaS方面的研究与实践工作,具体的研究平台为开源的Cloud Foundry.最近Docker的火热,更是让自己处于对Docker的学习过程中,不能自拔. 从功能的角度,Docker于Cloud Foundry的warden相仿.然而从产品的定位

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 源码分析 一(基于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 源码分析 四(基于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 Daemon启动

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

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

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

Docker源码分析(八):Docker Container网络(下)

1.Docker Client配置容器网络模式 Docker目前支持4种网络模式,分别是bridge.host.container.none,Docker开发者可以根据自己的需求来确定最适合自己应用场景的网络模式. 从Docker Container网络创建流程图中可以看到,创建流程第一个涉及的Docker模块即为Docker Client.当然,这也十分好理解,毕竟Docker Container网络环境的创建需要由用户发起,用户根据自身对容器的需求,选择网络模式,并将其通过Docker Cl