数码在线
白蓝主题五 · 清爽阅读
首页  > 网络排错

网络容器迁移方案实战分享

迁移前的准备别偷懒

公司最近要换服务器,原来的那台老旧的物理机撑不住了。最头疼的是跑在上面的十几个容器服务,从数据库到前端网关全在里面,一个弄不好整个业务就得停摆。

很多人觉得容器天生轻量,搬起来容易。但真动手才发现,镜像版本、网络配置、存储挂载、环境变量这些细节一出问题,服务就起不来。所以迁移前先列个清单:当前容器列表、依赖关系、端口映射、数据卷路径,一样都不能少。

镜像同步是第一步

本地构建的镜像得推到私有仓库或者新主机上直接导出导入。用 docker save 和 load 最稳妥:

docker save -o app.tar myapp:latest

然后把 tar 包拷到新机器:

docker load -i app.tar

这招适合没有私仓的小团队,虽然慢点,但稳当。

网络模式别乱动

原来用 bridge 模式的容器,迁过去之后默认网络可能不一样。特别是多个容器之间靠自定义 bridge 通信的,得提前在新主机上创建同名网络:

docker network create mynet

不然启动后互相 ping 不通,查半天才发现是网络隔离了。还有那些用了 host 网络模式的服务,记得新宿主得开放对应端口,防火墙也得调。

数据卷迁移要小心

数据库容器最怕丢数据。用 bind mount 的还好办,直接 rsync 同步目录就行:

rsync -avz /var/lib/mysql/ user@newhost:/var/lib/mysql/

要是用的是 named volume,就得进容器里打包导出,或者用工具如 docker-volume-rsync,不然数据根本带不过去。

批量启动用脚本省事

一个个手动 run 容器太累,写个 shell 脚本或者用 docker-compose.yml 统一管理更靠谱。比如把所有服务写进 compose 文件:

version: '3'\nservices:\n  web:\n    image: myweb:latest\n    ports:\n      - \"80:80\"\n    networks:\n      - mynet\n  db:\n    image: mysql:5.7\n    environment:\n      MYSQL_ROOT_PASSWORD: example\n    volumes:\n      - dbdata:/var/lib/mysql\n    networks:\n      - mynet\nnetworks:\n  mynet:\n    driver: bridge\nvolumes:\n  dbdata:

到了新机器一键 up 就行:

docker-compose up -d

中间如果报错,看日志定位问题比盲人摸象强多了。

别忘了验证和监控

服务起来了不代表没问题。登录后台看看接口能不能调通,数据库有没有连上,日志里有没有报错。最好有个简单的健康检查页面,或者用 curl 批量探测关键路径:

curl -f http://localhost/api/health

确认无误后再切流量,别急着收工。

上次我就图快,刚启动完就改 DNS,结果缓存服务没连上 Redis,用户登录全失败,半夜被叫起来回滚。教训啊。