关于Docker,上个学期就一直在学,去实习之后更觉其重要性,所以读了一段时间源码,总结并记录一下,权当加深印象。
docker架构
阅读源码首先脑海里要有一张源码地图,要明白docker各个部分实现了哪些功能。
docker的架构图如下:
总体包含七个部分:client,daemon,driver,libcontainer,container,graph,registry。
外表来看,docker是一个C/S的架构,用户可以在客户端输入各种指令,客户端负责接受请求并作出相应的响应返回给客户。
DockerClient
DockerClient 负责接受并传递请求指令 。
DockerDaemon
DockerDaemon的功能主要有两个:
- 负责接受client的请求
- 管理docker容器
dockerdaemon的架构主要可以分为两部分:dockerserver和engine
DockerServer
DockerServer作为服务端最主要的作用就是配合client端将请求指令接受过来,如图所示,DockerServer主要分为三个部分:Http.server,mux.server,Handler。
DockerServer运行时会从一个名为mux的包中创建一个mux.Router路由器,然后为路由器中添加相关的路由项用于路由信息, 每个路由项由HTTP请求方法(get,post,put,delete)+URL+Handler三部分组成。
DockerServer每收到一个请求就会生成一个goroutine然后进行相应的解析、匹配相应的路由项最后会找到相匹配的Handler来处理,Handler处理玩请求之后给DockerClient返回响应。Engine
Engine是docker中的运行引擎,存储着大量的容器信息并管理着大部分job的执行。
job是docker中的最小执行单元,类似于unix中的进程,也会有相应的名字、参数、环境变量、标准输入输出、返回状态等等。docker每进行一次相应的操作都会 生成一个相应的Job,比如创建一个容器、下载一个文件等等都是由job完成的。
DockerDriver
DockerDriver是docker内部的驱动模块,负责容器内部相关网络、文件系统等的构建
libcontainer
libcontainer主要是对linux内核的一些诸如namespace、cgroups、capabilities等特性做了封装