docker容器的三大核心UnionFS(上)
UnionFS 相关内容整理
UnionFS(联合文件系统)是 Docker 实现镜像分层存储和容器数据管理的核心技术之一,其核心能力是将多个独立的文件系统(或目录)“合并” 为一个统一的虚拟文件系统视图,同时保持各底层文件系统的独立性。以下是文档中关于 UnionFS 的技术原理、实现方案及 Docker 应用的详细整理:
一、UnionFS 核心概念与价值
1. 定义与核心作用
UnionFS 是一种分层、轻量级的文件系统,支持将多个分支(Branch)(即独立的目录或文件系统)以只读或可写的模式叠加,形成一个统一的挂载点。在 Docker 中,其核心作用包括:
实现镜像分层存储:Docker 镜像由多个只读层组成,UnionFS 负责将这些层合并为统一视图,减少镜像冗余(不同镜像可共享底层公共层)。
支持容器可写层:容器运行时基于镜像只读层创建一个可写层,所有修改(如创建、删除、修改文件)仅作用于可写层,不影响底层镜像,保证镜像的不可变性。
提升资源效率:通过分层共享和写时复制(Copy-on-Write)机制,减少磁盘占用和镜像分发时间。
2. 关键特性
分层叠加:多个只读层(Lower Layer)和一个可写层(Upper Layer)按优先级叠加,统一对外提供访问。
写时复制(CoW):仅当修改只读层中的文件时,才会将该文件复制到可写层进行修改,避免直接修改底层只读数据。
删除屏蔽(Whiteout):删除文件时,不会真正删除底层只读层的文件,而是在可写层创建特殊的 “屏蔽文件”(如 .wh.*),指示 UnionFS 隐藏底层文件。
二、Docker 中 UnionFS 的主要实现方案
Docker 支持多种 UnionFS 变体,文档中重点介绍了 AUFS 和 OverlayFS(及改进版 Overlay2),其中 Overlay2 是当前 Docker 的默认存储驱动。
1. AUFS(Advanced UnionFS)
AUFS 是 UnionFS 的增强版,支持多只读层和一个可写层的叠加,曾是 Docker 早期的主流存储驱动,但其依赖用户态实现,性能略逊于内核级的 OverlayFS。
(1)核心原理与分层结构
分支组成:由 upperlayer(可写层)、多个 layer(只读层,如镜像层)组成,优先级从左到右递减(左侧层优先级高于右侧)。
文件访问规则:
读取文件时,UnionFS 从左到右扫描各层,优先返回第一个匹配的文件。
修改文件时,触发写时复制:将只读层的目标文件复制到 upperlayer,修改仅作用于 upperlayer。
删除文件时,在 upperlayer 创建 /.wh.<filename> 屏蔽文件,隐藏底层只读层的文件。