在日常維運或開發中,我們常會在一台主機(例如 A 機器)上建立新的 Docker 映像檔(image),並想將它移轉到另一台主機(B 機器)使用。這時常見的疑問是:
若我在 A 機器上建立的映像
XX是從YY映像衍生(FROM YY)而來,那我在複製時,是否需要把YY也一起複製到 B 機器?
結論先講:
👉 不需要另外拷貝 YY!
🔍 為什麼只要複製 XX 就夠?
Docker 映像是由多層(layer)組成的,XX 映像是以 YY 為基底延伸出的新層。
當你使用 docker save 將 XX 打包時,Docker 會自動包含它所依賴的所有父層(也就是 YY 的部分)。
因此,當你在另一台機器使用 docker load 匯入後,Docker 會自動還原整個映像層結構:
- 若該機器已有部分相同的層,會自動跳過(去重處理)。
- 若沒有,會一併匯入完整層。
💡 正確的搬移方法
方法一:使用 docker save / docker load(離線搬移)
# 在 A 機器上打包映像
docker save -o xx.tar XX:tag
# 傳送 xx.tar 到 B 機器後
docker load -i xx.tar
這樣 B 機器就會同時擁有:
XX映像- 以及
XX所依賴的所有父層(包含YY)
方法二:透過私有或公有 Registry(線上搬移)
# 在 A 機器上
docker tag XX:tag my-registry.example.com/ns/xx:tag
docker push my-registry.example.com/ns/xx:tag
# 在 B 機器上
docker pull my-registry.example.com/ns/xx:tag
這樣 B 只會下載缺少的層,節省時間與頻寬,非常適合長期部署與同步。
⚠️ 常見錯誤與注意事項
- ❌ 不要用
docker export/docker import
這是針對「容器檔案系統」,不包含映像的層與歷史資訊。 - ⚙️ 確認平台架構一致
例如linux/amd64與linux/arm64之間不可直接通用。
若要跨架構搬移,可使用:docker buildx build --platform linux/amd64,linux/arm64 ... - 📦 若想同時備份多個映像
也可以一次打包:docker save YY:tag XX:tag -o both.tar
✅ 結論
在 Docker 中,映像的層會自動隨依賴關係一併打包或拉取。
因此:
只要拷貝或推送
XX映像即可,底層的YY映像層會自動被包含或下載。
📘 延伸閱讀