文章目錄
- 方法一:使用`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