Overlay2 驱动在 dockerd 启动时初始化,容器运行时按需挂载镜像层;/proc/mounts 无挂载点是因 overlay 挂载仅发生在容器启动瞬间,需运行容器后才可见;复用依赖内容哈希,非确定性文件(如时间戳、node_modules)会导致失效;ext4/xfs 需支持 d_type,xfs 要 ftype=1,空间低于 10% 会拒绝新建层。

Overlay2 驱动在容器启动时如何加载镜像层
Overlay2 不是“启动时才加载”,而是 dockerd 启动时就完成初始化,后续每个容器运行时按需挂载镜像层。关键动作发生在 containerd 调用 snapshotter(如 overlayfs)准备 rootfs 的瞬间。
常见错误现象:failed to mount overlay: invalid argument —— 多半是内核不支持 overlayfs 或未启用 overlay 模块;no such file or directory 错误指向 /var/lib/docker/overlay2/l 符号链接损坏或 lowerdir 缺失。
- 检查内核是否启用:
grep CONFIG_OVERLAY_FS /boot/config-$(uname -r),输出应为y或m - 确认模块已加载:
lsmod | grep overlay,若无输出则手动sudo modprobe overlay -
/var/lib/docker/overlay2下每个子目录对应一层,l目录存符号链接(用于快速查找),损坏后docker build可能卡住但不影响已有容器 - 不要手动删除
l/下的链接——它们由overlay2自动管理,删了会导致layer not found类错误
为什么 docker info 显示 storage driver 是 overlay2,但 /proc/mounts 里看不到对应挂载点
因为 overlay2 的 mount 是按需创建的:只有当容器真正启动、调用 containerd-shim 准备 rootfs 时,才会执行一次 mount -t overlay。没运行容器时,/proc/mounts 当然为空。
验证方法很简单:启动一个容器后立刻查:
docker run -d --name test-alpine alpine sleep 300 grep overlay /proc/mounts
你会看到类似这样的一行:
overlay /var/lib/docker/overlay2/abc123.../merged overlay rw,relatime,lowerdir=/var/lib/docker/overlay2/def456.../diff:/var/lib/docker/overlay2/789.../diff,upperdir=/var/lib/docker/overlay2/abc123.../diff,workdir=/var/lib/docker/overlay2/abc123.../work 0 0
-
lowerdir是只读镜像层(多个用:分隔),顺序即镜像构建时的 FROM → RUN → COPY 层序 -
upperdir是该容器独有的可写层,所有touch、apt install都写这里 -
workdir是 overlayfs 内部所需的工作目录,必须存在且独占,不能被其他进程占用 - 如果
workdir所在文件系统满了,容器启动会失败并报invalid argument,而不是磁盘空间不足提示
overlay2 驱动下镜像层复用失效的典型场景
镜像层复用不是靠名字或 tag,而是靠内容哈希(sha256:xxx)。只要某一层 diff 的 tar 包内容完全一致,就会复用其 diff 目录。但以下情况会意外打破复用:
- Dockerfile 中
COPY . /app命令包含时间戳、日志文件、node_modules等非确定性内容 → 每次 build 生成不同哈希 - 使用
ADD加载远程 URL,而服务端响应头含动态Last-Modified→ 即使内容相同,tar包 mtime 不同,哈希就变 - 宿主机
/etc/timezone或/etc/localtime被挂载进构建上下文 → 构建环境时区影响某些工具(如 Java 编译器)生成的字节码时间戳 - 多阶段构建中,
COPY --from=0若源阶段有非幂等操作(比如go build未加-ldflags="-s -w"),二进制内部含时间戳也会导致哈希漂移
overlay2 在 ext4 和 xfs 上的表现差异与调优点
overlay2 对文件系统有隐式要求:必须支持 d_type=true(目录项可识别文件类型),否则 readdir 行为异常,可能导致 npm ls 报错或 find 漏匹配。ext4 默认开启,xfs 需要挂载时加 ftype=1。
检查方式:xfs_info /var/lib/docker 输出中必须含 ftype=1;若为 ftype=0,重建 xfs 时需指定 mkfs.xfs -n ftype=1。
- ext4 上建议关闭
barrier=1(默认开启)以降低 sync 开销,但仅限使用 UPS 或电池保护的环境 - xfs 推荐挂载参数:
noatime,nodiratime,inode64,allocsize=64k,尤其allocsize能减少小文件写放大 - 无论哪种文件系统,
/var/lib/docker所在分区剩余空间低于 10% 时,overlay2 会拒绝创建新层(防止 workdir 创建失败),错误信息是device or resource busy,而非磁盘满
最常被忽略的是 workdir 的原子性要求:它不能跨设备、不能是 bind mount、不能位于 btrfs 子卷顶层(除非启用 overlay2.override_kernel_check=1)。这些限制不出现在文档首页,但一旦触发,容器启动失败且日志极难定位。










