導出/加載鏡像(保留分層、標簽)和導出/導入容器快照(僅文件系統,丟失鏡像歷史與標簽)。
一、把鏡像打包帶走(推薦)
適合把一個或多個鏡像搬到離線/內網機器,保留分層與標簽。
- 在源服務器導出(可壓縮)
# 單個鏡像
docker image save -o myapp_v1.2.tar myrepo/myapp:1.2# 多個鏡像一起導出
docker image save -o pack.tar myrepo/myapp:1.2 redis:7-alpine nginx:1.27# 管道壓縮(體積更小)
docker image save myrepo/myapp:1.2 | gzip > myapp_v1.2.tar.gz
- 傳到目標服務器
任選其一:scp
/rsync
/U盤等
scp myapp_v1.2.tar.gz user@target:/tmp/
- 在目標服務器加載
# 若是壓縮包
gunzip /tmp/myapp_v1.2.tar.gz
docker image load -i /tmp/myapp_v1.2.tar# 或者直接管道
gzip -dc /tmp/myapp_v1.2.tar.gz | docker image load
- 驗證并運行
docker images | grep myapp
docker run --rm myrepo/myapp:1.2 --version
📌 小貼士
-
tar 內已包含標簽;加載后會出現同名鏡像與標簽。若需要改名:
docker tag myrepo/myapp:1.2 registry.local/myapp:1.2
-
大文件可拆分傳輸:
split -b 2G myapp_v1.2.tar myapp.part. cat myapp.part.* > myapp_v1.2.tar
-
校驗完整性:
sha256sum myapp_v1.2.tar # 源與目標對比
二、直接通過 SSH “邊導邊載”(省文件落地)
# 從源機把鏡像流式傳到目標機并加載
docker image save myrepo/myapp:1.2 | ssh user@target 'docker image load'
三、導出/導入“容器快照”(不是鏡像)
如果你想把正在運行或運行過的容器的文件系統(含運行期數據的修改)打包走,用 export/import
。注意:這不會保留鏡像分層、歷史、ENV、CMD 等元數據。
- 在源服務器導出容器(先找容器名/ID)
docker ps -a
docker export -o myapp-rootfs.tar CONTAINER_ID_OR_NAME
- 傳到目標服務器后導入成“新鏡像”
docker import myapp-rootfs.tar myapp:from-export
- 運行時需自己補齊啟動命令/環境變量/端口等:
docker run -e FOO=bar -p 8080:8080 myapp:from-export my_start_cmd --args
四、另一種思路:用鏡像倉庫同步
如果目標環境能訪問源倉庫或私有倉庫,這是最省事的做法:
# 源機打標簽并推送到私有倉庫
docker tag myrepo/myapp:1.2 registry.local/myapp:1.2
docker login registry.local
docker push registry.local/myapp:1.2# 目標機拉取
docker login registry.local
docker pull registry.local/myapp:1.2
五、常見問題排查
-
no space left on device
:目標機磁盤或 Docker 數據分區不足,清理后重試:docker system df docker system prune -af # ? 會刪未使用對象,謹慎
-
open ... permission denied
:確保當前用戶能訪問 tar 文件路徑,必要時用sudo
。 -
manifest unknown
:從倉庫拉取時的標簽錯誤或未推送該標簽,先docker images
核對。 -
SELinux/權限導致加載失敗:嘗試放到
/tmp
或關閉強制策略測試。
如果你告訴我要搬運的鏡像列表、體積和網絡情況(能否 SSH/能否訪問倉庫),我可以按你的場景給一套最省事的命令串。