docker联合文件系统

先了解一下什么是联合文件系统

参考:https://blog.csdn.net/Hh20161314/article/details/97288018
参考:https://www.jianshu.com/p/3001853d0a86
假设有三个文件Z,X和Y目录,X和Y里面分别放置了B文件和C文件,联合文件系统现在要把X目录和Y目录挂载到Z里面,然后Z就组成了一个视图层,相当于Z目录整合X和Y目录中所有的文件,在Z目录中能看到X和Y中的文件,给用户的感觉,就只有Z目录一个文件。事实上,Z目录中我们所看到的文件并不真实存在,都是从X和Y挂载进来的,原来目录下的内容路径都不会改变。
在这里插入图片描述

修改联合文件系统

之前我们说,X和Y目录挂载到Z后,其内容路径都不会改变。那我在Z目录中修改X和Y,会是什么情形呢?
假如我们要在Z中删除A文件,删除后,Z中确实没有了A中的文件,之前说过其内容和路径都是真实存在,但是从物理的角度,并没有删除。相反,我们在X目录中发现了一个删除A的标记,代表我已经把A给删除了,当联合系统在自身找不到文件时,会向下层进行寻找,X先挂载进来的,所以要先从X进行查找,所以在X中找到了删除A的标记,此时,联合文件系统就默认为A已经被删除了,就不在往下面找了,事实上,A在Y目录依然存在,只是出现了一种“假死”现象。
这是为什么? 这就是aufs的一个特性。 在所有联合起来的目录中,只有第一个目录是有写权限的。 也就是说Z不论修改什么都只能对第一个联合进来的X做更改,它是没有权限对其他目录(例如Y)做任何改动的。 如果我们在Z目录中对A做出了更改,它是没有权限修改A的,所以相应的在X中添加一条记录,记录了更改A的内容。 这就是aufs。
在这里插入图片描述

事实上docker默认采用的也是aufs,请看下图:
在这里插入图片描述

我们之前的Y就是镜像层,X就是容器层,而联合文件目录Z,就是我们进入容器以后展示给我们看的视图层。Y是永远无法更改的,所以它是镜像层。X是可以修改的,并且它可以记录对镜像层的修改来达到定制自己的文件的目的,这样在视图层上,我们就看到的是经过容器层修改后的视图了。 这就是docker使用aufs对文件系统耍的花样。 我们下载各种操作系统的镜像其实是做的很像是操作系统的镜像层。这个镜像层里有root,有bin,有sbin,有proc,有一切你想要的命令脚本。 docker会创建一个空的容器层并和镜像层联合起来,成为一个视图给我们看,并修改了各种环境变量让所有命令都指向镜像层去。 这样就有了在一开始我们进入容器后的那个截图。 我们看到的甚至不是容器层,而是联合起来的视图层。 所以我们其实还是在宿主机上的用户, 只不过我们看不出来。

再来另一个很通俗的解释:
现在有两个目录,目录一包含两个文件夹A,B,A文件夹下面有a.txt文件,B文件夹下面有b.txt两个文件,也就是a.txt的b.txt的路径为:

/A/a.txt
/B/b.txt

目录二同样也包含两个文件夹A,C,A文件夹下面同样也有a.txt文件,同时还有一个a1.txt文件,C文件夹下面有c.txt文件,同样列一下这些文件的路径:

/A/a.txt
/A/a1.txt
/C/c.txt

现在,我们用联合文件系统技术来“合并”一下这两个目录。
如开头提到的,合并后的目录对于原来的目录里文件的路径是不会改变的,那最终期望的结果应该是:

/A/a.txt
/A/a1.txt
/B/b.txt
/C/c.txt

联合文件系统最终让我们看到的就是这样的结果。
从上图可以看到,两个目录中都有a.txt这文件,但在虚拟文件系统只显示了一个,那显示的时谁的呢?答案就是,谁先挂载,就显示谁的。对应到docker的话,最先挂载的一般是可读写层,如果可读写层能找到的话,就不往下找了。

那要修改虚拟文件系统里看到的文件又会有什么样的结果呢。比如我现在想改a.txt里的内容,修改之后原本目录里的a.txt会不会跟着被改掉了呢?答案是并不会,这里涉及联合文件系统一个很关键的知识点,就是被挂载的内容默认都是只读的,无法修改的,那如何体现改动呢,其实这个文件系统会产生一个a.txt的副本,修改只会应用在当前的a.txt副本上,这个副本相比原来的a.txt具有优先显示权,这和一开始两个目录挂载的时候只显示先被挂载的目录里的a.txt结果是一样的,那没显示文件怎么样了呢?由于之前说挂载过来的内容都是只读的,所以很显然,这些文件在原来的目录里的内容并不会改变。

改一个文件,我去复制一个副本出来进行修改还好理解,那我要是想把这个a.txt删除会怎么样呢?会不会失败?当然不会,如果你想删除a.txt,这个文件系统也会生成一个文件,这个文件的类型是whiteout,相当于一个删除的标记(这步可以理解为逻辑删除),这个文件会告诉文件系统标记的是哪个真实的文件,文件系统读到这个whiteout文件就知道要把哪个文件藏起来不显示了。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值