Docker容器迁移,网站快速搬家到新服务器
网站跑在Docker里,换服务器时不必重装环境,只要把镜像和数据卷完整搬过去就能继续运行。
本文按零基础可照做的顺序,讲清从旧机导出、传输、到新机恢复启动的完整流程,并给出验证和排错方法。
迁移前先确认这两类数据
Docker容器本身是无状态的,真正要搬的是镜像和挂载数据。
- 镜像:用
docker images查看,例如nginx:latest、mysql:8。 - 数据卷:用
docker volume ls查看,或看docker inspect 容器名里的Mounts字段。网站代码、数据库文件、上传目录通常都在这里。 - 额外检查:
docker-compose.yml、.env、Nginx 配置等编排文件也要一起复制。
如果网站用的是绑定挂载(如 -v /www/html:/usr/share/nginx/html),直接打包宿主机目录即可;
如果是命名卷,则用下面的卷打包方式。
在旧服务器导出镜像与数据
先停止写入,避免数据不一致:
docker stop 容器名
导出镜像为 tar 文件:
docker save -o website-images.tar nginx:latest mysql:8
如果有多个镜像,把名字依次写在后面。
数据卷用临时容器打包:
docker run --rm -v 卷名:/data -v $(pwd):/backup alpine tar czf /backup/volume-data.tar.gz -C /data .
绑定挂载的目录直接压缩:
tar czf /root/html-backup.tar.gz -C /www/html .
把镜像包、卷包和编排文件一起传到新服务器:
scp website-images.tar volume-data.tar.gz root@新服务器IP:/root/
传输大文件时建议用 rsync -avP,断线可续传。
新服务器导入并启动容器
先确认新机已安装 Docker:
docker version
没有输出就按官方文档安装。
然后导入镜像:
docker load -i /root/website-images.tar
用 docker images 确认镜像已存在。
恢复数据卷:
docker volume create 卷名
docker run --rm -v 卷名:/data -v /root:/backup alpine tar xzf /backup/volume-data.tar.gz -C /data
绑定挂载则解压到对应目录:
mkdir -p /www/html
tar xzf /root/html-backup.tar.gz -C /www/html
最后用原来的启动命令或 docker compose up -d 拉起容器。
如果之前用 docker run,可先用 docker inspect 在旧机查看完整参数,再在新机复现。
迁移后必须做的四项验证
- 容器状态:
docker ps应显示Up,没有反复重启。 - 端口监听:
ss -tlnp | grep 80确认端口已监听。 - 页面访问:浏览器打开域名,检查首页、登录页和上传功能。
- 日志排查:
docker logs -f 容器名看是否有数据库连接失败或权限报错。
数据库容器尤其要确认数据目录权限,常见报错是 Permission denied,需要把卷目录属主改为容器内用户。
容易踩坑的几个细节
端口冲突:新服务器若已运行 Nginx 或 Apache,80 端口会被占用,启动前先 systemctl stop nginx 或改映射端口。
网络模式:旧机用了自定义 bridge 网络,新机也要先 docker network create 再启动,否则容器间无法按名字通信。
环境变量:数据库密码、密钥等常写在 .env 或启动参数里,漏掉会导致连不上。
架构差异:如果新旧服务器 CPU 架构不同(如 x86 迁到 ARM),docker load 后可能无法运行,需要在新机重新拉取对应架构镜像。
常见疑问
迁移后网站能打开,但数据库连不上怎么办?
先看 docker logs 里数据库容器是否正常启动,再检查连接地址是否用了容器名而非 localhost。
必须停容器才能迁移吗?
数据库建议停写后导出,静态网站可以在低峰期直接打包,但为一致性仍推荐短暂停机。
镜像包太大传得慢怎么办?
可以在新服务器直接 docker pull 相同镜像,只传数据卷和编排文件,能省不少时间。
Docker容器迁移的核心就是镜像加数据卷两件事,按导出、传输、导入、验证的顺序执行,大多数网站都能在半小时内完成搬家。
遇到启动失败时,优先看 docker logs 和端口占用,再检查卷权限和网络配置。