最近公司要从老服务器迁移到新云平台,最头疼的不是数据量大,而是那些跑着数据库的容器怎么平滑转移。试了几次,不是配置丢了就是连接不上,折腾得够呛。后来摸索出几招实用的容器迁移技巧,分享出来,希望能帮到同样在搬家中挣扎的朋友。
先打包镜像,别直接拷容器
很多人图省事,想直接把运行中的容器导出再导入。但这样容易出问题,尤其是数据库容器,状态和配置混在一起,到了新环境经常启动失败。正确的做法是基于原容器创建一个新镜像,把当前状态固化下来。
docker commit old-db-container db-image:v1
这样生成的镜像是干净的,不依赖旧主机环境。推送到镜像仓库后,在新机器上 pull 下来就能用。
数据卷一定要单独处理
数据库最怕丢数据。容器里的数据如果没挂载外部卷,一旦容器删了,数据就没了。迁移前先确认是否用了 -v 挂载:
docker run -d \
-v /data/mysql:/var/lib/mysql \
--name mysql-prod \
mysql:8.0
迁移时,/data/mysql 这个目录要完整复制过去。可以用 rsync 或 scp 同步,确保权限和时间戳一致。新机器上只要把目录放对位置,再启动容器,数据就自动接上了。
环境变量和配置文件别硬编码
有些人在启动容器时直接把密码写在命令里,比如 -e MYSQL_ROOT_PASSWORD=123456。这样不仅不安全,迁移时还容易漏改。建议把配置抽出来,用 .env 文件管理:
MYSQL_ROOT_PASSWORD=MyS3curePass
MYSQL_DATABASE=app_db
DB_HOST=192.168.1.100
然后启动时引用:
docker run --env-file .env mysql:8.0
换环境时,只要改 .env 文件,不用动命令,也不容易出错。
网络配置提前规划好
老系统里可能用了默认 bridge 网络,新环境如果用自定义网络,容器之间可能互相 ping 不通。迁移前先在新平台建好网络:
docker network create app-net
启动容器时指定网络:
docker run -d --network app-net --name db mysql:8.0
这样应用容器也能顺利连上数据库,避免“我明明启动了,怎么连不上”的尴尬。
测试恢复流程比迁移本身更重要
有一次我信心满满把生产库迁完,结果启动时报错说表空间损坏。后来才发现是文件同步时中断过一次,部分文件没传全。从那以后,我都会在测试机上先走一遍完整流程:拉镜像、挂数据、启容器、连客户端查数据。确认没问题才动生产环境。
特别是 MySQL 这类对文件一致性要求高的数据库,哪怕少了一个 ibd 文件都可能起不来。宁可多花半小时验证,也别图快踩坑。