Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

overlay2

一、overlay2 是什么?

overlay2 是 Docker / containerd 默认、推荐使用的 联合文件系统(Union FS)存储驱动,基于 Linux OverlayFS 实现。

overlay2 = OverlayFS + 多层镜像优化方案

二、overlay2 解决了什么问题?

在容器场景中:

  • 镜像是 多层只读
  • 容器需要一个 可写层
  • 多个容器需要 共享镜像层
  • 不希望复制整份文件(节省空间)

overlay2 正是为此而生。

三、OverlayFS 核心概念(非常重要)

OverlayFS 把多个目录“叠加”成一个视图。

四个关键目录

目录 作用
lowerdir 只读层(镜像层,可多层)
upperdir 可写层(容器层)
workdir 内部工作目录(必须空)
merged 挂载后对外暴露的目录

示意图:

           merged (容器看到的文件系统)
        ┌────────┴────────┐
        │                 │
    upperdir          lowerdir(s)
   (container)      (image layers)

四、overlay vs overlay2 的区别

项目 overlay overlay2
lowerdir 层数 只能 1 层 支持 多层
镜像层数 受限 几乎无限
性能 一般 更优
是否推荐

Docker 17+ 默认使用 overlay2

五、overlay2 在 Docker 中的目录结构

通常在:

/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 参数过长)

六、容器读写行为(重点)

1️⃣ 读取文件

顺序:

upperdir -> lowerdir -> lowerdir...
  • 找到即返回
  • 不会复制

2️⃣ 写入文件(Copy-on-Write)

如果写的是 lowerdir 中的文件:

lowerdir/file -> copy -> upperdir/file
  • 原文件不变
  • upperdir 覆盖 lowerdir

3️⃣ 删除文件(Whiteout)

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

九、查看 overlay2 实际挂载

mount | grep overlay

示例:

overlay on /var/lib/docker/overlay2/.../merged type overlay \
(lowerdir=...,upperdir=...,workdir=...)

十、常见问题与排查

1️⃣ 容器磁盘占用异常

du -sh /var/lib/docker/overlay2/*
docker system df

2️⃣ overlay 报错 invalid argument

常见原因:

  • xfs ftype=0
  • workdir 不在同一文件系统
  • lowerdir 路径过长(旧内核)

3️⃣ inode 用尽

df -i

解决方案:

  • 扩容
  • 清理无用镜像/容器
  • 使用 volume 存数据

十一、overlay2 vs 其他驱动

驱动 状态 说明
overlay2 ✅ 默认推荐 主流
devicemapper ⚠️ 过时 复杂、慢
btrfs ⚠️ 小众 功能强、问题多
zfs ⚠️ 特定场景 依赖 ZFS

十二、生产最佳实践

  1. 不要把数据库数据写在 overlay2
    • 用 volume / bind mount
  2. /var/lib/docker 单独分区
  3. xfs + ftype=1
  4. 定期清理无用镜像
  5. 不要在容器里频繁 fsync

十三、总结

overlay2 是 Docker 在 Linux 上性能、稳定性和空间效率的最佳平衡方案,本质是 OverlayFS 的工程化实现。