全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-21 7 分钟 ✍️ juanwangdev

UnionFS 联合文件系统

UnionFS 是 Docker 镜像分层存储的核心,下面深入分析 overlay2 驱动原理。

UnionFS 概念

联合文件系统允许多个文件系统挂载到同一挂载点,形成统一视图。

Bash
层1 (只读): 基础系统层 (Ubuntu)
层2 (只读): 运行时层 (JDK)
层3 (只读): 应用层 (App.jar)
容器层 (读写): 运行时修改

overlay2 架构

Bash
/var/lib/docker/overlay2/
├── <image-id>/
│   ├── diff/      # 层内容
│   ├── link       # 硬链接
│   └── lower      # 下层引用
└── <container-id>/
    ├── diff/      # 容器可写层
    ├── merged/    # 合并视图
    ├── work/      # 工作目录
    └── link       # 链接

挂载流程

Bash
# 查看 overlay2 挂载
mount | grep overlay

# 输出
overlay on /var/lib/docker/overlay2/<id>/merged type overlay (rw,relatime,lowerdir=...,upperdir=...,workdir=...)

参数说明:

  • lowerdir:只读镜像层(多个用冒号分隔)
  • upperdir:容器可写层
  • workdir:工作目录(原子操作用)
  • merged:合并后的视图

写时复制 (CoW)

dockerfile
容器读取文件:
1. 检查 upperdir (容器层)
2. 不存在则检查 lowerdir (镜像层)
3. 返回第一个匹配

容器修改文件:
1. 复制文件从 lowerdir 到 upperdir
2. 在 upperdir 中修改
3. 原始镜像层不变

删除文件

text
# 删除镜像层中的文件
rm /merged/file.txt

# overlay2 在 upperdir 创建 whiteout 文件
# 隐藏 lowerdir 中的原始文件

层复用

text
镜像A: 层1 + 层2 + 层3
镜像B: 层1 + 层2 + 层4

# 层1 和层2 在磁盘仅存储一份
# 镜像A 和 B 共享层1、层2
text
# 查看层复用
docker system df -v

# 输出显示共享层

overlay2 vs aufs

对比项overlay2aufs
内核支持主线内核 4.0+非主线
层数限制128 层无限制
性能更高较低
推荐度✅ 推荐⚠️ 旧

磁盘优化

text
# 减少层数(合并 RUN)
# 错误:多层
RUN apt-get update
RUN apt-get install -y nginx
RUN rm -rf /var/lib/apt/lists/*

# 正确:一层
RUN apt-get update && \
    apt-get install -y nginx && \
    rm -rf /var/lib/apt/lists/*

要点总结

  • UnionFS 允许多个只读层 + 一个可写层形成统一视图
  • overlay2 是 Docker 推荐驱动,支持主线内核
  • 写时复制 (CoW) 修改文件时复制到容器层
  • 镜像层在多个镜像间共享,节省磁盘空间
  • 删除文件通过 whiteout 隐藏,不真正删除

📝 发现内容有误?点击此处直接编辑

← 上一篇 Namespace 隔离机制
下一篇 → 容器与宿主机内核关系
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库