把 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 上启动服务
数据传完了,现在去新家“通电”。
- 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