Docker镜像存储-overlayfs

一、概述

  Docker中的镜像采用分层构建设计,每个层可以称之为“layer”,这些layer被存放在了/var/lib/docker/<storage-driver>/目录下,这里的storage-driver可以有很多种如:AUFS、OverlayFS、VFS、Brtfs等。可以通过docker info命令查看存储驱动,(笔者系统是centos7.4):

Docker镜像存储-overlayfs

通常ubuntu类的系统默认采用的是AUFS,centos7.1+系列采用的是OverlayFS。而本文将介绍以OverlayFS作为存储驱动的镜像存储原理以及存储结构。

二、OverlayFS

介绍

  OverlayFS是一种堆叠文件系统,它依赖并建立在其它的文件系统之上(例如ext4fs和xfs等等),并不直接参与磁盘空间结构的划分,仅仅将原来底层文件系统中不同的目录进行“合并”,然后向用户呈现,这也就是联合挂载技术,对比于AUFS,OverlayFS速度更快,实现更简单。 而Linux 内核为Docker提供的OverlayFS驱动有两种:overlay和overlay2。而overlay2是相对于overlay的一种改进,在inode利用率方面比overlay更有效。但是overlay有环境需求:docker版本17.06.02+,宿主机文件系统需要是ext4或xfs格式。

联合挂载

   overlayfs通过三个目录:lower目录、upper目录、以及work目录实现,其中lower目录可以是多个,work目录为工作基础目录,挂载后内容会被清空,且在使用过程中其内容用户不可见,最后联合挂载完成给用户呈现的统一视图称为为merged目录。以下使用mount将演示其如何工作的。

 使用mount命令挂载overlayfs语法如下:

mount -t overlay overlay -o lowerdir=lower1:lower2:lower3,upperdir=upper,workdir=work merged_dir

创建三个目录A、B、C,以及worker目录:

Docker镜像存储-overlayfs

然后使用mount联合挂载到/tmp/test 下:

Docker镜像存储-overlayfs

然后我们再去查看/tmp/test目录,你会发现目录A、B、C被合并到了一起,并且相同文件名的文件会进行“覆盖”,这里覆盖并不是真正的覆盖,而是当合并时候目录中两个文件名称都相同时,merged层目录会显示离它最近层的文件:

Docker镜像存储-overlayfs

同时我们还可以通过mount命令查看其挂载的选项:

Docker镜像存储-overlayfs

以上这样的方式也就是联合挂载技术。

Docker中的overlay驱动

  介绍了overlay驱动原理以后再来看Docker中的overlay存储驱动,以下是来自docker官网关于overlay的工作原理图:

Docker镜像存储-overlayfs

在上述图中可以看到三个层结构,即:lowerdir、uperdir、merged,其中lowerdir是只读的image layer,其实就是rootfs,对比我们上述演示的目录A和B,我们知道image layer可以分很多层,所以对应的lowerdir是可以有多个目录。而upperdir则是在lowerdir之上的一层,这层是读写层,在启动一个容器时候会进行创建,所有的对容器数据更改都发生在这里层,对比示例中的C。最后merged目录是容器的挂载点,也就是给用户暴露的统一视角,对比示例中的/tmp/test。而这些目录层都保存在了/var/lib/docker/overlay2/或者/var/lib/docker/overlay/(如果使用overlay)。

演示

启动一个容器

Docker镜像存储-overlayfs

查看其overlay挂载点,可以发现其挂载的merged目录、lowerdir、upperdir以及workdir:

Docker镜像存储-overlayfs

overlay2的lowerdir可以有多个,并且是软连接方式挂载,后续我们会进行说明。

如何工作

当容器中发生数据修改时候overlayfs存储驱动又是如何进行工作的?以下将阐述其读写过程:
 
读:
  • 如果文件在容器层(upperdir),直接读取文件;
  • 如果文件不在容器层(upperdir),则从镜像层(lowerdir)读取;
修改:
  • 首次写入: 如果在upperdir中不存在,overlay和overlay2执行copy_up操作,把文件从lowdir拷贝到upperdir,由于overlayfs是文件级别的(即使文件只有很少的一点修改,也会产生的copy_up的行为),后续对同一文件的在此写入操作将对已经复制到容器的文件的副本进行操作。这也就是常常说的写时复制(copy-on-write)
  • 删除文件和目录: 当文件在容器被删除时,在容器层(upperdir)创建whiteout文件,镜像层(lowerdir)的文件是不会被删除的,因为他们是只读的,但without文件会阻止他们显示,当目录在容器内被删除时,在容器层(upperdir)一个不透明的目录,这个和上面whiteout原理一样,阻止用户继续访问,即便镜像层仍然存在。

注意事项
  1. copy_up操作只发生在文件首次写入,以后都是只修改副本,
  2. overlayfs只适用两层目录,,相比于比AUFS,查找搜索都更快。
  3. 容器层的文件删除只是一个“障眼法”,是靠whiteout文件将其遮挡,image层并没有删除,这也就是为什么使用docker commit 提交保存的镜像会越来越大,无论在容器层怎么删除数据,image层都不会改变。

三、overlay2镜像存储结构

从仓库pull一个ubuntu镜像,结果显示总共拉取了4层镜像如下:

Docker镜像存储-overlayfs

此时4层被存储在了/var/lib/docker/overlay2/目录下:

Docker镜像存储-overlayfs

这里面多了一个l目录包含了所有层的软连接,短链接使用短名称,避免mount时候参数达到页面大小限制(演示中mount命令查看时候的短目录):

Docker镜像存储-overlayfs

处于底层的镜像目录包含了一个diff和一个link文件,diff目录存放了当前层的镜像内容,而link文件则是与之对应的短名称:

Docker镜像存储-overlayfs

在这之上的镜像还多了work目录和lower文件,lower文件用于记录父层的短名称,work目录用于联合挂载指定的工作目录。而这些目录和镜像的关系是怎么组织在的一起呢?答案是通过元数据关联。元数据分为image元数据和layer元数据。

image元数据

  镜像元数据存储在了/var/lib/docker/image/<storage_driver>/imagedb/content/sha256/目录下,名称是以镜像ID命名的文件,镜像ID可通过docker images查看,这些文件以json的形式保存了该镜像的rootfs信息、镜像创建时间、构建历史信息、所用容器、包括启动的Entrypoint和CMD等等。例如ubuntu镜像的id为47b19964fb50:

Docker镜像存储-overlayfs

查看其对应的元数据(使用vim :%!python -m json.tool格式化成json) 截取了其rootfs的构成:

Docker镜像存储-overlayfs

上面的 diff_id 对应的的是一个镜像层,其排列也是有顺序的,从上到下依次表示镜像层的最低层到最顶层:

Docker镜像存储-overlayfs

diff_id如何关联进行层?具体说来,docker 利用 rootfs 中的每个diff_id 和历史信息计算出与之对应的内容寻址的索引(chainID) ,而chaiID则关联了layer层,进而关联到每一个镜像层的镜像文件。

layer元数据

  layer 对应镜像层的概念,在 docker 1.10 版本以前,镜像通过一个 graph 结构管理,每一个镜像层都拥有元数据,记录了该层的构建信息以及父镜像层 ID,而最上面的镜像层会多记录一些信息作为整个镜像的元数据。graph 则根据镜像 ID(即最上层的镜像层 ID) 和每个镜像层记录的父镜像层 ID 维护了一个树状的镜像层结构。
  在 docker 1.10 版本后,镜像元数据管理巨大的改变之一就是简化了镜像层的元数据,镜像层只包含一个具体的镜像层文件包。用户在 docker 宿主机上下载了某个镜像层之后,docker 会在宿主机上基于镜像层文件包和 image 元数据构建本地的 layer 元数据,包括 diff、parent、size 等。而当 docker 将在宿主机上产生的新的镜像层上传到 registry 时,与新镜像层相关的宿主机上的元数据也不会与镜像层一块打包上传。
  Docker 中定义了 Layer 和 RWLayer 两种接口,分别用来定义只读层和可读写层的一些操作,又定义了 roLayer 和 mountedLayer,分别实现了上述两种接口。其中,roLayer 用于描述不可改变的镜像层,mountedLayer 用于描述可读写的容器层。具体来说,roLayer 存储的内容主要有索引该镜像层的 chainID、该镜像层的校验码 diffID、父镜像层 parent、storage_driver 存储当前镜像层文件的 cacheID、该镜像层的 size 等内容。这些元数据被保存在 /var/lib/docker/image/<storage_driver>/layerdb/sha256/<chainID>/ 文件夹下。如下: 
Docker镜像存储-overlayfs

每个chainID目录下会存在三个文件cache-id、diff、zize:

cache-id文件:

docker随机生成的uuid,内容是保存镜像层的目录索引,也就是/var/lib/docker/overlay2/中的目录,这就是为什么通过chainID能找到对应的layer目录。以chainID为d801a12f6af7beff367268f99607376584d8b2da656dcd8656973b7ad9779ab4 对应的目录为 130ea10d6f0ebfafc8ca260992c8d0bef63a1b5ca3a7d51a5cd1b1031d23efd5,也就保存在/var/lib/docker/overlay2/130ea10d6f0ebfafc8ca260992c8d0bef63a1b5ca3a7d51a5cd1b1031d23efd5

Docker镜像存储-overlayfs

diff文件:

保存了镜像元数据中的diff_id(与元数据中的diff_ids中的uuid对应)

Docker镜像存储-overlayfs

size文件:

保存了镜像层的大小

Docker镜像存储-overlayfs

在 layer 的所有属性中,diffID 采用 SHA256 算法,基于镜像层文件包的内容计算得到。而 chainID 是基于内容存储的索引,它是根据当前层与所有祖先镜像层 diffID 计算出来的,具体算如下:
  • 如果该镜像层是最底层(没有父镜像层),该层的 diffID 便是 chainID。
  • 该镜像层的 chainID 计算公式为 chainID(n)=SHA256(chain(n-1) diffID(n)),也就是根据父镜像层的 chainID 加上一个空格和当前层的 diffID,再计算 SHA256 校验码。

mountedLayer 信息存储的可读init层以及容器挂载点信息包括:容器 init 层ID(init-id)、联合挂载使用的ID(mount-id)以及容器层的父层镜像的 chainID(parent)。相关文件位于/var/lib/docker/image/<storage_driver>/layerdb/mounts/<container_id>/ 目录下。
如下启动一个id为3c96960b3127的容器: 
aaarticlea/png;base64,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AAEEEEAAAQQQQAABBBBAAAEEEEAAAccFCFYdJ6YCBBBAAAEEEEAAAQQQQAABBBBAAAEEEEg3AYLVdOtR2oMAAggggAACCCCAAAIIIIAAAggggAACjgsQrDpOTAUIIIAAAggggAACCCCAAAIIIIAAAgggkG4CBKvp1qO0BwEEEEAAAQQQQAABBBBAAAEEEEAAAQQcFyBYdZyYChBAAAEEEEAAAQQQQAABBBBAAAEEEEAg3QQIVtOtR2kPAggggAACCCCAAAIIIIAAAggggAACCDguQLDqODEVIIAAAggggAACCCCAAAIIIIAAAggggEC6CRCspluP0h4EEEAAAQQQQAABBBBAAAEEEEAAAQQQcFyAYNVxYipAAAEEEEAAAQQQQAABBBBAAAEEEEAAgXQTIFhNtx6lPQgggAACCCCAAAIIIIAAAggggAACCCDguADBquPEVIAAAggggAACCCCAAAIIIIAAAggggAAC6SZAsJpuPUp7EEAAAQQQQAABBBBAAAEEEEAAAQQQQMBxAYJVx4mpAAEEEEAAAQQQQAABBBBAAAEEEEAAAQTSTYBgNd16lPYggAACCCCAAAIIIIAAAggggAACCCCAgOMCBKuOE1MBAggggAACCCCAAAIIIIAAAggggAACCKSbAMFquvUo7UEAAQQQQAABBBBAAAEEEEAAAQQQQAABxwUIVh0npgIEEEAAAQQQQAABBBBAAAEEEEAAAQQQSDcBgtV061HagwACCCCAAAIIIIAAAggggAACCCCAAAKOC/wfW+A0/+uAwtYAAAAASUVORK5CYII=" alt="" />

查看其对应的mountedLayer三个文件:

Docker镜像存储-overlayfs

可以看到initID是在mountID后加了一个-init,同时initID就是存储在/var/lib/docker/overlay2/的目录名称:

Docker镜像存储-overlayfs

查看mountID还可以直接通过mount命令查看对应挂载的mountID,对应着/var/lib/docker/overlay2/目录,这也是overlayfs呈现的merged目录:

Docker镜像存储-overlayfs

在容器中创建了一文件:

Docker镜像存储-overlayfs

此时到宿主的merged目录就能看到对应的文件:

Docker镜像存储-overlayfs

关于init层

  init层是以一个uuid+-init结尾表示,夹在只读层和读写层之间,作用是专门存放/etc/hosts、/etc/resolv.conf等信息,需要这一层的原因是当容器启动时候,这些本该属于image层的文件或目录,比如hostname,用户需要修改,但是image层又不允许修改,所以启动时候通过单独挂载一层init层,通过修改init层中的文件达到修改这些文件目的。而这些修改往往只读当前容器生效,而在docker commit提交为镜像时候,并不会将init层提交。该层文件存放的目录为/var/lib/docker/overlay2/<init_id>/diff 

小结

通过以上的内容介绍,一个容器完整的层应由三个部分组成,如下图:
  1. 镜像层:也称为rootfs,提供容器启动的文件系统
  2. init层: 用于修改容器中一些文件如/etc/hostname、/etc/resolv.conf等
  3. 容器层:使用联合挂载统一给用户提供的可读写目录。
Docker镜像存储-overlayfs

四、总结

  本文介绍了以overlayfs作为存储驱动的的镜像存储原理其中每层的镜像数据保存在/var/lib/docker/overlay2/<uuid>/diff目录下,init层数据保存了在 /var/lib/docker/overlay2/<init-id>/diff目录下,最后统一视图(容器层)数据在 /var/lib/docker/overlay2/<mount_id>/diff目录下,docker通过image元数据和layer元数据利用内容寻址(chainID)将这些目录组织起来构成容器所运行的文件系统。

参考:

《use overlayfs driver 》

《Docker 镜像之存储管理》

 
上一篇:垂直方向兼容显示的内容多少的情况样式Flex布局


下一篇:mysql多列索引和最左前缀