一、概述

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

通常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目录:

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

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

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

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

Docker中的overlay驱动

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

在上述图中可以看到三个层结构,即: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)。

演示

启动一个容器

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

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层镜像如下:

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

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

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

在这之上的镜像还多了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:

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

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

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>/ 文件夹下。如下: 

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

cache-id文件:

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

diff文件:

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

size文件:

保存了镜像层的大小

在 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三个文件:

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

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

在容器中创建了一文件:

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

关于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. 容器层:使用联合挂载统一给用户提供的可读写目录。

四、总结

  本文介绍了以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 镜像之存储管理》

 

Docker镜像存储-overlayfs的更多相关文章

  1. windows10 docker镜像存储位置修改

    =====================================下面做法无效,无法成功启动docker=================================== 安装Docker ...

  2. docker镜像、容器

    第一部分:Docker镜像的基本知识 1.1 什么是Docker镜像 从整体的角度来讲,一个完整的Docker镜像可以支撑一个Docker容器的运行,在 Docker容器运行过程中主要提供文件系统视角 ...

  3. 记录线上与本地docker镜像一致,但Dockerfile却构建失败的问题

    背景 公司新开了某个项目,我在新的服务器部署了docker环境,本着ctrl+c 和ctrl+v的惯例,直接把以前的php环境的Dockerfile文件直接复制到新项目服务器那里,结果构建失败,失败的 ...

  4. Docker 镜像&仓库 获取及推送镜像

    docker查看.删除镜像 docker镜像存储位置: /var/lib/docker 查看docker信息也可以查看保存位置 docker info 1.列出镜像 docker images -aa ...

  5. 深刻理解Docker镜像大小

    都说容器大法好,可是假设没有Docker镜像,Docker该是多无趣啊. 是否还记得第一个接触Docker的时候,你从Docker Hub下拉的那个镜像呢?在那个处女镜像的基础上.你执行了容器生涯的处 ...

  6. 深入分析 Docker 镜像原理

    摘要:近日, DaoCloud 软件工程师孙宏亮在 CSDN Container 微信群为大家带来了 Docker 镜像原理的深度分享,本次分享的重点是 Docker 镜像,分享的内容主要包含两个部分 ...

  7. Docker - docker images存储位置,引出ls和du命令的不同

    docker镜像存储位置 docker info | grep "Docker Root Dir" 例如我的driver是overlay2,则docker镜像的实际存储在/var/ ...

  8. docker 源码分析 四(基于1.8.2版本),Docker镜像的获取和存储

    前段时间一直忙些其他事情,docker源码分析的事情耽搁了,今天接着写,上一章了解了docker client 和 docker daemon(会启动一个http server)是C/S的结构,cli ...

  9. 1. docker 在 macOS 中的架构 2. 在macOS系统中,docker pull 下来的镜像存储在哪里?

    docker 在 macOS 中的架构: 在macOS中,docker的实现跟在其它Linux系统中略有不同,在其它Linux系统中,操作系统本身就是docker容器的宿主机,docker镜像都是直接 ...

随机推荐

  1. QoS技术总结

    1.QoS主要功能是作为保证服务质量而存在,服务质量最明显的体现根据不同的优先级作出不同的转发行为.高优先级的报文不丢弃,低优先级的报文不能保证带宽. 2.当即将发生拥塞时,QoS的作用就体现出来了. ...

  2. echarts雷达图点击事件 包含(2.x,3.85,4.02)测试

    最近看见别人问的问题,点击雷达图的拐点,获取点击数据的问题,直接上代码. echarts 2x 的点击事件 echarts配置问题:https://www.douban.com/note/509404 ...

  3. 填坑:Windows下使用OpenSSL生成自签证书(很简单,一个晚上搞明白的,让后来者少走弯路)

    最近在学习中发现openssl 中有个坑,所有的教程都是openssl genrsa -des3 -out private.key 1024,但是产生的证书,npm start 之后就报错如下: er ...

  4. java I/O工作机制

    java I/O 的基本架构: 1:基于字节操作的I/O接口 InputStream OutputStream 2:基于字符操作的I/O接口 Writer 和Reader 3:基于磁盘操作的I/O接口 ...

  5. shell中的set、seq、eval、exec、&&和||

    一.set 查看set 帮助: bash -c "help set" 选项: -e:任何命令执行失败(非0 status)直接退出 -x: 打印执行过程的命令行.参数 +e:命令执 ...

  6. shell编程-test命令(七)

    test命令常用作检查某些条件是否成立. 数值测试 -eq:检测两个数是否相等,相等返回true -ne:检测两个数是否相等,不相等返回true -gt:检测左边的数是否大于右边,是则返回true - ...

  7. 反射生成 INSERT 多个对象的 SQL 语句(批量插入)

    + View code private static void insertObject(List<?> objectList) throws IllegalAccessException ...

  8. EOS智能合约授权限制和数据存储

    EOS智能合约授权限制和数据存储 在EOS合约中,调用合约需要来自账户的授权,同时还要指定需要调用的动作.当然,有的合约并不是所有账户都可以调用的,这就需要用到授权限制.接下来我们就来看看如何限制合约 ...

  9. 【底层原理】深入理解Cache (上)

    存储器是分层次的,离CPU越近的存储器,速度越快,每字节的成本越高,同时容量也因此越小.寄存器速度最快,离CPU最近,成本最高,所以个数容量有限,其次是高速缓存(缓存也是分级,有L1,L2等缓存),再 ...

  10. git 使用命令删除远程分支和本地分支

    删除远程分支命令: git push origin   :<远程分支名称> git push origin --delete <远程分支名称> 删除本地分支: git bran ...