迁移对象分三类:镜像为只读模板,容器为运行实例,卷为持久化数据载体;核心是同步卷内容而非容器本身,需停用→打包→传输→恢复,并确保镜像、挂载参数、时区与权限一致。

明确迁移对象:镜像、容器、卷,三者不可混为一谈
迁移前先厘清你要搬什么:Docker 镜像是静态模板,容器是运行时实例,而数据卷(Volume)才是持久化数据的载体。很多问题源于误把“容器”当“数据”——删掉容器不等于删掉卷,但若没显式挂载卷,容器内所有数据(如 /var/lib/mysql)会随容器销毁而丢失。因此,同步的核心是卷内容,不是容器本身。
数据卷迁移:停用 → 打包 → 传输 → 恢复
这是最稳妥、兼容性最强的方式,适用于绝大多数场景:
-
停止使用该卷的容器:避免迁移中写入导致数据不一致,命令为
docker stop $(docker ps -q --filter volume=your_volume_name) -
确认卷位置:执行
docker volume inspect your_volume_name,查看Mountpoint路径(如/var/lib/docker/volumes/your_volume_name/_data) -
打包数据:在源主机上进入该路径,用 tar 压缩全部内容,例如:
cd /var/lib/docker/volumes/your_volume_name/_data && tar -cf ../your_volume_data.tar . -
传到新主机并解压:用 scp 传输后,在目标主机创建同名卷,再将数据解压到其
_data目录下
镜像与配置同步:确保环境一致才能跑起来
仅有数据还不够,容器必须基于相同镜像、用相同参数启动:
- 若原容器基于自定义镜像,用
docker save -o image.tar image:tag导出;若只有运行中的容器,先docker commit生成镜像再导出 - 在目标主机执行
docker load -i image.tar加载镜像 - 重建容器时,必须复用原挂载参数,例如:
docker run -v your_volume_name:/app/data -p 8080:80 your_image:latest
注意卷名要一致,路径映射不能写错
时区与权限:两个容易被忽略但致命的细节
迁移后容器能启动≠能正常工作。常见隐性故障点:
-
时区不同步:日志时间错乱、定时任务执行异常。解决方法二选一:
– 启动时加-e TZ=Asia/Shanghai
– 或挂载宿主机时区文件:-v /etc/localtime:/etc/localtime:ro -
文件权限不匹配:尤其在 CentOS/RHEL 上,SELinux 可能拒绝容器访问挂载目录。临时方案加
--privileged=true;长期建议用chcon -Rt svirt_sandbox_file_t /path/on/host调整上下文,或关闭 SELinux 的相关限制


















