Docker存储驱动overlay和overlay2

OverlayFS是内核提供的,一个类似于AUFS 的现代联合文件系统,实现简单,且可能更快一些。 

overlay和overlay2(Docker1.12+)是docker的存储驱动,可以通过docker.service启动参数中的--storage-driver参数设置。

一、OverlayFS

OverlayFS将单个Linux主机上的两个目录合并成一个目录,对外提供一个统一的视角,这些目录被称为层,合并过程被称为联合挂载。OverlayFS下层目录称为lowerdir, 上层目录称为upperdir,合并对外展示的统一视图称为merged。下层是只读的,上层是可写的,并且上层目录会覆盖下层目录的内容。

当需要修改一个文件时,使用Copy-on-Write(写时复制)将文件从只读的Lower复制到可写的Upper进行修改,结果也保存在Upper层。

在Docker中,底下的只读层就是Image,可写层就是Container。

下图分层图,镜像层是lowdir,容器层是upperdir,统一的视图层是merged层

二、overlay 

overlay是docker的存储驱动,默认存储路径是/var/lib/docker/overlay/,在该路径下,每个镜像层都有一个对应的目录,包含了该层镜像的内容,每个镜像层只包含一个root目录。 镜像层目录中,共享的数据使用的是硬链接,他们的inode号相同,这样做有效地利用了磁盘。

创建容器时,会在已有的镜像层上创建一层容器层,容器层在路径/var/lib/docker/overlay下也存在对应的目录,镜像顶层是overlay中的只读lowerdir,容器的新目录是可写的upperdir。

文件 lower-id 用来记录下层的镜像层,upper 包含了容器层的内容。创建容器时将lower-id指向的镜像层目录以及upper目录联合挂载到merged目录,work 用来完成如 copy-on_write 的操作。

如果在创建的容器中创建一个文件file,则在对应的读写层目录中,发现upper目录下多出了一个file文件,就是刚才在容器中创建的文件。

注意:docker1.10+使用基于内容的寻址,镜像层ID和/var/lib/docker中的目录名不再一一对应

三、overlay2

overlay2是overlay的改进版,只支持4.0以上内核(centos 3.10.0-514及以上内核版本也有此特性),添加了Multiple lower layers in overlayfs的特性,所以overlay2可以直接造成muitiple lower layers不用像overlay一样要通过硬链接的方式,所以消耗更少的inode。

overlay2的默认存储路径是/var/lib/docker/overlay2/,每个镜像层都有一个对应的目录,包含了该层镜像的内容。

”l“目录包含一些符号链接作为缩短的层标识符,这些缩短的标识符用来避免挂载时超出页面大小的限制。

启动一个容器,也是载/var/lib/docker/overlay2目录下生成一层容器层,目录包括diff,link,lower,merged,work,

diff记录每一层自己内容的数据,link记录该层链接目录(实际是l目录下到层的链接),lower记录下层镜像的链接,merged是联合挂载目录,work记录对容器的操纵。

最底层包含”link”文件,这个文件记录着作为标识符的更短的符号链接的名字,最底层还有一个”diff”目录,包含实际内容,因为是最底层,所以不包含lower文件。

从第二层开始,每层镜像层包含”lower“文件,根据这个文件可以索引构建出整个镜像的层次结构。

四、容器的读写

对于读:

读的文件只存在在容器层,直接从容器层读;
读的文件不在容器层,则从镜像层进行读;
读的文件在容器层和镜像层,读容器层中的文件,因为容器层隐藏了镜像层同名的文件;

对于写:

写的文件在容器层,直接写入;
写的文件不在容器层,在镜像层,由于文件不在容器层,因此overlay/overlay2存储驱动使用CoW操作从镜像层拷贝文件到容器层,然后将写入的内容写入到拷贝的文件中;
删除文件和目录,删除镜像层的文件,会在容器层创建一个whiteout文件来隐藏它;删除镜像层的目录,会创建opaque目录,它和whiteout文件有相同的效果;
重命名目录,对一个目录调用rename(2)仅仅在资源和目的地路径都在顶层时才被允许,否则返回EXDEV。

五、overlay和overlay2的区别

本质区别是镜像层之间共享数据的方法不同,

overlay共享数据方式是通过硬连接,只挂载一层,其他层通过硬连接形式共享(增加了磁盘inode的负担),

而overlay2是通过每层的 lower文件。

posted on 2021-10-31 18:31  流年似水zlw  阅读(3455)  评论(0编辑  收藏  举报

导航