详解Docker架构原理、功能及使用( 四 )


 
6、docker registry
Docker Registry是一个存储容器镜像的仓库 。而容器镜像是在容器被创建时,被加载用来初始化容器的文件架构与目录 。
在Docker的运行过程中,Docker Daemon会与Docker Registry通信,并实现搜索镜像、下载镜像、上传镜像三个功能,这三个功能对应的job名称分别为”search”,”pull” 与 “push” 。
其中,在Docker架构中,Docker可以使用公有的Docker Registry,即大家熟知的Docker Hub,如此一来,Docker获取容器镜像文件时,必须通过互联网访问Docker Hub;同时Docker也允许用户构建本地私有的Docker Registry,这样可以保证容器镜像的获取在内网完成 。
 
7、Graph
Graph在Docker架构中扮演已下载容器镜像的保管者,以及已下载容器镜像之间关系的记录者 。一方面,Graph存储着本地具有版本信息的文件系统镜像,另一方面也通过GraphDB记录着所有文件系统镜像彼此之间的关系 。
Graph的架构如下:

详解Docker架构原理、功能及使用

文章插图
 
其中,GraphDB是一个构建在SQLite之上的小型图数据库,实现了节点的命名以及节点之间关联关系的记录 。它仅仅实现了大多数图数据库所拥有的一个小的子集,但是提供了简单的接口表示节点之间的关系 。
同时在Graph的本地目录中,关于每一个的容器镜像,具体存储的信息有:该容器镜像的元数据,容器镜像的大小信息,以及该容器镜像所代表的具体rootfs 。
8、driver
Driver是Docker架构中的驱动模块 。通过Driver驱动,Docker可以实现对Docker容器执行环境的定制 。由于Docker运行的生命周期中,并非用户所有的操作都是针对Docker容器的管理,另外还有关于Docker运行信息的获取,Graph的存储与记录等 。因此,为了将Docker容器的管理从Docker Daemon内部业务逻辑中区分开来,设计了Driver层驱动来接管所有这部分请求 。
在Docker Driver的实现中,可以分为以下三类驱动:graphdriver、networkdriver和execdriver 。
graphdriver主要用于完成容器镜像的管理,包括存储与获取 。即当用户需要下载指定的容器镜像时,graphdriver将容器镜像存储在本地的指定目录;同时当用户需要使用指定的容器镜像来创建容器的rootfs时,graphdriver从本地镜像存储目录中获取指定的容器镜像 。
在graphdriver的初始化过程之前,有4种文件系统或类文件系统在其内部注册,它们分别是aufs、btrfs、vfs和devmapper 。而Docker在初始化之时,通过获取系统环境变量”DOCKER_DRIVER”来提取所使用driver的指定类型 。而之后所有的graph操作,都使用该driver来执行 。
graphdriver的架构如下:
详解Docker架构原理、功能及使用

文章插图
 
networkdriver的用途是完成Docker容器网络环境的配置,其中包括Docker启动时为Docker环境创建网桥;Docker容器创建时为其创建专属虚拟网卡设备;以及为Docker容器分配IP、端口并与宿主机做端口映射,设置容器防火墙策略等 。networkdriver的架构如下:
详解Docker架构原理、功能及使用

文章插图
 
execdriver作为Docker容器的执行驱动,负责创建容器运行命名空间,负责容器资源使用的统计与限制,负责容器内部进程的真正运行等 。在execdriver的实现过程中,原先可以使用LXC驱动调用LXC的接口,来操纵容器的配置以及生命周期,而现在execdriver默认使用native驱动,不依赖于LXC 。具体体现在Daemon启动过程中加载的ExecDriverflag参数,该参数在配置文件已经被设为”native” 。这可以认为是Docker在1.2版本上一个很大的改变,或者说Docker实现跨平台的一个先兆 。execdriver架构如下:
详解Docker架构原理、功能及使用

文章插图
 
9、libcontainer
libcontainer是Docker架构中一个使用Go语言设计实现的库,设计初衷是希望该库可以不依靠任何依赖,直接访问内核中与容器相关的API 。
正是由于libcontainer的存在,Docker可以直接调用libcontainer,而最终操纵容器的namespace、cgroups、apparmor、网络设备以及防火墙规则等 。这一系列操作的完成都不需要依赖LXC或者其他包 。libcontainer架构如下:
详解Docker架构原理、功能及使用

文章插图
 
另外,libcontainer提供了一整套标准的接口来满足上层对容器管理的需求 。或者说,libcontainer屏蔽了Docker上层对容器的直接管理 。又由于libcontainer使用Go这种跨平台的语言开发实现,且本身又可以被上层多种不同的编程语言访问,因此很难说,未来的Docker就一定会紧紧地和Linux捆绑在一起 。而于此同时,Microsoft在其著名云计算平台Azure中,也添加了对Docker的支持,可见Docker的开放程度与业界的火热度 。


推荐阅读