一、为什么要做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 的自动迁移功能