Docker镜像分层共享通过只读层、联合文件系统和内容寻址实现高效复用:只读层以差量方式存储变更并支持多镜像安全引用;联合文件系统(如OverlayFS)叠加各层形成统一视图,零数据复制;每层由SHA256哈希唯一标识,实现构建缓存、传输去重与运行时写时复制隔离。
理解 docker 镜像分层共享,关键在于抓住“只读层 + 联合文件系统 + 内容寻址”这三个支点。它不是简单地把文件打包压缩,而是用结构化的方式让多个镜像复用相同的部分,从而在存储、传输和构建三个环节同时提效。
只读层是共享的前提
每一层都是只读的快照,记录从上一层到当前层的文件增删改差量。比如 FROM ubuntu:20.04 生成基础层,RUN apt-get install nginx 生成第二层——只存新安装的二进制、配置和依赖文件,不重复包含 Ubuntu 根文件系统。因为不可变,所以任意数量的镜像都能安全引用同一层哈希值,无需担心冲突或污染。
联合文件系统让共享“透明可见”
Docker 默认使用 OverlayFS(或其他如 AUFS、ZFS)将所有只读层叠加成一个统一视图。你看到的完整文件系统,其实是多层叠加后的逻辑结果。例如:
- 层 A:/bin/bash、/etc/os-release
- 层 B:/usr/bin/nginx、/etc/nginx/nginx.conf
- 层 C:/var/www/html/index.html
运行时,Docker 把这三层按顺序挂载,最终呈现为一个含全部路径的根目录。底层不复制数据,只做元数据映射,开销极小。
内容哈希实现自动去重与缓存复用
每层由其内容计算出唯一 SHA256 哈希值(如 sha256:abc123...)。只要两份 Dockerfile 在某条指令前完全一致,Docker 就会命中缓存,跳过执行并直接复用已存在的层。这意味着:
- 多个项目都用 FROM node:18-alpine → 公共基础层只下载、存储一次
- CI 流水线中,若只改了源码(COPY . .),前面的依赖安装层全走缓存,构建秒级完成
- 推送镜像时,远程 Registry 检查已有层哈希,仅上传新增层,大幅减少网络流量
容器启动时的写时复制(CoW)保障隔离性
共享只读层不等于共享运行状态。每个容器启动时,Docker 会在最上方动态添加一个可写层。所有写操作(如日志追加、临时文件创建)都在这一层发生;读操作则按“从上到下”查找,优先取可写层,未命中再穿透到底层只读层。这样既复用底层,又保证容器间完全隔离。


















