UnionFS是Docker镜像分层机制的底层支撑,通过叠加只读镜像层与可写容器层形成统一文件系统视图,支持写时复制、同名覆盖、联合挂载和分层复用。

UnionFS 是 Docker 镜像分层机制的底层支撑,它不直接提供功能,而是让“分层”这件事在文件系统层面真正可行。它的核心作用不是存储数据,而是组织和呈现数据——把多个物理上分离的目录,变成容器眼里一个连贯、可读写的根文件系统(/)。
分层叠加:镜像层与容器层如何共存
UnionFS 允许将多个只读目录(对应 Dockerfile 中每条指令生成的镜像层)和一个可写目录(容器启动时动态创建)按顺序堆叠。从下到上依次是:基础镜像层 → 中间依赖层 → 应用层 → 容器可写层。用户访问 /etc/nginx/nginx.conf 时,系统自动从顶层开始查找,找到即返回,无需知道它实际位于哪一层。同名文件天然被上层覆盖,这正是镜像能“定制覆盖”的技术基础。
写时复制(CoW):修改不碰原始镜像
当容器内修改一个只读层里的文件(比如编辑配置),UnionFS 不会去动原始层,而是:
- 先将该文件完整复制到最上层(可写层)
- 再在可写层中执行修改操作
- 后续所有读取都指向可写层中的副本
原始镜像层保持完全不变,既保障了镜像的不可变性,也支持多个容器共享同一镜像层,互不影响。
联合挂载:对用户透明的统一视图
UnionFS 把所有层“挂载”成一个逻辑路径(如 /var/lib/docker/overlay2/xxx/merged),这个 merged 目录就是容器看到的根目录。进程在容器里执行 ls / 或 cat /proc/version,完全感知不到背后是十几层叠加的结果。这种透明性降低了使用门槛,也让构建、分发、运行三个阶段可以解耦。
分层复用:节省空间与加速构建的关键
不同镜像只要共用某一层(例如都基于 debian:12-slim),Docker 就只在磁盘上存一份该层数据。UnionFS 在挂载时自动识别并复用。构建新镜像时,若某层缓存未失效(如 RUN apt update 没变),Docker 直接复用已有层,跳过执行——这既是构建提速的原理,也是 CI/CD 中镜像层缓存生效的根本原因。

















