【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可写层)、workmerged挂载视图。
    启动容器后,容器内所有操作都会同步记录到对应diff可写目录。

五、CoW写时复制机制 + 容器数据销毁原理

1. CoW 写时复制(Copy-on-Write)

底层镜像文件只读,容器修改文件时触发CoW机制:

当容器需要修改lower只读层自带文件,不会直接改动底层文件,而是先把文件完整复制到upper可写层,再在副本上修改。

挂载视图展示upper内修改后的新文件,底层原始镜像文件保持原样,保障多容器共享镜像互不干扰。

2. 容器销毁数据丢失原理

镜像所有只读层持久化保存在磁盘,但是upper可写层仅属于当前运行容器

执行docker rm删除容器时,Docker会直接清理该容器专属的upper、work目录,容器运行中新增、修改的所有数据全部永久丢失;底层镜像只读层不受影响,可被其他容器继续使用。

相关推荐
阿里云云原生35 分钟前
AI 创新实践论坛·上海站精彩回顾 & PPT 下载
云原生
初级炼丹师(爱说实话版)38 分钟前
Ubuntu服务器配置docker
服务器·ubuntu·docker
阿里云云原生1 小时前
轮子还要自己造吗?SRE 团队视角:从“全栈自研”到“拥抱云原生可观测底座”的思考
云原生
生活爱好者!2 小时前
NAS还能用来开视频会议?docker一键部署MiroTalk SFU
运维·docker·容器
兵bing3 小时前
Docker Compose 进阶配置与最佳实践笔记
docker
是良辰3 小时前
Docker Nginx HTTPS 自签证书部署完整操作文档
nginx·docker·https
瞬间&永恒~5 小时前
【Docker】(四)Namespace 详解
运维·docker·容器
就改了5 小时前
Docker安装并运行Redis
redis·docker·容器
yagami_gagami6 小时前
第四届黄河流域公安院校电子物证个人赛服务器取证
linux·服务器·网络·mysql·安全·docker·llama
小挪号底迪滴7 小时前
Docker 多阶段构建实战:让 Python 镜像更小、更快、更安全
python·安全·docker