【docker】UnionFS联合操作系统

Linux 的 Namespace、CGroups 和 UnionFS 三大技术支撑了 Docker 的实现。

一、为什么需要联合文件系统?

在传统操作系统中,每个文件系统都是独立的孤岛。但当我们需要:

  • 合并多个目录的内容

  • 保持基础系统不变的同时进行修改

  • 高效共享重复文件内容

UnionFS应运而生!它通过文件系统堆叠技术,将多个目录(通常是只读的)合并成一个统一的视图。

二、UnionFS的核心魔法原理

接下来我们用一个例子理解下UnionFS文件系统
创建以下目录
注意,layer1 和 layer2 目录中各有一个文件 file1,但文件内容不同。
  • layer1 和 layer2:模拟 Docker镜像的只读层(类似刻录的光盘,内容不可变)

  • upperlayer:模拟 容器的可写层(像透明便利贴,记录修改)

  • mountedfs:联合挂载点(展示"合并后的世界")

使用基本语法挂载文件系统:
说明:-t aufs:指定文件系统类型为 aufs。
-o br:upperlayer:layer1:layer2:-o 用于指定挂载选项。br 是 aufs 的选项,表示指定分支(branches)。upperlayer:layer1:layer2 是分支的具体路径,upperlayer 是上层目录,通常是可写
层。layer1 和 layer2 是只读层,通常是基础镜像层或依赖层。多个分支用冒号:分隔。
none:表示没有实际的设备文件,因为 aufs 是一个虚拟文件系统。
mountedfs:挂载点目录,即文件系统挂载的目标路径。
检查挂载点 mountedfs,可以看到其内容就是 layer1 和 layer2 的并集,注意 file1 的内容:
可以看到,挂载点目录的 file1 显示的是 layer1 中 file1 的内容,而没有显示 layer2 中 file1 的内容。 这是由在设置 AUFS 文件系统的分支(即层)的时候 upperlayer:layer1:layer2 选项所决定的,layer1 在前,AUFS 的优先级是从左到右的,这就意味着,如果一个文件存在于两个层中,则 AUFS 文件 系统中显示的版本将是最左侧层的版本,理解这一点非常重要。
接下来,我们在挂载点目录创建一个内容为"new content for file4"的新文件 file4:
file4 实际是创建在了 upperlayer 这一可写层的。
继续,如果删除挂载点目录文件 file1,会发生什么情况呢?

删除file1,挂载点mountedfs中的file1尽管被删除了,实际在 upperlayer 生成 隐藏标记文件( .wh.file1)(告诉系统:虽然底层有file1,但请假装看不见),layer1/file1 和 layer2/file1 完好无损。这样,file1 文件不会显示在最终挂载的文件系统中。

如果我们在挂载点目录重新创建 file1 时(注意文件内容和前面删除的并不一样),那么

这个控制文件会被移除掉,新的 file1 所在目录是在 upperlayer 中。

三、总结

当运行容器时:

  1. 在只读镜像层之上添加可写层

  2. 所有运行时修改发生在可写层

  3. 容器删除 → 可写层消失 → 镜像保持纯净

UnionFS的核心优势其实围绕三个关键词:共享、隔离、效率。具体体现在:

1 分层机制节省存储空间(多个容器共享基础镜像层)

2 写时复制保证安全性(原始镜像永不修改)

3 联合挂载实现高效部署(无需复制完整文件系统)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值