之前的服务器机房线路不稳定,访问经常出问题,还是换回了老机房DC2,那么又得折腾一次Docker的迁移过程,刚好记录下。假设两台美国VPS,需要进行Docker的迁移,旧主机A的IP:192.168.110.200,新主机B的IP:192.168.110.220 且都是公网IP,这次为了以后迁移方便,我安装了BT面板,这样以后如果在遇到迁移可以完全保留数据。
迁移方案概述
使用Docker镜像导出导入 + 数据卷备份的方式进行完整迁移。
详细迁移步骤
第一阶段:在旧主机A上准备迁移
1. 停止所有Docker容器
# 停止所有运行中的容器
docker stop $(docker ps -aq)
# 检查容器状态
docker ps -a
2. 备份Docker数据卷
# 查看所有数据卷
docker volume ls
# 备份每个数据卷(以mysql数据卷为例)
docker run --rm -v mysql_data:/volume -v /root/backup:/backup alpine
tar -czf /backup/mysql_data_backup.tar.gz -C /volume ./
# 如果有多个数据卷,重复上述操作
docker run --rm -v app_data:/volume -v /root/backup:/backup alpine
tar -czf /backup/app_data_backup.tar.gz -C /volume ./
3. 导出Docker镜像
# 查看所有镜像
docker images
# 导出所有镜像到文件
docker save $(docker images -q) -o /root/backup/all_docker_images.tar
# 或者单独导出重要镜像
docker save nginx:latest -o /root/backup/nginx.tar
docker save mysql:8.0 -o /root/backup/mysql.tar
4. 导出容器配置
# 导出容器配置(用于重新创建容器)
docker ps -a --format "table {{.Names}} {{.Image}} {{.Ports}} {{.Command}}" > /root/backup/container_info.txt
# 查看并记录容器的详细配置
docker inspect $(docker ps -aq) > /root/backup/container_inspect.json
5. 备份Docker Compose文件(如果有)
# 查找所有docker-compose文件
find / -name "docker-compose*.yml" 2>/dev/null
find / -name "*.yml" -o -name "*.yaml" | grep -E "(docker|compose)" 2>/dev/null
# 备份到指定目录
cp /path/to/docker-compose.yml /root/backup/
第二阶段:数据传输到新主机B
1. 使用rsync同步备份文件(推荐)
# 在主机B上执行,从A拉取数据
rsync -avz -e "ssh -p 22" root@192.168.110.200:/root/backup/ /root/backup/
# 或者使用scp
scp -r root@192.168.110.200:/root/backup/* /root/backup/
2. 通过宝塔面板传输(备选方案)
登录主机A的宝塔面板(192.168.110.200:8888)文件管理 → 压缩 /root/backup 目录下载备份文件到本地登录主机B的宝塔面板(192.168.110.220:8888)上传备份文件到 /root/backup 目录并解压
第三阶段:在新主机B上恢复
1. 安装Docker环境
# 如果新主机还没有安装Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
# 启动Docker服务
systemctl start docker
systemctl enable docker
2. 导入Docker镜像
# 进入备份目录
cd /root/backup
# 导入所有镜像
docker load -i all_docker_images.tar
# 或者单独导入镜像
docker load -i nginx.tar
docker load -i mysql.tar
# 验证镜像导入
docker images
3. 恢复数据卷
# 创建数据卷
docker volume create mysql_data
docker volume create app_data
# 恢复数据到卷中
docker run --rm -v mysql_data:/volume -v /root/backup:/backup alpine
sh -c "rm -rf /volume/* && tar -xzf /backup/mysql_data_backup.tar.gz -C /volume"
docker run --rm -v app_data:/volume -v /root/backup:/backup alpine
sh -c "rm -rf /volume/* && tar -xzf /backup/app_data_backup.tar.gz -C /volume"
4. 重新创建并启动容器
# 根据之前记录的配置重新创建容器
# 示例:重新创建MySQL容器
docker run -d
--name mysql
-v mysql_data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=your_password
-p 3306:3306
mysql:8.0
# 示例:重新创建Nginx容器
docker run -d
--name nginx
-v app_data:/usr/share/nginx/html
-p 80:80
-p 443:443
nginx:latest
# 或者使用docker-compose(如果有备份的yml文件)
cd /root/backup
docker-compose up -d
第四阶段:验证和测试
1. 检查容器状态
# 查看所有容器状态
docker ps -a
# 检查容器日志
docker logs [container_name]
2. 测试服务连通性
# 测试端口连通性
curl http://192.168.110.220:80
telnet 192.168.110.220 3306
# 在容器内测试服务
docker exec -it mysql mysql -u root -p
3. 数据完整性验证
# 检查数据卷内容
docker run --rm -v mysql_data:/volume alpine ls -la /volume/
# 对比重要文件
docker exec mysql find /var/lib/mysql -name "*.ibd" | head -5
第五阶段:切换和清理
1. 域名解析切换(如果有域名)
# 将域名解析从192.168.110.200切换到192.168.110.220
# 在DNS管理平台修改A记录
2. 清理工作
# 在新主机B上清理备份文件
rm -rf /root/backup
# 在旧主机A上确认迁移成功后清理
# (可选)保持旧主机运行一段时间作为备份
注意事项
迁移时机:选择业务低峰期进行迁移数据一致性:在迁移前确保没有正在写入的数据网络带宽:考虑备份文件大小和网络传输时间回滚计划:如果迁移失败,要有快速回滚方案防火墙设置:确保新主机的防火墙规则允许相应端口访问
宝塔面板相关配置
如果使用了宝塔面板管理Docker,还需要:
在新主机B的宝塔面板中安装Docker管理器重新配置宝塔的网站和反向代理(如果有)检查并更新宝塔的安全组/防火墙规则
这个方案可以确保您的Docker环境完整迁移,包括镜像、数据和配置。如果有兴趣的小伙伴可以评论区留言大家一起交流学习~
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END















暂无评论内容