一、為什么要做Docker數據備份
1、保障數據與配置的安全性
防止數據丟失:Docker 容器本身是 “臨時性” 的(基于鏡像創建,刪除后數據默認丟失),但容器中運行的應用(如數據庫、日志服務)會產生持久化數據。若容器意外崩潰、誤刪除或主機故障,未備份的數據可能永久丟失。 例如:MySQL 容器突然宕機,且未對掛載的
/var/lib/mysql
數據卷備份,將導致數據庫數據全部丟失。保留配置狀態:容器的啟動參數(如環境變量、端口映射)、網絡配置、鏡像版本等信息,是應用正常運行的基礎。備份這些配置可避免因誤操作或環境變更導致的配置錯亂。
2、支持環境遷移與擴展
跨主機 / 跨平臺遷移:當需要將應用從開發環境遷移到生產環境、從物理機遷移到云服務器,或從 Linux 遷移到 Windows(Docker 支持跨平臺)時,通過備份的鏡像、容器配置和數據卷,可以快速在新環境中復現相同的運行狀態,避免重復部署的繁瑣和配置不一致問題。 例如:將本地測試好的 Python 應用容器備份后,遷移到云服務器的 Docker 環境,無需重新安裝依賴和調試參數。
集群與多實例擴展:在分布式架構中,通過備份的鏡像和數據,可以快速復制出多個相同的容器實例,實現負載均衡或高可用部署。備份確保了所有實例的初始狀態一致。
3、容災要求
快速恢復業務:當主機遭遇硬件故障、病毒攻擊、自然災害等災難時,基于備份的鏡像和數據,可以在備用主機上迅速重建 Docker 環境和應用,減少業務中斷時間(RTO,恢復時間目標)。 例如:服務器硬盤損壞后,通過備份的 Docker 鏡像和數據卷,可在新服務器上 10 分鐘內恢復應用運行,而重新部署可能需要數小時。
版本回滾能力:若應用升級后出現 bug 或兼容性問題,可通過備份的歷史鏡像和數據,回滾到之前的穩定版本,降低故障影響。
二、 Docker遷移方案
(1)同一服務器遷移
如果你只是想把 Docker 目錄從默認的 /var/lib/docker 挪到更大的硬盤,步驟如下:
先停掉 Docker 服務:systemctl stop docker
復制整個目錄到新位置:rsync -av /var/lib/docker/new/path
修改配置文件 /etc/docker/daemon.json,添加 "graph": "/new/path/docker"
重啟服務:systemctl start docker
關鍵提醒:遷移后一定要用 docker info 檢查根目錄是否已更新,避免白忙活。
(2)跨服務器遷移
當需要把容器搬到另一臺服務器時,推薦 “鏡像 + 數據卷” 組合方案:
先把容器 Commit 成鏡像:docker commit 容器名 鏡像名:版本
保存鏡像為 tar 包:docker save -o 文件名.tar 鏡像名
用 scp 傳到目標服務器:scp 文件名.tar 用戶名 @IP:/ 目錄
在新服務器加載鏡像:docker load -i 文件名.tar
如果涉及數據卷,記得用 docker volume ls 找到卷名,然后打包卷目錄(默認在 /var/lib/docker/volumes/ 卷名 /_data)。
(3)遷移過程可能的坑
遷移后容器啟動失敗?檢查新服務器的內核版本和 Docker 版本是否兼容
網絡不通?跨主機遷移要重新配置 overlay 網絡或用 portainer 可視化管理
權限報錯?別忘了用 chown -R 重新授權數據目錄
二、備份方案
(1)手動備份
適合個人開發者的 3 條核心命令:
備份鏡像:docker save 鏡像名 | gzip > 備份文件名.tar.gz
備份容器:docker export 容器 ID > 容器快照.tar
備份數據卷:tar -zcvf 卷備份.tar.gz/var/lib/docker/volumes/ 卷名
備注:
把這些命令寫成 shell 腳本,用 crontab 設置定時任務,比如每天凌晨 3 點自動備份。
(2)工具推薦
Docker Volume Backup:專門備份數據卷的輕量工具,支持定時備份到本地或 S3
restic:開源備份工具,支持增量備份和加密,適合多服務器管理
Portainer:圖形化面板里的 “備份 / 恢復” 功能,鼠標點幾下就搞定,新手首選
以 Portainer 為例,在 “Stacks” 頁面點擊備份按鈕,就能把整個應用棧(包括配置和數據)打包,恢復時上傳文件即可,比手動操作快 10 倍。
(3)備份策略
記住 “321 原則”:
至少保留 3 份備份
存放在 2 種不同介質
1 份備份要離線存儲(比如冷備份硬盤)
三、實戰案例:電商平臺遷移全過程
某服裝電商用 Docker 部署了 MySQL、Redis 和 Node.js 應用,需要從阿里云遷移到騰訊云:
先在目標服務器搭建相同版本的 Docker 環境
用 rsync 同步數據卷(主要是 MySQL 數據)
用 docker-compose 打包整個應用配置
先遷移 Redis 緩存,再停服遷移 MySQL(業務中斷僅 15 分鐘)
最后用 Nginx 做 30 分鐘的流量切換緩沖
四、注意事項
每次遷移前一定要做全量備份
定期恢復測試,見過太多人備份了半年,真出事才發現文件損壞
生產環境建議用 Docker Swarm 或 K8s 的自動遷移功能