文章目录
- 方法一:使用`docker save`命令
 - 方法二:直接保存多个镜像到一个tar文件
 - 哪个方法更节省磁盘空间?
 - 空间效率对比
 - 实际测试示例
 - 其他优势
 - 结论
 
- 如何用脚本迁移
 - 加载镜像
 
迁移镜像时候,往往会碰到基础镜像相同的很多镜像需要迁移,这个时候如果单独docker save的话,镜像tar包的尺寸会很大,因此为了解决这个问题,你需要换种姿势使用docker save! docker镜像是分层的,将基础镜像的相同的层合并到一起, 就可以节省空间了。
方法一:使用docker save命令
 
-  
首先保存各个镜像到单独的tar文件:
docker save -o image1.tar image1:tag docker save -o image2.tar image2:tag docker save -o image3.tar image3:tag -  
然后将这些tar文件打包到一个tar包中:
tar -cvf all_images.tar image1.tar image2.tar image3.tar 
方法二:直接保存多个镜像到一个tar文件
Docker的save命令本身就支持一次保存多个镜像到一个文件:
docker save -o all_images.tar image1:tag image2:tag image3:tag
 
哪个方法更节省磁盘空间?
方法二(直接使用docker save保存多个镜像到一个tar文件)更节省磁盘空间,原因如下:
空间效率对比
-  
方法二更优:
- 当多个镜像共享相同的层时,
docker save会自动去重 - 生成的单个tar文件只包含唯一的镜像层,共享层不会重复存储
 - 例如如果image1和image2都基于相同的Ubuntu基础层,这个基础层只存储一次
 
 - 当多个镜像共享相同的层时,
 -  
方法一更耗空间:
- 每个
docker save命令会独立保存完整的镜像(包括所有层) - 之后再用tar打包时,相同的镜像层会被重复存储
 - 例如如果三个镜像共享同一个基础层,这个基础层会被存储三次
 
 - 每个
 
实际测试示例
假设有三个镜像:
- image1 (包含基础层300MB + 专属层100MB)
 - image2 (包含相同基础层300MB + 专属层200MB)
 - image3 (独立镜像500MB)
 
方法一结果:
- image1.tar = 400MB
 - image2.tar = 500MB
 - image3.tar = 500MB
 - 最终all_images.tar ≈ 1.4GB (基础层被存储了两次)
 
方法二结果:
- all_images.tar ≈ 300MB(基础层) + 100MB + 200MB + 500MB = 1.1GB
 
其他优势
方法二还有额外优点:
- 操作更简单(单条命令完成)
 - 加载更方便(单条
docker load命令) - 更好地保持镜像间的依赖关系
 
结论
推荐总是使用方法二(docker save -o output.tar img1 img2 img3),除非你有特殊需求需要保持镜像完全独立存储。
如何用脚本迁移
很简单,将镜像列表写入一个文本文件(e.g. imagelist)中:
- imagelist
 
nginx:v1.20.1
redis:v5.0
mysql:v8.0.21
 
执行脚本,即可将全部镜像保存:
docker save -o all_images.tar $(cat imagelist.txt)
 
加载镜像
要从组合的tar文件中加载镜像:
docker load -i all_images.tar