【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目录,容器运行中新增、修改的所有数据全部永久丢失;底层镜像只读层不受影响,可被其他容器继续使用。

相关推荐
三8449 分钟前
云安全 · 02 · 容器与 Docker 安全基础
web安全·docker·云安全
天天喝旺仔2 小时前
Prometheus + Grafana 监控告警体系搭建实战:从 Exporter 指标采集、PromQL 查询到 Alertmanager 告警落地
容器·kubernetes·grafana·prometheus·时序数据库
大盛供应链·卢生11 小时前
哪些国产芯片可以替代进口芯片,哪些替代不了
fpga开发·容器
小小的木头人11 小时前
Docker 环境下迁移 containerd 数据目录:从 `/var/lib/containerd` 到 `/data/containerd`
linux·docker
Mr小林16 小时前
Docker 安装教程(在线 + 离线)
运维·docker·容器
阿里云云原生16 小时前
云栖剧透丨四场论坛,看清智能体走进生产的关键路径
云原生
Henry-SAP16 小时前
SAP PP模块核心机制解析
人工智能·云原生·sap·erp
java_logo17 小时前
Docker 部署 Milvus:轻松搭建高性能向量数据库平台
数据库·docker·私有化部署·milvus·向量数据库·rag·轩辕镜像
运维开发王义杰17 小时前
内存不报警、Pod 却连环死循环?揭秘 Linux Major Page Fault 致命抖动
云原生
wdfk_prog20 小时前
VMware Ubuntu 虚拟机从 124 GB 压缩到 33 GB
运维·缓存·docker·容器