Docker从btrfs存储驱动迁移至overlay2的问题咨询(迁移后容器丢失)
Docker从btrfs存储驱动迁移至overlay2的问题咨询(迁移后容器丢失)
兄弟,你遇到的问题其实很典型——不同Docker存储驱动的底层存储结构完全不一样,直接复制旧的/var/lib/docker目录肯定行不通,这也是为啥你迁移后看不到容器的原因。btrfs依赖自身的快照和子卷机制管理镜像与容器数据,而overlay2是基于分层文件系统的逻辑,两者的元数据、数据存储格式完全不兼容,Docker根本识别不了旧目录里的btrfs格式数据。
下面是能帮你完整迁移到overlay2,且保留原有容器自动启动能力的正确步骤:
第一步:备份现有容器与镜像
因为存储驱动无法直接兼容迁移,我们得先把当前的镜像和容器数据完整备份出来:- 先停止所有运行中的容器:
docker stop $(docker ps -aq) - 备份所有镜像:把所有镜像打包成tar文件,方便后续导入
docker save -o docker_images_backup.tar $(docker images -q) - 备份容器(可选但推荐):如果容器里有自定义数据,你可以把容器导出为镜像,或者直接导出容器文件系统
- 把容器转为镜像(保留容器状态):
docker commit <容器ID/名称> <自定义镜像名>,之后跟着上面的镜像备份步骤一起打包 - 直接导出容器文件系统:
docker export <容器ID/名称> -o <容器名称>.tar
- 把容器转为镜像(保留容器状态):
- 先停止所有运行中的容器:
第二步:清理旧Docker数据并切换存储驱动
- 停止Docker服务:
systemctl stop docker(如果用的是service命令就是service docker stop) - 彻底备份旧的Docker数据目录(留作后手):
mv /var/lib/docker /var/lib/docker.btrfs.bak - 配置overlay2存储驱动:编辑
/etc/docker/daemon.json,确保内容包含(如果文件不存在就新建):{ "storage-driver": "overlay2" } - 启动Docker服务:
systemctl start docker,然后用docker info检查输出,确认Storage Driver显示为overlay2,说明切换成功。
- 停止Docker服务:
第三步:恢复镜像与重建容器
- 导入之前备份的镜像:
docker load -i docker_images_backup.tar - 重建容器:这一步是关键,因为原来的容器元数据和btrfs绑定,无法直接恢复,需要基于导入的镜像重新创建容器。
- 如果你之前用
docker commit把容器转成了镜像,直接用该镜像创建容器即可,记得加上自动启动参数:docker run -d --restart=always --name <原容器名称> <自定义镜像名> - 如果是用
docker export导出的容器文件系统,需要先导入为镜像再创建:docker import <容器名称>.tar <临时镜像名> docker run -d --restart=always --name <原容器名称> <临时镜像名>
- 如果你之前用
- 验证容器状态:用
docker ps查看容器是否正常运行,docker inspect <容器名>检查自动启动配置是否生效。
- 导入之前备份的镜像:
额外注意事项
- 确保你的系统内核版本支持overlay2:一般要求Linux内核3.18及以上,部分发行版可能需要额外配置(比如Ubuntu 16.04+默认支持)
- 如果容器挂载了外部数据卷,记得把数据卷的内容也备份好,重建容器时重新挂载对应的目录
- 迁移完成后,确认所有容器运行正常,再考虑删除旧的
/var/lib/docker.btrfs.bak目录,避免占用磁盘空间
备注:内容来源于stack exchange,提问作者Tomasz Chmielewski
相关产品推荐
相关产品推荐

