把 Docker 容器從舊的伺服器遷移掉新的伺服器上
更多語言
更多操作
每逢「黑色星期五」或商家大促,很多人都會入手線路更好、配置更高的 VPS。但隨之而來的頭痛問題就是:如何把舊伺服器上跑得好好的 Docker 服務,原封不動地搬到新機器上?
如果只是重新 docker run 一遍,原本積累的資料庫、網站文章、配置信息都會丟失。
這篇教程將提供一套「生產環境級」的遷移方案,利用 rsync 工具,連同鏡像、配置文件和持久化數據(Database/Data)一起「進行遷移,確保新機器啟動後,和舊機器一模一樣。
遷移前的準備
- 舊 VPS (Source):擁有 root 權限,Docker 服務正在運行。
- 新 VPS (Target):擁有 root 權限,建議預先安裝好 Docker 和 Docker Compose。
- SSH 連接:確保舊 VPS 可以通過 SSH 連接到新 VPS。
核心思路:為什麼不推薦「導出鏡像」?
新手常見的誤區是使用 docker export 或 docker 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 上啟動服務
數據傳完了,現在去新的伺服器上把這些Docker啟動起來。
- SSH 登錄到新 VPS。
- 進入項目目錄。
cd /opt/stacks/wordpress # 检查文件是否都在 ls -al
- 啟動服務。
docker compose up -d
- 檢查運行狀態。
# 查看容器状态 docker compose ps # 查看日志,确保没有报错 docker compose logs -f
第六步:最後(DNS 解析)
如果你的服務綁定了域名(例如 blog.example.com),遷移完成後,別忘了去你的域名服務商(Cloudflare, Namesilo 等)那裡:
- 修改 A 記錄:將 IP 地址修改為新 VPS 的 IP。
- 等待生效:通常幾分鐘內生效。
常見問題排查
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