Docker 应用&数据备份、迁移方案

一、为什么要做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 挪到更大的硬盘,步骤如下:

  1. 先停掉 Docker 服务:systemctl stop docker
  1. 复制整个目录到新位置:rsync -av /var/lib/docker/new/path
  1. 修改配置文件 /etc/docker/daemon.json,添加 "graph": "/new/path/docker"
  1. 重启服务: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 应用,需要从阿里云迁移到腾讯云:

  1. 先在目标服务器搭建相同版本的 Docker 环境
  1. 用 rsync 同步数据卷(主要是 MySQL 数据)
  1. 用 docker-compose 打包整个应用配置
  1. 先迁移 Redis 缓存,再停服迁移 MySQL(业务中断仅 15 分钟)
  1. 最后用 Nginx 做 30 分钟的流量切换缓冲

四、注意事项

  1. 每次迁移前一定要做全量备份
  1. 定期恢复测试,见过太多人备份了半年,真出事才发现文件损坏
  1. 生产环境建议用 Docker Swarm 或 K8s 的自动迁移功能
相关推荐
Java陈序员4 小时前
轻量强大!一款现代化的 Kubernetes 集群管理与监控工具!
云原生·容器·kubernetes
爱吃橘子橙子柚子1 天前
3CPU性能排查总结(超详细)【Linux性能优化】
运维·cpu
Sheffield2 天前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
Sheffield2 天前
Alpine是什么,为什么是Docker首选?
linux·docker·容器
马艳泽2 天前
win10下运行Start Broker and Proxy报错解决
docker
舒一笑3 天前
程序员效率神器:一文掌握 tmux(服务器开发必备工具)
运维·后端·程序员
NineData3 天前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库
用户13573999256603 天前
Windows 从 0 搭建 WSL2 原生 AI 开发环境:Codex + Docker + VSCode
docker
vi_h3 天前
在 macOS 上通过 Docker 安装并运行 Ollama(详细可执行教程)
macos·docker·ollama
黑心老魔3 天前
通过 Docker 创建开发环境
docker·开发环境