在近期的一次运维实践中,我完成了一个基于 Docker 的 Halo 博客跨云迁移:
原环境:阿里云
目标环境:火山引擎
操作系统:Rocky Linux
整个迁移过程远不止“拷贝数据”这么简单,而是涉及:
云厂商网络差异 + Docker 镜像生态 + 运维稳定性问题
过程中踩了不少典型坑(镜像拉取失败、Docker Hub 限流、换源失败等),最终整理出一套稳定可复用方案,记录如下。
一、迁移核心思路(重点)
在开始之前,先讲最关键的一点:
Halo Docker 部署的本质 = /opt 目录
该目录包含:
数据库数据
上传附件
配置文件
Docker Compose 配置
结论:
Halo 迁移 ≈ 直接迁移
/opt目录
二、源服务器(阿里云)数据备份
打包 Halo 数据
cd /
tar -zcvf opt_backup.tar.gz /opt
验证:
ls -lh /opt_backup.tar.gz
下载到本地
推荐两种方式:
✔️ 图形方式(推荐)
使用 Xshell + XFTP 直接拖拽下载
✔️ 命令行方式
yum install -y lrzsz
sz /opt_backup.tar.gz
三、新服务器环境搭建(Rocky Linux 8.10)
安装 Docker
curl -fsSL https://get.docker.com | bash
systemctl enable docker
systemctl start docker
验证:
docker -v
安装 Docker Compose(推荐固定版本)
curl -L https://github.com/docker/compose/releases/download/v2.29.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
验证:
docker-compose --version
安装 Nginx
dnf install -y nginx
systemctl enable nginx
systemctl start nginx
放行端口:
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
配置反向代理
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://127.0.0.1:8090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 100M;
}
}
生效:
nginx -t
systemctl reload nginx
四、数据恢复与服务启动
上传备份文件
rz
解压恢复
tar -zxvf opt_backup.tar.gz -C /
启动 Halo
cd /opt/halo
docker-compose up -d
五、关键问题排查(实战重点)
问题 1:Compose version 警告
version: "3"
直接删除
原因:
Docker Compose V2 已废弃该字段
问题 2:Docker 镜像拉取失败
错误示例:
net/http: request canceled
本质:网络访问不稳定
解决方案:配置国内镜像源
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
]
}
EOF
systemctl daemon-reexec
systemctl restart docker
问题 3:Docker Hub 限流
错误:
toomanyrequests
原因:
公网 IP 共享导致触发限流
解决方案
docker system prune -a -f
docker-compose up -d
问题 4:chsrc 换源失败
错误:
sed: unknown option to 's'
结论:
❌ 不建议使用 chsrc
✔️ 手动配置最稳定
六、验证迁移结果
docker ps
确保:
halo 容器运行
数据库容器运行
访问方式:
或绑定域名访问
七、迁移收尾工作
DNS 切换
将域名解析到新服务器 IP
数据完整性检查
重点检查:
文章
评论
图片附件
HTTPS 配置
推荐使用:
👉 Let's Encrypt
开机自启
systemctl enable docker
systemctl enable nginx
八、经验总结(核心价值)
本次迁移的本质问题,不是 Halo,而是:
云环境差异 + Docker 网络生态问题
关键结论
Docker 应用迁移 ≈ 数据目录迁移
国内云服务器必须配置镜像加速
Docker Hub 限流是常态问题
工具(如 chsrc)不一定可靠
跨云迁移一定要预留排错时间
九、写在最后
整个迁移耗时约 1~2 小时(不含数据传输),属于中等复杂度运维任务。
如果你也在做类似迁移,这篇文章可以帮你少踩 80% 的坑。