CentOS, Storage Driver: overlay二、overlay
debain, Storage Driver: aufs
RedHat, Storage Driver: devicemapper
介绍
下面咱们就以Centos发行版的overlay2文件系统进行介绍,其实不论是什么发行版,其原理都一模一样。
先来看张图:

从上述图中能够看到三个层结构,即lowerdir、upperdir、merged层
对应的,使用docker inspect [容器ID]就能够看到这几个层所在的位置
"GraphDriver": { "Name": "overlay2", "Data": { "LowerDir": "/var/lib/docker/overlay2/45abab78c6fd022d9ce132a0fb995f9e91bc0a807ccc73e2461fce6c9b68b250/root", "MergedDir": "/var/lib/docker/overlay2/dc838cbc7d903a4bfd6bd0280a6910c063f2d1f03439e917ebc773fccc377402/merged", "UpperDir": "/var/lib/docker/overlay2/dc838cbc7d903a4bfd6bd0280a6910c063f2d1f03439e917ebc773fccc377402/upper", "WorkDir": "/var/lib/docker/overlay2/dc838cbc7d903a4bfd6bd0280a6910c063f2d1f03439e917ebc773fccc377402/work" } },
一、lowerdir层:
其中lowerdir是只读的镜像层(image layer),其中就包含bootfs/rootfs层,bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,当boot成功 kernel 被加载到内存中,bootfs就被umount了,rootfs(root file system)包含的就是典型Linux系统中的/dev、/proc、/bin、/etc等标准目录。
lowerdir是能够分不少层的,除了bootfs/rootfs层之外,还能够经过Dockerfile创建不少image层,构建过程以下:

Dockerfile中每个指令都会生成一个新的image层,如上图所示。
当FROM时就已经生成了bootfs/rootfs层,也就是kernel和base层。
二、upperdir层
upperdir层是lowerdir的上一层,只有这一层可读可写的,其实就是Container层,在启动一个容器的时候会在最后的image层的上一层自动建立,全部对容器数据的更改都会发生在这一层。
三、merged层
merged层就是联合挂载层,也就是给用户暴露的统一视觉,将image层和container层结合,就如最上边的图中描述一致,同一文件,在此层会展现离它最近的层级里的文件内容,或者能够理解为,只要container层中有此文件,便展现container层中的文件内容,若container层中没有,则展现image层中的。
联合挂载系统的工做原理
一、读:
若是文件在upperdir(容器)层,直接读取文件;
若是文件不在upperdir(容器)层,则从镜像层(lowerdir)读取;
二、写:
首次写入:若是upperdir中不存在,overlay和overlay2执行copy_up操做,把文件从lowdir拷贝到upperdir中,因为overlayfs是文件级别的(即便只有不多的一点修改,也会产生copy_up的动做),后续对同一文件的再次写入操做将对已经复制到容器层的文件副本进行修改,这也就是尝尝说的写时复制(copy-on-write)。
删除文件或目录:当文件被删除时,在容器层(upperdir)建立whiteout文件,镜像层(lowerdir)的文件是不会被删除的,由于它们是只读的,但without文件会阻止它们显示,当目录被删除时,在容器层(upperdir)一个不透明的目录,这个和上边的whiteout的原理同样,组织用户继续访问,image层不会发生改变
三、注意事项
- copy_up操做只发生在文件首次写入,之后都是只修改副本,
- overlayfs只适用两层目录,,相比于比AUFS,查找搜索都更快。
- 容器层的文件删除只是一个“障眼法”,是靠whiteout文件将其遮挡,image层并无删除,这也就是为何使用docker commit 提交保存的镜像会愈来愈大,不管在容器层怎么删除数据,image层都不会改变。
四、容器总体构成图

对比
带着问题看事物,docker容器为何启动这么快呢???
先来看一张docker与VM的对比图:

能够清楚的看到,VM比docker多了Hypervisor 和 Guest OS的过程,也正是省略了这些过程使docker技高一筹,问题又来了,为何docker能够省略这些过程呢?
- Hypervisor:主要做用是实现硬件资源虚拟化;由于docker容器上程序直接使用的都是物理机的硬件资源,因此不须要资源虚拟化的过程,也所以在CPU、内存利用率上docker将会在效率上明显提升
- Guest OS:主要做用加载操做系统内核;由于docker利用的是宿主机的内核,因此在启动一个容器时,不须要像VM同样从新加载一个操做系统内核,也所以大大节约了启动时间。
如下是官网提供的容器启动过程图: