Docker镜像分层共享靠内容寻址+只读叠加+联合挂载自动实现:每层以SHA-256哈希唯一标识,相同内容仅存一份物理数据,多镜像交叉引用;overlay2等联合文件系统将只读层与可写层统一挂载,用户透明使用。Docker 镜像分层技术解决多个镜像空间复用问题,核心不是“主动分配”或“手动共享”,而是靠**内容寻址 + 只读叠加 + 联合挂载**这三者自动实现的。只要层内容一致,宿主机就只存一份物理数据,所有引用它的镜像都指向同一份块。
每层由内容哈希唯一标识
每个镜像层生成时,docker 会计算其文件系统变更的 sha-256 哈希值(如 sha256:abc123...)。这个哈希就是层的“身份证”。不同镜像中,只要某一层的文件增删改完全相同,哈希就一样,docker 就认定它们是同一层。
- 例如两个项目都执行
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*,且基础镜像、包版本、系统环境一致,就会生成完全相同的层哈希; - 反之,哪怕多一个空格、少一个
rm清理命令,哈希就变,新层独立存储,复用中断。
只读层可被任意数量镜像引用
镜像本身不包含“完整文件系统”,而是一串只读层 ID 的有序列表。这些层在磁盘上以独立目录存在(如 /var/lib/docker/overlay2/abc123.../diff),多个镜像的 RootFS.Layers 数组可以交叉引用同一个目录路径。
-
nginx:alpine和redis:alpine都基于alpine:3.18,底层那个 alpine 层只存一次; - 你本地构建的 10 个微服务镜像,若都用
FROM python:3.11-slim且前几步 RUN 完全一致,对应的基础层和依赖层全部共享。
联合文件系统统一呈现,对用户透明
运行 docker run 时,Docker 用 overlay2 等驱动把所有只读层(lowerdir)和容器可写层(upperdir)挂载为一个 mergedir。用户看到的是完整文件系统,但底层数据块按需复用。
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
- 拉取第二个镜像时,Docker daemon 检查本地已有层哈希,跳过已存在的层下载;
- 执行
docker system df -v可见 “Shared Size” 列,它反映的就是被多个镜像共用的只读层总大小; - 删除某个镜像时,只要其他镜像还在引用某层,该层就不会被物理删除(引用计数机制保障)。
复用效果取决于构建方式,不是默认就有
分层机制提供了复用能力,但能否真正节省空间,取决于你是否避免破坏层一致性:
- 用
FROM ubuntu:22.04@sha256:...锁定 digest,防止基础层因上游更新而漂移; - COPY 文件前先 COPY
requirements.txt再RUN pip install,让依赖层稳定、可复用; - 所有 RUN 指令清理临时文件(如
apt clean、npm cache clean),避免时间戳或缓存导致哈希变化; - 用
.dockerignore过滤掉node_modules、.git、日志等非必要内容,防止它们意外进入新层。

















