码头工人存储驱之overlayFS

  

一、概述

  
 <代码>码头工人镜像采用分层分层构建设计,每层称为“层”,层存放在/数据/码头工人/存储驱动/目录下面 
  

这些存储驱动有,汪汪汪,OverlayFS等,可以通过码头工人信息命令查看存储驱动,centos7.1 +默认采用OverlayFS模式。
二,OverlayFS介绍

  
 <代码> OverlayFS是一种堆叠文件系统,建立在其他文件系统之上,并不参与磁盘底层划分,只是将底层文件系统目录”合并”,实际是伪合并,只是呈现给用户好像一个文件系统结构,这也就是联合挂载技术,对比于汪汪汪,OverlayFS速度更快,实现更简单,因为OverlayFS只分两层,只读层,和读写层,Linux内核为码头工人提供的OverlayFS驱动有两种:覆盖和overlay2。而overlay2是相对于覆盖的一种改进,在inode利用率方面比叠加更有效。但是覆盖有环境需求:码头工人版本17.06.02 +宿主机文件系统需要是ext4或xfs格式。 
  

联合挂载技术:
overlayfs通过三个目录:低目录,上层目录,以及工作(不太理解这个目录怎么工作的)目录实现,其中低目录可以是多个,工作目录为工作基础目录,挂载后内容会被清空,且在使用过程中其内容用户不可见,最后联合挂载完成给用户呈现的统一视图称为合并为目录。以下使用山将演示其如何工作的
奥胪饭と舜娲⑶畂verlayfs

  

然后使用山联合挂载到/tmp/测试下:
mount - t覆盖叠加- o lowerdir=A: B, upperdir=C, workdir=工人/tmp/测试
挂载之后三个目录会合并成一个,并且相同文件名的文件会进行“覆盖”,这里覆盖并不是真正的覆盖,而是当合并时候目录中两个文件名称都相同时,合并(/tmp/测试)层目录会显示离它最近层的文件(lowerdir=A: B,离他最近)
看看挂载情况:
奥胪饭と舜娲⑶畂verlayFS

  

码头工人存储驱之overlayFS

  

码头工人官网覆盖驱动模型:
码头工人存储驱之overlayFS

  

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

  

容器示例:
创建一个容器:
码头工人——运行centos/bin/bash
查看挂载情况:
奥胪饭と舜娲⑶畂verlayFS

  

容器修改数据时,叠加怎么工作?
读:
1。如果文件在容器层(upperdir),直接读取文件
2。如果文件不在容器层(upperdir),则从镜像层(lowerdir)读取
写:
1。首次写入:如果在upperdir中不存在,覆盖和overlay2执行copy_up操作,把文件从lowdir拷贝到upperdir,由于overlayfs是文件级别的(即使文件只有很少的一点修改,也会产生的copy_up的行为),后续对同一文件的在此写入操作将对已经复制到容器的文件的副本进行操作。这也就是常常说的写时复制(即写即拷)
2。删除文件和目录:当文件在容器被删除时,在容器层(upperdir)创建乳白天空文件,镜像层(lowerdir)的文件是不会被删除的,因为他们是只读的,但没有文件会阻止他们显示,当目录在容器内被删除时,在容器层(upperdir)一个不透明的目录,这个和上面没有原理一样,阻止用户继续访问,即便镜像层仍然存在

  

注意:
1. copy_up操作只发生在文件首次写入,以后都是只修改副本
2。容器层的文件删除只是伪删除,是靠乳白天空文件将其遮挡,图像层并没有删除,这也就是为什么使用码头工人承诺提交保存的镜像会越来越大,无论在容器层怎么删除数据,图像层都不会改变

  

过程演示:
码头工人存储驱之overlayFS

  

发现修改操作只在C目录发生也就是upperdir层发生

码头工人存储驱之overlayFS