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
| 对比项 | overlay2 | aufs |
|---|---|---|
| 内核支持 | 主线内核 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 隐藏,不真正删除
📝 发现内容有误?点击此处直接编辑