docker之Union FS 技术

目录

1、Union FS 技术

1.1 什么是Union FS

1.2 试验演示

1.2.1 环境介绍

1.2.1.1 测试

 1.2.2 总结

1.2 用途


1、Union FS 技术

1.1 什么是Union FS

联合文件系统(Union File System):它可以把多个目录(也叫分支)内容联合挂载到同一个目录下,而目录的物理位置是分开的。UnionFS允许只读和可读写目录并存,就是说可同时删除和增加内容。UnionFS应用的地方很多,比如在多个磁盘分区上合并不同文件系统的主目录,或把几张CD光盘合并成一个统一的光盘目录(归档)。另外,具有写时复制(copy-on-write)功能UnionFS可以把只读和可读写文件系统合并在一起,虚拟上允许只读文件系统的修改可以保存到可写文件系统当中。

AUFS又叫Another UnionFS,后来叫Alternative UnionFS,AUFS完全重写了早期的UnionFS 1.x,其主要目的是为了可靠性和性能,并且引入了一些新的功能,比如可写分支的负载均衡。AUFS在使用上全兼容UnionFS,而且比之前的UnionFS在稳定性和性能上都要好很多,后来的UnionFS 2.x开始抄AUFS中的功能。但是他居然没有进到Linux主干里,就是因为Linus不让,基本上是因为代码量比较多,而且写得烂(相对于只有3000行的union mount和10000行的UnionFS,以及其它平均下来只有6000行代码左右的VFS,AUFS居然有30000行代码),所以,工程师不断地改进代码质量,不断地提交,不断地被Linus拒掉,所以,到今天AUFS都还进不了Linux主干(今天你可以看到AUFS的代码其实还好了,比起OpenSSL好N倍,要么就是Linus对代码的质量要求非常高,要么就是Linus就是不喜欢AUFS)。 

不过,好在有很多发行版都用了AUFS,比如:Ubuntu 10.04,Debian6.0, Gentoo Live CD支持AUFS,所以,也OK了。

1.2 试验演示

 

1.2.1 环境介绍

这里用的是Ubuntu 18.04.3

系统版本

源路径

挂载路径

Unbuntu  18.04.3

/test/1

/test/2

/mnt

将/test/1和/test/2两个目录挂载到/mnt下,/test/1下有1和11文件,/test/2下有2和22文件

 

1.2.1.1 测试

(1)测试一:修改源文件内容

       

                                                                                       【经测试,修改源路径下的文件内容,挂载路径下的文件内容均也被修改】

(2)测试二:修改挂载路径下文件内容

【查看目录下文件变化时,发现1目录下多了2个文件,查看内容正是在挂载路径/mnt下修改的内容,说明在挂载路径下修改文件并不会改变源路径下的文件内容,而是会生成一个新的文件,被放到了别的目录,即使在挂载路径下降文件删除,源路径下的文件也不会删除,因为删除的是最后新生成的那个文件】

(3)删除操作

       1) 删除前:查看源路径下所有文件

     2) 挂载路径下所有文件

     3)删除操作

【一般来说只读目录都会有whiteout的属性,所谓whiteout的意思,就是如果在挂载路径/mnt中删除的某个文件,实际上仍是位于一个readonly的目录上/test/2,没有变动过,那么,在mount的/mnt这个目录中你将看不到这个文件,但是readonly这个层/test/2上我们无法做任何的修改,所以,我们就需要对这个readonly目录里的文件作whiteout。AUFS的whiteout的实现是通过在上层的可写的目录(也就是/test/1)下建立对应的whiteout隐藏文件来实现的。 所以上面的rm mnt/2操作和touch /test/1/.wh.2效果相同。

 1.2.2 总结

  • 我们在mount aufs命令中,我们没有指它/test/1和/test/2的目录权限,默认上来说,命令行上第一个(最左边)的目录是可读可写的,这里是/test/1目录,后面的全都是只读的。(一般来说,最前面的目录应该是可写的,而后面的都应该是只读的)
  • 可以指定权限mount -t aufs -o dirs=./1=rw:./2=rw test /mnt,这样的话,源文件和挂载路径下的文件就是同步的了

1.2 用途

  • CD光盘

 比如在多个磁盘分区上合并不同文件系统的主目录,或把几张CD光盘合并成一个统一的光盘目录(归档)。

  • 写时复制

具有写时复制(copy-on-write)功能UnionFS可以把只读和可读写文件系统合并在一起,虚拟上允许只读文件系统的修改可以保存到可写文件系统当中。

  • docker的镜像使用

任何程序运行时都会有依赖,无论是开发语言层的依赖库,还是各种系统lib、操作系统等,不同的系统上这些库可能是不一样的,或者有缺失的。为了让容器运行时一致,docker将依赖的操作系统、各种lib依赖整合打包在一起(即镜像),然后容器启动时,作为它的根目录(根文件系统rootfs),使得容器进程的各种依赖调用都在这个根目录里,这样就做到了环

境的一致性。

不过,这时你可能已经发现了另一个问题:难道每开发一个应用,都要重复制作一次rootfs吗(那每次pull/push一个系统岂不疯掉)?

比如,我现在用Debian操作系统的ISO做了一个rootfs,然后又在里面安装了Golang环境,用来部署我的应用A。那么,我的另一个同事在发布他的Golang应用B时,希望能够直接使用我安装过Golang环境的rootfs,而不是重复这个流程,那么本文的主角UnionFS就派上用场了。

Docker镜像的设计中,引入了层(layer)的概念,也就是说,用户制作镜像的每一步操作,都会生成一个层,也就是一个增量rootfs(一个目录),这样应用A和应用B所在的容器共同引用相同的Debian操作系统层或是Unbuntu系统层等、Golang环境层(作为只读层),而各自有各自应用程序层,和可写层。启动容器的时候通过UnionFS把相关的层挂载到一个目录,作为容器的根文件系统。

需要注意的是,rootfs只是一个操作系统所包含的文件、配置和目录,并不包括操作系统内核。这就意味着,如果你的应用程序需要配置内核参数、加载额外的内核模块,以及跟内核进行直接的交互,你就需要注意了:这些操作和依赖的对象,都是宿主机操作系统的内核,它对于该机器上的所有容器来说是一个“全局变量”,牵一发而动全身。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44250083

微信号:c_x_y_000

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值