Docker镜像通过内容寻址存储(CAS)实现存储去重,核心是“相同内容→相同SHA256哈希→复用同一层”;基础层与中间层可跨镜像共享,构建、推送、拉取均跳过已存在层,显著节省磁盘与带宽。

Docker镜像通过内容寻址存储(CAS)机制天然支持存储空间去重,核心在于“相同内容 → 相同哈希 → 复用同一层”。只要两层文件系统变更完全一致,无论来自哪个镜像、哪个构建过程,Docker 都只存一份物理数据。
每层由 SHA256 哈希唯一标识
Docker 不按文件名或路径识别层,而是对每一层的全部内容(包括文件增删改、元数据、权限等)计算 SHA256 哈希值。这个哈希就是该层的“内容指纹”:
- 例如:sha256:9d3dd9504c685a5d2c6e417d4b1e4f0e9c4f4b4a4e4c4d4b4a4e4c4f4b4a4e4c
- 只要构建步骤产出的文件系统状态完全相同,哈希就完全一致
- 镜像 ID、层 ID、拉取时返回的 Digest,底层都指向这个哈希
基础层与中间层自动共享
多个镜像共用相同操作系统或运行时环境时,对应层在磁盘上只保留一次:
- Ubuntu 22.04 基础层被 15 个不同应用镜像引用 → 磁盘中仅存 1 份
- Node.js 18 安装层在多个 Node 应用中复用 → 不重复存储二进制和依赖文件
- 即使 Dockerfile 指令顺序不同,只要最终层内容一致(如 RUN apt-get install curl 和 RUN apt-get install -y curl),哈希仍可命中缓存
构建与拉取过程均受益于去重
CAS 不仅节省本地磁盘,也优化远程传输:
- 构建时:Docker 检查本地已有层哈希,跳过重复生成,直接复用
- 推送时:仅上传本地没有的层(即哈希未在远端注册中心存在的层)
- 拉取时:注册中心返回镜像各层哈希列表,客户端只下载缺失层,已存在层直接跳过
- DockerHub 等服务利用 CAS,使单 GB 镜像平均存储成本降低 65%
注意:标签不影响去重,但影响清理行为
标签(如 latest、v1.2.0)只是对镜像摘要的可变别名,不改变底层层结构:
- 覆盖 latest 标签不会删除旧层——只要没被其他标签或容器引用,它会变成“悬空层”(dangling),仍占磁盘空间
- 真正释放空间需显式清理:如
docker image prune -f删除所有悬空层,或docker system prune -a清理无引用镜像 - 推荐使用不可变标签(如 sha-abc123f 或 v1.2.0)配合定期策略清理,避免无效层堆积











