Docker镜像分层通过OverlayFS等联合文件系统实现,核心是“分层叠加+写时复制”:读取时从上层(UpperDir)向下逐层查找并立即返回,写入时仅复制被修改文件至可写层,底层只读层共享复用,显著减少冗余I/O。
docker 镜像分层通过联合文件系统(如 overlayfs)实现高效读写,核心在于“分层叠加 + 按需写入”,不是靠增大 i/o 吞吐,而是靠减少冗余操作和精准定位数据。
读取:从上到下快速命中
联合文件系统把所有只读层(LowerDir)和顶层可写层(UpperDir)合并成一个统一视图。读文件时,内核按层序从上往下查找——先查可写层,再逐层向下,一旦找到就立即返回,不继续遍历。这意味着:
- 常用配置或覆盖文件放在上层,能显著缩短查找路径
- 基础系统文件(如 /bin/bash)通常在最底层,但因只读且缓存稳定,实际读取开销极低
- 没有“全盘扫描”,读性能接近单层文件系统
写入:写时复制(CoW)避免污染底层
修改一个只读层里的文件时,联合文件系统不会直接改原文件,而是先把它完整复制到可写层,再在可写层中编辑。这个机制带来两个关键优势:
- 底层镜像层保持原始状态,多个容器可安全共享同一层,无需加锁或隔离
- 只复制被修改的文件,不是整层拷贝——比如改了 /etc/nginx/nginx.conf,不会动 /usr/bin/nginx
- 删除文件也走 CoW:在可写层创建一个“白名单”标记,表示该文件在合并视图中不可见
层间共享提升整体 I/O 效率
联合文件系统让“相同内容只存一份”成为可能,直接影响读写体验:
- 本地构建时,若某层(如 RUN apt-get install curl)哈希未变,Docker 直接复用缓存层,跳过执行和写磁盘
- 拉取镜像时,只下载本地缺失的层,已有层(如基础 alpine 层)完全跳过,大幅减少网络读
- 运行多个容器时,10 个容器共用同一个 ubuntu:22.04 基础层,磁盘只读一次,内存页也可共享(通过 page cache)
优化读写的关键实操点
要真正发挥联合文件系统的优势,构建时就得配合它的逻辑:
- 把变动少的内容(OS、运行时)放前面,确保它们落在底层,便于复用
- 把频繁变更的内容(应用代码、配置)放后面,让它们集中在上层,降低 CoW 扰动范围
- 避免在中间层删除大文件(如 RUN apt-get clean),因为原文件仍在磁盘,只是被遮蔽——应与安装命令合并到同一层
- 使用多阶段构建,让编译环境层完全不进入最终镜像,减少无关层对读写路径的干扰


















