docker的框架

    docker 使用传统的client-server架构模式,用户端通过docker client 与docker  daemon 建立通信,并将请求发送给后者,而docker后端时松藕合结构,不同模块各斯其职,有机结合,完成用户请求 。

docker 框架概述

   docker daemom 是 docker架构中的主要接口,首先,它提供了API server 用于接受来自docker client,其后根据不同的请求分发给docker daemom 的不同模块执行相应的工作,其中对容器运行时,volume、镜像以及网络方面的具体实现已经存放daemom以为的模块。值得注意的是,docker一直致力于将自己进一步解耦,削弱docker daemom的功能。

    docker通过driver模块来实现对docker容器执行环景的创建和管理。当需要创建docker容器时可通过镜像管理部分的distribution和registry 模块从docker registry 中下载镜像,并通过镜像管理的image、reference和layer 存储镜像的元数据,通过镜像存储驱动graphdriver将镜像文件存储于具体的文件系统中;当需要为docker 容器创建网络环境时,通过网络管理模块network调用libnetwork创建并配置docker网络;当需要为容器创建数据卷时,则通过volume模块调用某具体的volumedriver,来创建一个数据卷并负责后续的挂载操作;当需要限制docker容器运行资源或者执行用户指令等操作时,则通过execdriver来实现对容器的管理,包括利用UTS、IPC、PID、Network、Mount、User等namespace实现容器资源隔离和利用cgroups实现对容器的资源限制,当容器的命令执行完成后,一个实际的容器就处于运行状态,该容器与拥有独立的文件系统,相对安全且互相隔离的运行环境。docker1.9版本以后,volume和network的生命周期都是独立运行于容器的,于容器一样是docker中的一等公民,docker用户可以单独增删改查volume或者network,然后在创建容器的时候根据需要配置给容器

docker daemom

   docker daemom 是docker最核心的后台进程,他负责相应来自docker client 的请求,然后将这些请求翻译成系统调用完成容器的操作,该进程会在后台启动一个API server,负责接收docker client发送的请求;接收到的请求将通过docker daemom分发调度,再由具体函数来执行

dicker client

   docker client 是一个泛称,用来向docker daemom发送请求的,执行相应的容器管理操作,可以是命令行工具docker,也可以是任何遵循了docker API的客户端,目前,社区中维护着docker client 种类非常丰富,涵盖了C#(支持Windows)、java、GO、Ruby、JavaScript等常用语言,甚至还有使用Angular库编写的webUI格式的客户端。

镜像管理 

   docker通过distribution、registry、layer、等模块实现了docker镜像管理,我们将模块统称镜像管理,在docker 1.10以前版本中,这一功能统一由graph组件来完成的

distribution 负责把docker registry交互,上传下载镜像以及存储于v2 registry有关的元数据
registry 负责与docker registry有关身份验证、镜像查找、镜像验证以及管理registry mirror等交互操作
image 负责与镜像元数据有关的存储,查找,镜像层的索引,查找以及镜像tar包有关的导入、导出等操作
reference 负责存储本地所有镜像的registry和tar名,并维护与镜像ID之间的映射关系
layer 负责与镜像层与容器层元数据有关的增删改查,并负责将镜像层的增删改查操作映射到实际存储镜像层文件系统的graphdriver

 

 

 

 

execderiver 、volumedriver 、grephdirver

  execderiver 是对Linux操作系统的namespace cgroups apparmor selinux 等容器运行所需的系统操作进行的一层二次封装,其本质作用类似于LXC,但是功能要更全面,这也就是为什么LXC会作为execdriver 的一种实现而存在,当然execdriver主要的实现,也是现在的默认实现。

   volumedriver 是volume数据卷存储操作的最终执行者,负责volume的增删改查。屏蔽不同驱动实现的区别,为上层调用者提供统一接口。docker中默认实现的volumedriver是local。默认将文件存储于docker根目录下的volume文件夹里。其他的volumedriver均是通过外部插件实现的,是docker官方编写的libcontainer库

    graphdriver是所有与容器镜像相关操作的最终执行者。graphdriver会在docker工作目录下维护一组与镜像层对应的目录,并记录下镜像层之间的关系以及与具体的graphdriver实现相关的元数据。这样,用户对镜像的操作最终会被映射成对这些目录的文件及元数据的增删改查,从而屏蔽掉不同文件存储实现对上层调用者的影响。在Linux环境下,目前docker已经支持graphdriver包括aufs、btrfs、zfs、devicemapper、overlay和vfs

network

    docker 1.9版本以前,网络通过networkdriver模块以及libcontainer库完成的。现在这部分功能已经分离成一个libnetwork库独立维护了。libnetwork抽象出一个容器模型,并给调用者提供了一个统一抽象接口,其目标不仅限于docker容器CNM模型对真实的容器网络抽象出了沙盒、端点、网络这3中对象,具体网络驱动(包括内置的bridge、host、None和overlay驱动以及通过插件配置的外部驱动 )操作对象,并通过网络控制器提供一个统一接口供调用者管理网络。网络驱动负责实现具体操作,包括创建容器通信所需的网络。为容器提供一个network namespace,这个网络所需的虚拟网卡,分配通信所需的IP,服务访问的端口和容器与宿主机之间的端口映射,设置hosts,resolve.com、iptables等