使用预构建Docker镜像能否减少容器注册表存储空间占用?
Docker镜像注册表空间占用问题解答
问题(翻译后):
假设我构建了一个Docker镜像xyz(大小为a),随后通过Dockerfile中的FROM xyz指令基于该镜像构建了两个新镜像,它们的大小分别为b和c。这三个镜像均存储在如AWS ECR的容器注册表中,请问使用预构建镜像能否减少注册表的总占用空间?即总占用空间是a + b + c还是a + (a+b) + (a+c)?
答案:
总占用空间既不是a + b + c,更不会是a + (a+b) + (a+c),实际占用会远小于前者,核心原因是Docker的分层存储机制:
- Docker镜像是由多个只读分层堆叠而成的,基础镜像
xyz的所有分层(总大小为a)在注册表中只会存储一次 - 基于
xyz构建的两个新镜像,仅会存储它们在基础镜像之上新增的分层内容。镜像大小b和c是包含基础层引用的总大小,而非完整复制了基础层的所有内容 - 最终注册表的实际占用空间为:
a + (b - 基础层共享大小) + (c - 基础层共享大小),也就是「基础镜像大小 + 两个子镜像新增层大小之和」
举个实际例子:如果xyz大小为1GB,两个子镜像分别在基础上新增了200MB和300MB的内容,那么它们的总大小会显示为1.2GB和1.3GB,但注册表实际只占用1GB + 200MB + 300MB = 1.5GB,而非1+1.2+1.3=3.5GB。
这种分层共享设计正是Docker镜像轻量化的关键,能大幅减少容器注册表的空间占用,不管基于同一个基础镜像构建多少个子镜像,基础层都只会被存储一次。
内容的提问来源于stack exchange,提问作者monte
相关产品推荐
相关产品推荐

