overlay2
overlay2 是 Docker / containerd 默认、推荐使用的 联合文件系统(Union FS)存储驱动,基于 Linux OverlayFS 实现。
overlay2 = OverlayFS + 多层镜像优化方案
在容器场景中:
- 镜像是 多层只读
- 容器需要一个 可写层
- 多个容器需要 共享镜像层
- 不希望复制整份文件(节省空间)
overlay2 正是为此而生。
OverlayFS 把多个目录“叠加”成一个视图。
四个关键目录
| 目录 | 作用 |
|---|---|
| lowerdir | 只读层(镜像层,可多层) |
| upperdir | 可写层(容器层) |
| workdir | 内部工作目录(必须空) |
| merged | 挂载后对外暴露的目录 |
示意图:
merged (容器看到的文件系统)
↑
┌────────┴────────┐
│ │
upperdir lowerdir(s)
(container) (image layers)
| 项目 | overlay | overlay2 |
|---|---|---|
| lowerdir 层数 | 只能 1 层 | 支持 多层 |
| 镜像层数 | 受限 | 几乎无限 |
| 性能 | 一般 | 更优 |
| 是否推荐 | ❌ | ✅ |
Docker 17+ 默认使用 overlay2。
通常在:
/var/lib/docker/overlay2/
示例:
overlay2/
├── 3a1c.../
│ ├── diff/ # upperdir 或 layer 内容
│ ├── link # 短 ID
│ ├── lower # 指向 lowerdir
│ ├── work/ # workdir
│ └── merged/ # 容器挂载点
├── l/
│ ├── ABCDEF... -> ../3a1c.../diff
各目录含义
| 目录 | 说明 |
|---|---|
| diff/ | 当前层的真实文件 |
| lower | 父层引用(多层) |
| merged/ | 容器运行时看到的 FS |
| work/ | OverlayFS 工作目录 |
| l/ | layer 的短路径索引(避免 mount 参数过长) |
顺序:
upperdir -> lowerdir -> lowerdir...
- 找到即返回
- 不会复制
如果写的是 lowerdir 中的文件:
lowerdir/file -> copy -> upperdir/file
- 原文件不变
- upperdir 覆盖 lowerdir
OverlayFS 使用 whiteout 文件:
.wh.filename
- 表示“在 lowerdir 中存在,但在 merged 中被删除”
- 非常节省磁盘空间
- 启动快(无需复制)
- 镜像层可共享
| 问题 | 说明 |
|---|---|
| 小文件大量写入 | 性能下降 |
| inode 消耗快 | upperdir 占 inode |
| fsync 开销 | overlay fsync 成本高 |
| 目录层级深 | lookup 变慢 |
overlay2 对底层 FS 有要求:
| 文件系统 | 支持情况 |
|---|---|
| ext4 | ✅ 推荐 |
| xfs (ftype=1) | ✅ 必须 |
| xfs (ftype=0) | ❌ 不支持 |
检查方式
xfs_info /var/lib/docker | grep ftype
必须是:
ftype=1
mount | grep overlay
示例:
overlay on /var/lib/docker/overlay2/.../merged type overlay \
(lowerdir=...,upperdir=...,workdir=...)
du -sh /var/lib/docker/overlay2/*
docker system df
常见原因:
- xfs ftype=0
- workdir 不在同一文件系统
- lowerdir 路径过长(旧内核)
df -i
解决方案:
- 扩容
- 清理无用镜像/容器
- 使用 volume 存数据
| 驱动 | 状态 | 说明 |
|---|---|---|
| overlay2 | ✅ 默认推荐 | 主流 |
| devicemapper | ⚠️ 过时 | 复杂、慢 |
| btrfs | ⚠️ 小众 | 功能强、问题多 |
| zfs | ⚠️ 特定场景 | 依赖 ZFS |
- 不要把数据库数据写在 overlay2
- 用 volume / bind mount
- /var/lib/docker 单独分区
- xfs + ftype=1
- 定期清理无用镜像
- 不要在容器里频繁 fsync
overlay2 是 Docker 在 Linux 上性能、稳定性和空间效率的最佳平衡方案,本质是 OverlayFS 的工程化实现。