【Docker】(三)联合文件系统UnionFS + Overlay2

问答题

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成为主流,结构分为三个固定目录:

  1. lowerdir:只读底层层
    存放镜像所有只读分层,多个容器可共用同一组lower目录,磁盘复用率高,不允许任何写入修改。
  2. upperdir:容器可写层
    容器运行时所有新增、修改、删除操作全部存在此目录,每个容器独立专属upperdir。
  3. workdir:临时工作目录
    OverlayFS内部操作缓存目录,文件重命名、删除、拷贝等操作的中转缓存,挂载期间目录不可被其他进程占用。

最终 merged 目录是对外统一挂载视图,用户/容器看到的整合后完整文件系统。

四、Docker 默认存储驱动:Overlay2

Overlay2是OverlayFS的优化增强版本,也是当前Docker默认存储驱动:

  1. 支持最多128层镜像堆叠,AUFS层数限制更低;
  2. 内核原生实现,无需额外补丁,性能、稳定性远超AUFS;
  3. 所有容器分层数据统一存放在宿主机路径:/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目录,容器运行中新增、修改的所有数据全部永久丢失;底层镜像只读层不受影响,可被其他容器继续使用。

相关推荐
孔令飞16 小时前
知己知彼,百战不殆:AI SKILL 实现原理剖析
云原生·go·ai编程
姜鱼问生18 小时前
网页一片白?Docker 跑 Nginx 读不到文件,403 Forbidden 排查实录
nginx·docker·容器
\光辉岁月/19 小时前
2.spring5-IOC
java·容器·ioc·注解
ms72wx19 小时前
Docker 命令学习笔记:从入门到进阶的实战指南
笔记·学习·docker
分布式存储与RustFS19 小时前
把 LSM 引擎直接架在对象存储上:slatedb 能不能跑在 RustFS 上?
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
java_logo19 小时前
Docker 部署 Excalidraw:轻松搭建手绘风格白板
运维·docker·容器·excalidraw·白板·轩辕镜像
海的透彻21 小时前
如何让docker容器启动时用自定义的用户
java·docker·dubbo
时间售卖铺1 天前
MySQL 日志管理
运维·数据库·mysql·云原生
老郭a1 天前
流量一涨 Pod 扩不出来?K8s HPA 弹性伸缩配置避坑指南
云原生
程序员清风1 天前
LibreChat 实战:用 Docker 搭建可扩展的多模型对话平台
运维·docker·容器