版本升级时存储驱动报错需安全迁移:先查journalctl日志和docker info确认原驱动,按overlay2→overlay2、devicemapper→overlay2等类型选择对应迁移路径,强制指定driver并rsync关键数据,保留旧目录48小时以备回退。

版本升级时出现存储驱动报错(比如 failed to start daemon: driver "overlay2" failed to load 或提示 graphdriver failed),通常是因为新旧 Docker 版本对存储驱动的兼容性变化,或底层文件系统元数据格式不匹配。此时不能直接覆盖启动,必须在保留原有容器、镜像、卷的前提下完成安全迁移。
确认报错根源与当前驱动状态
先不要强行重启 docker,而是检查报错日志和当前配置:
- 查看完整错误:运行
journalctl -u docker.service -n 100 --no-pager,重点找graphdriver、overlay2、devicemapper或zfs相关关键词 - 确认原版本使用的驱动:执行
docker info | grep "Storage Driver"(若还能启动);若已无法启动,查旧版配置:cat /var/lib/docker/overlay2/lower-id 2>/dev/null || echo "可能不是 overlay2" - 核对新版 Docker 的默认驱动支持:Docker 24+ 默认仍用
overlay2,但要求内核 ≥ 4.0 且overlay模块已加载(lsmod | grep overlay)
按驱动类型选择迁移路径
不同存储驱动升级策略差异较大,不能一概而论:
-
overlay2 → overlay2(最常见):多数升级属于此情况。只要内核支持、文件系统为 ext4/xfs、且
/var/lib/docker/overlay2下子目录结构完整,通常只需修复权限:sudo chown -R root:root /var/lib/docker && sudo chmod -R 700 /var/lib/docker -
devicemapper → overlay2(弃用驱动):Docker 20.10+ 已标记
devicemapper为 deprecated。必须迁移数据:先用旧版 Docker 启动(如临时降级),导出所有镜像docker save -o images.tar $(docker images -q),导出容器配置docker inspect > containers.json,再在新版中docker load -i images.tar并重建容器 -
zfs/btrfs → overlay2:这些驱动依赖特定文件系统特性。升级前需停机卸载 zpool 或 btrfs subvolume,将数据卷内容手动复制到新位置,再通过
docker volume create+rsync迁移卷数据,不可直接复用原目录
强制指定驱动并迁移数据目录
若确认原驱动不再被新版支持,或想统一改用 overlay2,推荐组合操作:
- 停止 docker:
sudo systemctl stop docker - 创建新数据目录(如
/data/docker),并确保权限正确:sudo mkdir -p /data/docker && sudo chown root:root /data/docker && sudo chmod 700 /data/docker - 在
/etc/docker/daemon.json中明确指定驱动和路径:{ "data-root": "/data/docker", "storage-driver": "overlay2", "storage-opts": ["overlay2.override_kernel_check=true"] }
(override_kernel_check仅在测试环境或确认内核满足条件时启用) - 用
rsync迁移关键数据(非全量复制):
— 镜像层:同步/var/lib/docker/image/overlay2和/var/lib/docker/overlay2(若原为 overlay2)
— 卷数据:单独同步/var/lib/docker/volumes/(卷内容独立于驱动,可直接复用)
— 网络与容器元数据:/var/lib/docker/network/和/var/lib/docker/containers/可选同步,但新版会重建部分结构,建议优先重建容器
验证与回退准备
启动后立即验证,同时保留旧目录至少 48 小时:
- 启动 docker:
sudo systemctl start docker,观察journalctl -u docker是否仍有驱动报错 - 运行
docker info | grep -E "(Storage Driver|Docker Root Dir)"确认驱动和路径生效 - 检查镜像、容器是否列出:
docker images -a、docker ps -a;若容器未自动恢复,用docker commit+docker run重建(基于旧容器 ID 提取配置) - 回退方案:若失败,立刻停服务,删掉新目录,还原
/var/lib/docker备份,并用旧版 docker binary 启动(如/usr/bin/dockerd-20.10.24)











