Docker的总架构图

docker是一个C/S模式的架构,后端是一个松耦合架构,模块各司其职。

  • 用户是应用Docker Client与Docker Daemon建设通信,并发送申请给后者。
  • Docker Daemon作为Docker架构中的主体局部,首先提供Server的性能使其能够承受Docker Client的申请;
  • Engine执行Docker外部的一系列工作,每一项工作都是以一个Job的模式的存在。
  • Job的运行过程中,当须要容器镜像时,则从Docker Registry中下载镜像,并通过镜像治理驱动graphdriver将下载镜像以Graph的模式存储;
  • 当须要为Docker创立网络环境时,通过网络管理驱动networkdriver创立并配置Docker容器网络环境;
  • 当须要限度Docker容器运行资源或执行用户指令等操作时,则通过execdriver来实现。
  • libcontainer是一项独立的容器治理包,networkdriver以及execdriver都是通过libcontainer来实现具体对容器进行的操作。

Docker各模块组件剖析

Docker Client【发动申请】
  • Docker Client是和Docker Daemon建设通信的客户端。用户应用的可执行文件为docker(相似可执行脚本的命令),docker命令后接参数的模式来实现一个残缺的申请命令(例如docker images,docker为命令不可变,images为参数可变)。
  • Docker Client能够通过以下三种形式和Docker Daemon建设通信:tcp://host:port,unix://path_to_socket和fd://socketfd。
  • Docker Client发送容器治理申请后,由Docker Daemon承受并解决申请,当Docker Client接管到返回的申请相应并简略解决后,Docker Client一次残缺的生命周期就完结了。(一次残缺的申请:发送申请→解决申请→返回后果),与传统的C/S架构申请流程并无不同。
Docker Daemon【后盾守护过程】
  • Docker Daemon的架构图

Docker Server【调度散发申请】
  • Docker Server的架构图

  • Docker Server相当于C/S架构的服务端。性能为承受并调度散发Docker Client发送的申请。承受申请后,Server通过路由与散发调度,找到相应的Handler来执行申请。
  • 在Docker的启动过程中,通过包gorilla/mux,创立了一个mux.Router,提供申请的路由性能。在Golang中,gorilla/mux是一个弱小的URL路由器以及调度散发器。该mux.Router中增加了泛滥的路由项,每一个路由项由HTTP申请办法(PUT、POST、GET或DELETE)、URL、Handler三局部组成。
  • 创立完mux.Router之后,Docker将Server的监听地址以及mux.Router作为参数,创立一个httpSrv=http.Server{},最终执行httpSrv.Serve()为申请服务。
  • 在Server的服务过程中,Server在listener上承受Docker Client的拜访申请,并创立一个全新的goroutine来服务该申请。在goroutine中,首先读取申请内容,而后做解析工作,接着找到相应的路由项,随后调用相应的Handler来解决该申请,最初Handler解决完申请之后回复该申请。
Engine
  • Engine是Docker架构中的运行引擎,同时也Docker运行的外围模块。它表演Docker container存储仓库的角色,并且通过执行job的形式来操纵治理这些容器。
  • 在Engine数据结构的设计与实现过程中,有一个handler对象。该handler对象存储的都是对于泛滥特定job的handler解决拜访。举例说明,Engine的handler对象中有一项为:{"create": daemon.ContainerCreate,},则阐明当名为"create"的job在运行时,执行的是daemon.ContainerCreate的handler。
job
  • 一个Job能够认为是Docker架构中Engine外部最根本的工作执行单元。Docker能够做的每一项工作,都能够形象为一个job。例如:在容器外部运行一个过程,这是一个job;创立一个新的容器,这是一个job。Docker Server的运行过程也是一个job,名为serveapi。
  • Job的设计者,把Job设计得与Unix过程相仿。比如说:Job有一个名称,有参数,有环境变量,有规范的输入输出,有错误处理,有返回状态等。

Docker Registry【镜像注册核心】

  • Docker Registry是一个存储容器镜像的仓库(注册核心),可了解为云端镜像仓库,按repository来分类,docker pull 依照[repository]:[tag]来准确定义一个image。
  • 在Docker的运行过程中,Docker Daemon会与Docker Registry通信,并实现搜寻镜像、下载镜像、上传镜像三个性能,这三个性能对应的job名称别离为"search","pull" 与 "push"。
  • 可分为私有仓库(docker hub)和公有仓库。

Graph【docker外部数据库】

  • Graph的架构图

  • Repository
  • 已下载镜像的保存者(包含下载镜像和dockerfile构建的镜像)。
  • 一个repository示意某类镜像的仓库(例如Ubuntu),同一个repository内的镜像用tag来辨别(示意同一类镜像的不同标签或版本)。一个registry蕴含多个repository,一个repository蕴含同类型的多个image。
  • 镜像的存储类型有aufs,devicemapper,Btrfs,Vfs等。其中centos零碎应用devicemapper的存储类型。
  • 同时在Graph的本地目录中,对于每一个的容器镜像,具体存储的信息有:该容器镜像的元数据,容器镜像的大小信息,以及该容器镜像所代表的具体rootfs。
  • GraphDB
  • 已下载容器镜像之间关系的记录者。
  • GraphDB是一个构建在SQLite之上的小型图数据库,实现了节点的命名以及节点之间关联关系的记录

Driver【执行局部】

Driver是Docker架构中的驱动模块。通过Driver驱动,Docker能够实现对Docker容器执行环境的定制。即Graph负责镜像的存储,Driver负责容器的执行。

graphdriver
  • graphdriver架构图

  • graphdriver次要用于实现容器镜像的治理,包含存储与获取。
  • 存储:docker pull下载的镜像由graphdriver存储到本地的指定目录(Graph中)。
  • 获取:docker run(create)用镜像来创立容器的时候由graphdriver到本地Graph中获取镜像。
networkdriver
  • networkdriver的架构图

networkdriver的用处是实现Docker容器网络环境的配置,其中包含

  • Docker启动时为Docker环境创立网桥;
  • Docker容器创立时为其创立专属虚构网卡设施;
  • Docker容器调配IP、端口并与宿主机做端口映射,设置容器防火墙策略等。
execdriver
  • execdriver的架构图

  • execdriver作为Docker容器的执行驱动,负责创立容器运行命名空间,负责容器资源应用的统计与限度,负责容器外部过程的真正运行等。
  • 当初execdriver默认应用native驱动,不依赖于LXC。

libcontainer【函数库】

libcontainer的架构图

  • libcontainer是Docker架构中一个应用Go语言设计实现的库,设计初衷是心愿该库能够不依附任何依赖,间接拜访内核中与容器相干的API。
  • Docker能够间接调用libcontainer,而最终操纵容器的namespace、cgroups、apparmor、网络设备以及防火墙规定等。
  • libcontainer提供了一整套规范的接口来满足下层对容器治理的需要。或者说,libcontainer屏蔽了Docker下层对容器的间接治理。

docker container【服务交付的最终模式】

container架构

Docker container(Docker容器)是Docker架构中服务交付的最终体现模式。

Docker依照用户的需要与指令,订制相应的Docker容器:

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

作者:胡伟煌
https://blog.csdn.net/huwh\_/article/details/71308236