博客 / 詳情

返回

docker如何遷移更省空間

遷移鏡像時候,往往會碰到基礎鏡像相同的很多鏡像需要遷移,這個時候如果單獨docker save的話,鏡像tar包的尺寸會很大,因此為了解決這個問題,你需要換種姿勢使用docker save! docker鏡像是分層的,將基礎鏡像的相同的層合併到一起, 就可以節省空間了。

方法一:使用docker save命令

  1. 首先保存各個鏡像到單獨的tar文件:

    docker save -o image1.tar image1:tag
    docker save -o image2.tar image2:tag
    docker save -o image3.tar image3:tag
  2. 然後將這些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文件)更節省磁盤空間,原因如下:

空間效率對比

  1. 方法二更優

    • 當多個鏡像共享相同的層時,docker save會自動去重
    • 生成的單個tar文件只包含唯一的鏡像層,共享層不會重複存儲
    • 例如如果image1和image2都基於相同的Ubuntu基礎層,這個基礎層只存儲一次
  2. 方法一更耗空間

    • 每個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

其他優勢

方法二還有額外優點:

  1. 操作更簡單(單條命令完成)
  2. 加載更方便(單條docker load命令)
  3. 更好地保持鏡像間的依賴關係

結論

推薦總是使用方法二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
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.