镜像在多容器间秒级共享依赖分层存储与联合文件系统:只读层通过内容哈希(sha256)唯一标识并复用,所有容器共享同一组底层数据块;运行时仅叠加轻量可写层,由overlayfs实时合并视图,实现高效隔离与低开销。

镜像在多容器间能秒级共享,靠的不是复制文件,而是复用已加载的只读层。核心在于分层存储架构本身不为每个容器准备完整副本,而是让所有容器指向同一组底层数据块。
只读层天然可共享
Docker 镜像由多个只读层(Layer)组成,每层是内容寻址的——相同操作生成完全一致的 SHA256 哈希值。只要两个镜像共用某一层(比如都基于 alpine:3.18),本地就只存一份该层数据。
- 镜像构建时,RUN apk add curl 生成的层,在所有使用该指令的镜像中 ID 相同,自动复用
- 执行 docker images --digests 可看到镜像各层的 digest,相同 digest 表示物理存储共用
- 哪怕启动 100 个基于同一镜像的容器,基础操作系统层、依赖层、代码层都只加载一次到内存或磁盘缓存中
运行时仅叠加一个轻量可写层
每个容器启动时,Docker 不复制整个镜像,而是在共享只读层之上,动态挂载一个独立的、空的可写层(UpperDir)。这一层默认极小(初始几乎为 0 字节),且仅记录运行时变更。
- 修改配置文件?系统用 Copy-on-Write 把原始文件从只读层“拉”进本容器的可写层再编辑
- 写日志或上传文件?全部落在该容器专属的可写层,不影响其他容器
- 这个可写层通常几 KB 到几 MB,远小于完整镜像(常达百 MB 级),所以启动快、开销低
联合文件系统实时合成视图
OverlayFS(主流驱动)将所有只读层(LowerDir)和当前容器的可写层(UpperDir)合并挂载到 /var/lib/docker/overlay2/
- 容器内读取 /usr/bin/python:OverlayFS 自动从最上层往下找,命中即返回,全程毫秒级
- 不同容器访问同一路径,底层数据块被多个 merged 目录同时引用,无需拷贝
-
docker inspect
查看 GraphDriver.Data.MergedDir 可定位实际挂载点
验证共享效果的实操方式
不需要翻源码,几个命令就能确认分层共享是否生效:
- 用相同基础镜像构建两个镜像(如 A 和 B),执行 docker history A 和 docker history B,观察前 N 层 ID 是否一致
- 启动两个容器后,运行 ls -l /var/lib/docker/overlay2/*/diff,会发现只有各自可写层有内容,共享层目录为空
- 删除其中一个容器(docker rm),另一个仍正常运行——说明可写层隔离,只读层未受影响











