问答题
1、请对UnionFS(联合文件系统)的实现原理做一个完整说明。
答:
用UnionFS来实现,镜像只读,但容器是可写
在镜像层上面分支创建一个可写层,可写层会覆盖镜像层,改动时不影响底层数据,实现了底层镜像的只读不能被修改。
将它们挂载到一个文件系统,在挂载点目录mountedfs中创建、删除修改文件时,具体保存在可写层upperlayer中。
读文件读先可写层,没有了再向下读镜像层,既实现多容器共享底层镜像节省资源,又能让每个容器拥有独立可写空间,删除容器只会删除可写层upperlayer,底层镜像可重复使用。
UnionFS实现了镜像的分层存储 和 容器的数据持久化
2、Docker 和 Overlay2、UnionFS 是一个什么样的关系?
答:
Overlay2是Docker默认的存储引擎
Overlay2是基于内核实现的,而UnionFS是基于软件包实现的
一、什么是UnionFS(联合文件系统)
UnionFS是一种分层虚拟文件系统 ,核心能力:把多个独立目录(层)合并成一个统一、可视化的挂载视图。
多层目录存在同名文件时,上层文件会覆盖下层文件,底层只读层不会被修改,是Docker镜像分层、容器读写的底层基石。
二、AUFS(UnionFS升级版)完整工作原理
AUFS是早期Docker使用的联合文件系统,也是UnionFS的实现分支,分为只读底层镜像层 、上层可写容器层两层结构。
1. 文件读取逻辑
多层目录从上至下优先级递减,挂载视图优先展示上层文件:
- 可写层upper存在文件 → 直接读取upper文件;
- upper无对应文件,逐层向下读取只读镜像层内容。
2. 新增文件逻辑
在容器内新建文件,文件只会写入upper可写层,底层只读镜像层完全不会改动,实现镜像层共享复用。
3. 文件删除:whiteout白文件机制
容器中删除镜像自带文件时,不会真正删除底层只读文件 ,而是在upper层生成特殊隐藏文件 .wh.文件名(白文件)。
AUFS识别到.wh.标记后,会在统一挂载视图中隐藏对应文件,达到"删除"视觉效果;底层原始镜像文件完整保留,多个容器可以继续共享底层镜像。
三、OverlayFS 三层标准结构(lower/upper/work)
Linux 3.18内核原生引入OverlayFS,替代AUFS成为主流,结构分为三个固定目录:
- lowerdir:只读底层层
存放镜像所有只读分层,多个容器可共用同一组lower目录,磁盘复用率高,不允许任何写入修改。 - upperdir:容器可写层
容器运行时所有新增、修改、删除操作全部存在此目录,每个容器独立专属upperdir。 - workdir:临时工作目录
OverlayFS内部操作缓存目录,文件重命名、删除、拷贝等操作的中转缓存,挂载期间目录不可被其他进程占用。
最终 merged 目录是对外统一挂载视图,用户/容器看到的整合后完整文件系统。
四、Docker 默认存储驱动:Overlay2
Overlay2是OverlayFS的优化增强版本,也是当前Docker默认存储驱动:
- 支持最多128层镜像堆叠,AUFS层数限制更低;
- 内核原生实现,无需额外补丁,性能、稳定性远超AUFS;
- 所有容器分层数据统一存放在宿主机路径:/var/lib/docker/overlay2。
宿主机目录拆解说明
进入/var/lib/docker/overlay2可以看到两类目录:
- 一串随机ID命名的分层目录:对应镜像每一层文件;
- 容器专属目录:内部包含
lower(记录底层只读层)、diff(等价upper可写层)、work、merged挂载视图。
启动容器后,容器内所有操作都会同步记录到对应diff可写目录。
五、CoW写时复制机制 + 容器数据销毁原理
1. CoW 写时复制(Copy-on-Write)
底层镜像文件只读,容器修改文件时触发CoW机制:
当容器需要修改lower只读层自带文件,不会直接改动底层文件,而是先把文件完整复制到upper可写层,再在副本上修改。
挂载视图展示upper内修改后的新文件,底层原始镜像文件保持原样,保障多容器共享镜像互不干扰。
2. 容器销毁数据丢失原理
镜像所有只读层持久化保存在磁盘,但是upper可写层仅属于当前运行容器 :
执行docker rm删除容器时,Docker会直接清理该容器专属的upper、work目录,容器运行中新增、修改的所有数据全部永久丢失;底层镜像只读层不受影响,可被其他容器继续使用。