1.Docker系统结构
Docker容器采用如图1所示的客户端与服务器的架构模式。Docker服务端会处理复杂的操作任务,例如创建(pull)、运行(run)、保存(commit)Docker容器等;Docker客户端则作为服务端的远程控制器,可以用拉力链接并控制Docker的服务端进程。
一般情况下,Docker客户端和守护进程可以运行在同一个宿主机的系统上,也可以使用Docker客户端连接一个远程的Docker守护进程。Docker Daemon和Docker Client之间可以通过Restful API或者socket进行进程间通信。
1.1 Docker Registry
Docker Registry是存储容器镜像的管理仓库,而容器镜像是在容器被创建时,被用拉力加载并初始化容器的文件系统与目录。在容器的运行过程中,Docker Daemon会与Docker Registry进行进程间通信,具有搜索镜像、下载镜像、上传镜像等基本功能。
在Docker系统结构中,可以使用共有的Docker Registry,即Docker Hub。Docker获取共有的容器镜像文件时,必须通过互联网访问共有的管理仓库;也允许用户构建本地私有的Docker Registry,这样可以保证容器镜像可以在本地网络获得。
1.2 Docker container
Docker容器是Docker系统机构中服务交付的最终体现方式。通过Docker需求与下发的命令,定制相应的服务并运行容器:
指定容器镜像,Docker容器可以自定义rootfs等文件系统;
指定计算资源的配额,Docker容器只能使用指定范围内的资源;
配置网络参数及其安全策略方式,容器具有安全且相互独立运行的网络运行环境;
指定运行的命令参数,使得Docker容器可以执行所需的服务进程。
1.3 Docker Daemon
Docker Daemon 的结构如图2所示,可以分为三部分:Docker Server,Engine和Job.
Docker Daemon是服务端中一个常驻留在后台的守护服务进程,该守护进程在后台启动了一个Server进程,其工作职责是接受客户端发送的请求;在Engine模块中根据客户端的请求类型,Server通过路由与分发调度机制,找到相应的job来处理客户端的请求
Engine死系统结构中的运行引擎,同时也是容器运行的核心模块,通过创建job的方式来操纵管理所有客户端发送的请求。
1.4 Libcontainer
Libcontainer 是Docker系统结构中使用Go变成语言实现的库,如图3所示,其设计目标是希望不依赖任何其他库文件,可以直接访问内核中与容器相关的API。 Docker 可以直接调用 libcontainer 库文件,从而直接操纵容器的 namespace、cgroups、apparmor、网络设备以及防火墙规则等
2 Docker工作原理
Docker需要解决的核心问题是利用LXC来实现类似于虚拟机的功能,从而使用更加节省的硬件资源来给用户提供更多的可利用的资源。与VM的工作原理不同的是LXC并不是一套基于硬件虚拟化的方法,也就是无法归类到半虚拟化、部分虚拟化或者全虚拟化中的任意一个范畴,而是一个基于系统级的虚拟化方法。
Image 在Docker系统结构中只是一个只读的基础层,这里的层是指AUFS的概念,Docker使用了一种叫AUFS的文件系统,这种文件系统可以一层一层地叠加修改当前使用的文件,最底下的文件系统是只读的镜像层,如果需要修改当前层的文件,AUFS将会创建一个的可读可写的层,也就是容器层。使用AUFS文件系统具有允许多个容器共享底层的只读文件系统,但可以同时启动多个可运行的容器。
Docker可以运行在64位Linux发行版以及苹果和微软系统上,但后两者只能使用虚拟机作为宿主机。素偶有的可运行的容器运行在宿主机系统的内核之上,但是锁定在自己的运行环境中,与主机以及其他容器的运行环境是隔离的。
3 Docker底层实现
Docker底层的两个核心技术分别是Namespace和Cgroups(Controlgroups),并且使用了一系列Linux内核提供的特性来实现容器的基本功能,包含命名空间,群主控制,联合文件系统以及LXC等特性。
3.1 命名空间(Namespances)
命名空间的作用是Wie容器提供进程间隔离的技术,每个容器都有独立的与运行空间,比如pid,net,mnt,uts,ipc等命名空间,以及为每个容器提供不同的主机名。命名空间可以保证不同的容器之间不会相互干扰,每个容器都像是一个独立空间且有可使用的系统。利用命名空间提供了一个隔离层,每个应用服务都是在他们自己的命名空间中运行而且不会访问空间制外的资源。
3.2 群组控制(cgroups)
Docker使用到了群组控制技术哎管理可用的资源,其主要具有对共享资源的分配、限制、审计及管理等功能,例如可以为每个容器分配固定的CPU、内存以及I/O等资源。群组控制特性能在物理机上互不干扰的运行,并且平等的使用物理资源。
3.3联合文件系统(AUFS)
联合文件系统是一个分层的轻量级且高性能的文件系统,Docker使用该文件系统叠加封层的构造容器。Docker可以使用很多种类的文件系统包括AUFS,btrfs,vfs以及DeviceMapper等。正是具有构建Docker镜像基础的AUFS文件系统,将具有不同文件系统结构的镜像层进行叠加挂载,让他们看上去就像是一个文件系统。
3.4LXC(Linux Container)
LXC目标是提供一个共享宿主机内核的系统级虚拟方法,在运行时不用重复加载系统内核,兵器而具有很多的容器共享主机一个内核的优势,因此可以提高容器的启动速度,并且大大减少占用主机的物理资源。