切換選單
切換偏好設定選單
切換個人選單
尚未登入
若您做出任何編輯,會公開您的 IP 位址。

把 Docker 容器從舊的服務器遷移掉新的服務器上

出自md5.pw
於 2026年2月15日 (日) 22:49 由 James留言 | 貢獻 所做的修訂 (把 Docker 容器从旧的服务器迁移掉新的服务器上)
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)

每逢「黑色星期五」或商家大促,很多人都會入手線路更好、配置更高的 VPS。但隨之而來的頭痛問題就是:如何把舊服務器上跑得好好的 Docker 服務,原封不動地搬到新機器上?

如果只是重新 docker run 一遍,原本積累的數據庫、網站文章、配置信息都會丟失。

這篇教程將提供一套「生產環境級」的遷移方案,利用 rsync 工具,連同鏡像、配置文件和持久化數據(Database/Data)一起「搬家」,確保新機器啟動後,和舊機器一模一樣。

遷移前的準備

  • 舊 VPS (Source):擁有 root 權限,Docker 服務正在運行。
  • 新 VPS (Target):擁有 root 權限,建議預先安裝好 Docker 和 Docker Compose。
  • SSH 連接:確保舊 VPS 可以通過 SSH 連接到新 VPS。

核心思路:為什麼不推薦「導出鏡像」?

新手常見的誤區是使用 docker exportdocker save。這些命令只能遷移容器的運行環境(鏡像),而無法遷移 卷(Volumes)里的數據。

最穩妥的遷移方式是:基於文件目錄的同步。

只要你的 Docker 項目是規範的(即使用 docker-compose.yaml + 掛載本地目錄 ./data),我們只需要把整個項目文件夾同步過去,然後在能在新機器上一鍵復活。


第一步:在新 VPS 上安裝 Docker 環境

在開始遷移數據前,新房子得先裝修好。請在新 VPS 上安裝 Docker 環境。(如果已安裝可跳過)

# 1. 更新系统
apt update && apt upgrade -y

# 2. 一键安装 Docker (官方脚本)
curl -fsSL https://get.docker.com | bash

# 3. 启动并开机自启
systemctl start docker
systemctl enable docker

第二步:在舊 VPS 上停止服務

這是最重要的一步。 如果你在數據庫(MySQL, Redis, PostgreSQL)運行時強行複製代碼文件,極大概率會導致數據損壞。

請進入你的 Docker 項目目錄,停止容器。

# 进入你的项目目录,例如 /opt/stacks/wordpress
cd /opt/stacks/wordpress

# 停止容器
docker compose down

注意:如果你有多個項目,建議逐個停止,或者確保所有涉及數據庫寫入的容器都已停止運行。


第三步:使用 Rsync 同步數據

我們將使用 Linux 下最強大的同步工具 rsync。它比 scp 更快,且能保留文件的權限、軟鏈接和時間戳,這對於數據庫文件至關重要。

1. 確保雙方都安裝了 rsync

在兩台機器上都執行:

# Debian/Ubuntu
apt install -y rsync

# CentOS
yum install -y rsync

2. 執行同步命令

假設你的 Docker 項目都存放在 /opt/stacks 目錄下,我們要把這個目錄完整同步到新機器的相同位置。

在舊 VPS 上執行以下命令:

# 格式:rsync [选项] [源目录] [目标用户@目标IP:目标路径]
# 注意:/opt/stacks/ 最后的斜杠表示同步目录下的内容,不加斜杠表示同步目录本身

rsync -avzP /opt/stacks/ root@192.168.1.100:/opt/stacks/

參數詳解:

  • -a (Archive):歸檔模式,保留所有權限、用戶組、時間戳(數據遷移必備)。
  • -v (Verbose):顯示詳細過程。
  • -z (Compress):傳輸時壓縮,節省帶寬。
  • -P (Progress):顯示傳輸進度條,斷點續傳。

輸入新 VPS 的 root 密碼後,等待傳輸完成。


第四步:遷移 Docker 鏡像(可選)

如果你的鏡像都是公開的(如 nginx:latest),這一步可以跳過,因為在新機器啟動時會自動下載。

但如果你有自己構建的私有鏡像(沒有上傳到 Docker Hub),或者舊機器網速慢不想重新下載,可以將鏡像打包遷移。

1. 在舊 VPS 打包鏡像:

# 将镜像保存为 tar 文件
docker save -o my_custom_image.tar my_project:v1

2. 傳輸文件:

rsync -avzP my_custom_image.tar root@192.168.1.100:/root/

3. 在新 VPS 加載鏡像:

docker load -i /root/my_custom_image.tar

第五步:在新 VPS 上啟動服務

數據傳完了,現在去新家「通電」。

  1. SSH 登錄到新 VPS。
  2. 進入項目目錄。
cd /opt/stacks/wordpress

# 检查文件是否都在
ls -al
  1. 啟動服務。
docker compose up -d
  1. 檢查運行狀態。
# 查看容器状态
docker compose ps

# 查看日志,确保没有报错
docker compose logs -f

第六步:最後的收尾(DNS 解析)

如果你的服務綁定了域名(例如 blog.example.com),遷移完成後,千萬別忘了去你的域名服務商(Cloudflare, Namesilo 等)那裡:

  1. 修改 A 記錄:將 IP 地址修改為新 VPS 的 IP。
  2. 等待生效:通常幾分鐘內生效。

常見問題排查

Q: 啟動後提示 Permission denied? A: 這通常是因為 rsync 沒有加 -a 參數,導致文件所有者變了(比如數據庫文件需要特定用戶權限)。 解決方法:在項目目錄下查看原本數據庫容器要求的權限,或者直接暴力修復(不推薦生產環境):chmod -R 777 ./data

Q: 新機器的網絡不通? A: 檢查新 VPS 的防火牆(UFW/IPTables)是否放行了 Docker 映射的端口(如 80, 443, 8080)。

# 放行常用端口示例
ufw allow 80/tcp
ufw allow 443/tcp
ufw reload