OverlayFS(Overlay2)文件系统深度解析
Overlay2 是 Docker 默认使用的联合文件系统(Union Filesystem) ,用于管理容器镜像的分层存储和容器运行时文件系统的合并。它基于 Linux 内核的 OverlayFS 技术,是早期 aufs
和 overlay
的改进版本。
1. OverlayFS 的核心概念
OverlayFS 通过堆叠多层目录来实现文件系统的联合挂载,主要分为:
-
Lower Dir(下层,只读):通常是镜像层(Image Layers)。
-
Upper Dir(上层,可写):容器运行时新增或修改的文件。
-
Work Dir(工作目录):OverlayFS 内部用于准备文件的临时目录。
-
Merged Dir(合并视图):最终呈现给容器的统一文件系统。
2. Overlay2 在 Docker 中的工作方式
Docker 镜像采用分层存储,每一层都是一个只读文件系统(Lower Dir)。当启动容器时,Overlay2 会:
-
镜像层(Lower Dir) :所有镜像层按顺序堆叠(如
base-image → apt-get install → copy files
)。 -
容器层(Upper Dir):在镜像层之上创建一个可写层,存储容器运行时的修改。
-
合并视图(Merged):将只读层和可写层合并,形成容器的完整文件系统。
3. 查看 Docker 的 Overlay2 存储结构
Docker 的 Overlay2 数据默认存储在 /var/lib/docker/overlay2/
(如果你的示例中挂载在 /mnt/newdisk/docker/overlay2
,说明 Docker 数据目录被迁移到了该磁盘)。
关键目录说明
/var/lib/docker/overlay2/
├── <layer-id> # 每个镜像或容器层对应一个目录
│ ├── diff # 该层的实际文件内容(相当于 Lower Dir)
│ ├── link # 短标识符(用于避免长ID路径问题)
│ ├── lower # 指向父层的引用(如 `l/ABC123`)
│ └── work # OverlayFS 内部工作目录
├── l/ # 短链接目录(优化路径访问)
└── <container-id> # 容器运行时目录
├── merged/ # 合并后的文件系统(容器看到的视图)
├── upper/ # 可写层(Upper Dir)
└── work/ # OverlayFS 工作目录
4. 文件读写规则
操作类型 | 行为 |
---|---|
读取文件 | 从最上层 Lower Dir 开始查找,直到找到该文件。 |
修改文件 | 文件若在 Lower Dir(只读),则先复制到 Upper Dir(写时复制,CoW),再修改。 |
删除文件 | 在 Upper Dir 创建 whiteout 文件(如 .wh.filename ),隐藏 Lower Dir 中的文件。 |
新建文件 | 直接写入 Upper Dir。 |
5. df -h
显示多个 Overlay 挂载
overlay 334G 159G 160G 50% /mnt/newdisk/docker/overlay2/.../merged
-
每个
merged
目录对应一个正在运行的容器的合并视图。 -
由于多个容器可能共享相同的镜像层(Lower Dir),但每个容器有自己的 Upper Dir,因此
df
可能会重复统计共享层(实际磁盘占用并非简单相加)。
6. Overlay2 的优点
-
高效分层存储:多个容器共享相同的基础镜像层,节省空间。
-
写时复制(CoW):只有修改文件时才复制,减少磁盘 I/O。
-
性能较好 :相比
aufs
和devicemapper
,Overlay2 是 Docker 推荐的存储驱动。
7. 潜在问题与注意事项
(1)磁盘空间显示不准确
-
df
可能会重复计算共享层,实际占用比显示的要小。 -
用
docker system df
查看 Docker 的真实磁盘使用情况:docker system df
输出示例:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 5 3 2.1GB 800MB (38%) Containers 3 1 300MB 300MB (100%) Local Volumes 2 1 500MB 500MB (100%)
(2)清理无用数据
-
删除无用镜像、容器和卷:
docker system prune -a # 清理所有未使用的对象 docker volume prune # 清理未使用的卷
(3)大文件导致磁盘占满
-
容器日志或应用程序写入的大文件可能堆积在 Upper Dir。
-
检查容器日志大小:
docker logs <container-id> --tail 100 # 查看日志
-
限制日志大小(在
docker run
时添加--log-opt max-size=10m
)。
8. 进阶:手动调试 Overlay2
如果想直接查看某个容器的文件系统:
# 找到容器的 Merged Dir(需 root 权限)
docker inspect <container-id> | grep MergedDir
# 进入合并后的文件系统
ls /var/lib/docker/overlay2/<container-id>/merged
总结
-
Overlay2 是 Docker 的分层存储引擎,通过联合挂载实现高效的文件管理。
-
Lower Dir(镜像层)只读 ,Upper Dir(容器层)可写 ,
merged
是最终视图。 -
df -h
可能显示重复统计,建议用docker system df
查看真实占用。 -
定期清理无用镜像和日志,避免磁盘占满。