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 中。
三、总结
当运行容器时:
在只读镜像层之上添加可写层
所有运行时修改发生在可写层
容器删除 → 可写层消失 → 镜像保持纯净
UnionFS的核心优势其实围绕三个关键词:共享、隔离、效率。具体体现在:
1 分层机制节省存储空间(多个容器共享基础镜像层)
2 写时复制保证安全性(原始镜像永不修改)
3 联合挂载实现高效部署(无需复制完整文件系统)