打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

把 Docker 容器从旧的服务器迁移掉新的服务器上

来自md5.pw
James留言 | 贡献2026年2月15日 (日) 22:49的版本 (把 Docker 容器从旧的服务器迁移掉新的服务器上)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

每逢“黑色星期五”或商家大促,很多人都会入手线路更好、配置更高的 VPS。但随之而来的头痛问题就是:如何把旧服务器上跑得好好的 Docker 服务,原封不动地搬到新机器上?

如果只是重新 docker run 一遍,原本积累的数据库、网站文章、配置信息都会丢失。

这篇教程将提供一套“生产环境级”的迁移方案,利用 rsync 工具,连同镜像、配置文件和持久化数据(Database/Data)一起“搬家”,确保新机器启动后,和旧机器一模一样。

迁移前的准备

  • 旧 VPS (Source):拥有 root 权限,Docker 服务正在运行。
  • 新 VPS (Target):拥有 root 权限,建议预先安装好 Docker 和 Docker Compose。
  • SSH 连接:确保旧 VPS 可以通过 SSH 连接到新 VPS。

核心思路:为什么不推荐“导出镜像”?

新手常见的误区是使用 docker exportdocker 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 上启动服务

数据传完了,现在去新家“通电”。

  1. SSH 登录到新 VPS。
  2. 进入项目目录。
cd /opt/stacks/wordpress

# 检查文件是否都在
ls -al
  1. 启动服务。
docker compose up -d
  1. 检查运行状态。
# 查看容器状态
docker compose ps

# 查看日志,确保没有报错
docker compose logs -f

第六步:最后的收尾(DNS 解析)

如果你的服务绑定了域名(例如 blog.example.com),迁移完成后,千万别忘了去你的域名服务商(Cloudflare, Namesilo 等)那里:

  1. 修改 A 记录:将 IP 地址修改为新 VPS 的 IP。
  2. 等待生效:通常几分钟内生效。

常见问题排查

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