Docker C/S模式总体技术架构深刻剖析-Docker商业环境实战

专一于大数据及容器云核心技术解密,可提供全栈的大数据+云原平生台咨询方案,请持续关注本套博客。若有任何学术交流,可随时联系。更多内容请关注《数据云技术社区》公众号。 docker

1 Docker整体技术架构

  • Docker Daemon做为Docker架构中的主体部分,首先提供Server的功能使其能够接受Docker Client的请求;然后Engine执行Docker内部的一系列工做,每一项工做都是以一个Job的形式的存在。
  • Job的运行过程当中,当须要容器镜像时,则从Docker Registry中下载镜像,并经过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;
  • 当须要为Docker建立网络环境时,经过网络管理驱动networkdriver建立并配置Docker容器网络环境;
  • 当须要限制Docker容器运行资源或执行用户指令等操做时,则经过execdriver来完成。

2 Docker Client 架构

  • Docker Client是Docker架构中用户用来和Docker Daemon创建通讯的客户端。用户使用的可执行文件为docker,经过docker命令行工具能够发起众多管理container的请求。
  • Docker Client能够经过如下三种方式和Docker Daemon创建通讯:tcp://host:port,unix://path_to_socket和fd://socketfd。
  • Docker Client发送容器管理请求后,由Docker Daemon接受并处理请求,当Docker Client接收到返回的请求相应并简单处理后,Docker Client一次完整的生命周期就结束了。当须要继续发送容器管理请求时,用户必须再次经过docker可执行文件建立Docker Client。

2 Docker Daemon 架构

  • Docker Daemon是Docker架构中一个常驻在后台的系统进程。
  • 接受并处理Docker Client发送的请求。该守护进程在后台启动了一个Server,Server负责接受Docker Client发送的请求;接受请求后,Server经过路由与分发调度,找到相应的Handler来执行请求。
  • Docker Daemon的架构,大体能够分为如下三部分:Docker Server、Engine和Job。

2.1 Docker Server

  • Docker Server在Docker架构中是专门服务于Docker Client的server。该server的功能是:接受并调度分发Docker Client发送的请求。
  • 在Docker的启动过程当中,经过包gorilla/mux,建立了一个mux.Router,提供请求的路由功能。在Golang中,gorilla/mux是一个强大的URL路由器以及调度分发器。该mux.Router中添加了众多的路由项,每个路由项由HTTP请求方法(PUT、POST、GET或DELETE)、URL、Handler三部分组成。
  • 若Docker Client经过HTTP的形式访问Docker Daemon,建立完mux.Router以后,Docker将Server的监听地址以及mux.Router做为参数,建立一个httpSrv=http.Server{},最终执行httpSrv.Serve()为请求服务。
  • 在Server的服务过程当中,Server在listener上接受Docker Client的访问请求,并建立一个全新的goroutine来服务该请求。在goroutine中,首先读取请求内容,而后作解析工做,接着找到相应的路由项,随后调用相应的Handler来处理该请求,最后Handler处理完请求以后回复该请求。

2.2 Docker Engine

  • Engine是Docker架构中的运行引擎,同时也Docker运行的核心模块。它扮演Docker container存储仓库的角色,而且经过执行job的方式来操纵管理这些容器。
  • 在Engine数据结构的设计与实现过程当中,有一个handler对象。该handler对象存储的都是关于众多特定job的handler处理访问。举例说明,Engine的handler对象中有一项为:{“create”: daemon.ContainerCreate,},则说明当名为”create”的job在运行时,执行的是daemon.ContainerCreate的handler。

2.3 Docker Job

  • 一个Job能够认为是Docker架构中Engine内部最基本的工做执行单元。Docker能够作的每一项工做,均可以抽象为一个job。例如:在容器内部运行一个进程,这是一个job;建立一个新的容器,这是一个job,从Internet上下载一个文档,这是一个job;包括以前在Docker Server部分说过的,建立Server服务于HTTP的API,这也是一个job,等等。

3 Docker Driver架构

  • Driver是Docker架构中的驱动模块。经过Driver驱动,Docker能够实现对Docker容器执行环境的定制。因为Docker运行的生命周期中,并不是用户全部的操做都是针对Docker容器的管理,另外还有关于Docker运行信息的获取,Graph的存储与记录等。所以,为了将Docker容器的管理从Docker Daemon内部业务逻辑中区分开来,设计了Driver层驱动来接管全部这部分请求。
  • 在Docker Driver的实现中,能够分为如下三类驱动:graphdriver、networkdriver和execdriver。

3.1 graphdriver驱动

  • graphdriver主要用于完成容器镜像的管理,包括存储与获取。即当用户须要下载指定的容器镜像时,graphdriver将容器镜像存储在本地的指定目录;同时当用户须要使用指定的容器镜像来建立容器的rootfs时,graphdriver从本地镜像存储目录中获取指定的容器镜像。

3.2 networkdriver驱动

  • 完成Docker容器网络环境的配置,其中包括Docker启动时为Docker环境建立网桥;Docker容器建立时为其建立专属虚拟网卡设备;以及为Docker容器分配IP、端口并与宿主机作端口映射,设置容器防火墙策略等。

3.2 execdriver驱动

  • execdriver做为Docker容器的执行驱动,负责建立容器运行命名空间,负责容器资源使用的统计与限制,负责容器内部进程的真正运行等。
  • 在execdriver的实现过程当中,原先可使用LXC驱动调用LXC的接口,来操纵容器的配置以及生命周期,而如今execdriver默认使用native驱动,不依赖于LXC。具体体如今Daemon启动过程当中加载的ExecDriverflag参数,该参数在配置文件已经被设为”native”

4 libcontainer架构

  • libcontainer是Docker架构中一个使用Go语言设计实现的库,设计初衷是但愿该库能够不依靠任何依赖,直接访问内核中与容器相关的API。
  • 正是因为libcontainer的存在,Docker能够直接调用libcontainer,而最终操纵容器的namespace、cgroups、apparmor、网络设备以及防火墙规则等。这一系列操做的完成都不须要依赖LXC或者其余包。libcontainer架构以下图:

5 Docker container交付

  • 用户经过指定容器镜像,使得Docker容器能够自定义rootfs等文件系统; 用户经过指定计算资源的配额,使得Docker容器使用指定的计算资源; 用户经过配置网络及其安全策略,使得Docker容器拥有独立且安全的网络环境; 用户经过指定运行的命令,使得Docker容器执行指定的工做。

6 总结

本文参考<<Docker源码分析>>,感谢做者,本文执笔小记,方便查阅,谢谢!安全

专一于大数据及容器云核心技术解密,可提供全栈的大数据+云原平生台咨询方案,请持续关注本套博客。若有任何学术交流,可随时联系。更多内容请关注《数据云技术社区》公众号。 网络

相关文章
相关标签/搜索