1、Docker技术构成
Docker软件采用客户-服务(CS架构)的技术架构模式,Docker Client和Docker Daemon交互,Docker Daemon负责创建、运行、发布容器,Docker Client和Docker Daemon可以在同一个系统中,或者Docker Client可以通过REST API远程控制Docker Daemon。Docker Compose负责控制一组应用容器。
2、Docker核心技术
Docker核心技术有3类:Cgroups、LXC、AUFS。
Cgroups
Cgroups提供了对一组进程及将来子进程的资源限制、控制和统计的能力,这些资源包括CPU、内存、存储、网络等。通过Cgroups,可以方便地限制某个进程的资源占用,并且可以实时监测进程的监控和统计信息。Cgroups的接口通过操作一个虚拟文件系统来实现,一般挂载在(/sys/fs/cgroup)文件夹下。
LXC
LXC是Linux Containers的简称,是一种基于容器的操作系统层级的虚拟化技术。LXC项目位于Sourceforge上面,由一个Linux内核补丁和一些用户空间工具组成,其中内核补丁提供底层新特性,上层工具使用这些新特性,提供一套简化的工具来维护容器。
LXC在资管管理方面依赖与Linux内核密切相关的Cgroups子系统,这个子系统是Linux内核提供的一个基于进程组的资源管理框架,可以为特定的进程组限定可以使用的资源,借助Cgroups子系统,在当前Linux环境下实现一个轻量化的虚拟机。
LXC在隔离控制方面依赖于Linux内核提供的namespace特性,具体来说,就是在clone时加入相应的flag。
AUFS
AUFS是一种Union File System(联合文件系统),又称Another UnionFS,后来被称为Alternative UnionFS,再后来又被称为高大上的Advance UnionFS。所谓UnionFS,就是把不同物理位置的目录合并(mount)到同一个目录中。UnionFS的一个最主要应用是,把一张CD/DVD和一个硬盘目录联合(mount)在一起,然后,就可以对这个只读的CD/DVD上的文件进行修改(当然,修改的文件存储在硬盘上的目录里)。
3、Docker打包原理
在LXC的基础上,Docker额外提供的Feature包括:标准统一的打包部署运行方案,为了最大化重用Image,加快运行速度,减少内存和磁盘footprint,Docker Container运行时所构造的运行环境实际上是由具有依赖关系的多个Layer组成的。
在基础的rootfs image的基础上,叠加了包含如Emacs等各种工具的image,再叠加包含apache及其相关依赖library的image,这些image由AUFS文件系统加载合并到统一路径中,以只读的方式存在,最后再叠加加载一层可写的空白Layer,用于记录对当前运行环境所作的修改。
有了层级化的image做基础,理想情况下,不同的App就可以尽可能地公用底层文件系统和相关依赖工具等,同一个App的不同示例也可以实现公用绝大多数数据,进而以copy on write的形式维护那份已修改过的数据等。
4、Docker网络模式
Docker的网络模式包括下列4类:Bridge container(桥接式网络模式)、Host(open)container(开放式网络模式)、Container(join)container(联合挂载式网络模式,是Host网络模式的延伸)、None(Close)container(封闭式网络模式)。
Bridge container
当Docker进程启动时,会在主机上生成一个默认的虚拟网桥,此主机上启动的Docker容器会连接到虚拟网桥中,默认的IP地址都是由虚拟网桥生成的。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。从一个子网中分配一个IP给容器使用,并设置子网的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以veth-xxx这种形式命名,并将这个网络设备加入到虚拟网桥中。
Host(open)container
如果启动容器时使用Host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等,还是和宿主机隔离的。
Container(join)container
这种模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过网卡设备通信。
None(Close)container
使用None模式时,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息,只有IO网络接口,需要为Docker容器添加网卡、配置IP等。