Docker丢失容器但/var/lib/docker数据存在,如何让其正确读取?
Docker容器“丢失”但数据目录完整的解决方案
问题描述
Docker容器突然全部无法被docker container ls检测到,输出为空列表,但/var/lib/docker/containers及上级目录的容器数据完整保留,此前运行正常,仅一夜之间出现该问题。
环境信息
- 操作系统: Kali GNU/Linux Rolling
- 内核版本: 5.19.0-kali2-amd64
- Docker客户端版本: 19.03.15
- Docker守护进程版本: 20.10.19+dfsg1
已尝试操作
- 重启Docker守护进程,无效果
- 备份并恢复
/var/lib/docker目录,无效 - 在
/etc/docker/daemon.json中显式设置data-root为/var/lib/docker并重启守护进程,未解决问题 - 重新安装
docker-ce,无变化 - 重启系统,问题依旧
排查与解决步骤
1. 修复客户端与守护进程版本不兼容问题
你的Docker客户端(19.03.15)和守护进程(20.10.19)跨了多个大版本,存在兼容性冲突,这可能是容器元数据无法被正常读取的核心原因。统一版本步骤:
# 卸载现有Docker组件 sudo apt-get purge docker-ce docker-ce-cli containerd.io # 安装与守护进程匹配的20.10.x版本 sudo apt-get install docker-ce=5:20.10.19~3-0~kali-gnu docker-ce-cli=5:20.10.19~3-0~kali-gnu containerd.io # 重启Docker服务 sudo systemctl restart docker
2. 确认存储驱动一致性
检查Docker守护进程使用的存储驱动,与/var/lib/docker下的实际存储目录是否匹配:
# 查看当前存储驱动 docker info | grep "Storage Driver" # 检查/var/lib/docker下的存储驱动目录 ls -la /var/lib/docker/
如果输出的存储驱动(如overlay2)不存在于/var/lib/docker目录中,需在/etc/docker/daemon.json中指定正确的存储驱动:
{ "storage-driver": "overlay2" }
修改后重启Docker:
sudo systemctl restart docker
3. 手动恢复容器元数据
若上述步骤无效,可尝试手动导入容器元数据:
- 停止Docker服务:
sudo systemctl stop docker
- 遍历
/var/lib/docker/containers下的容器ID目录,提取每个容器的config.v2.json中的镜像ID:
# 示例:提取某容器的镜像ID cat /var/lib/docker/containers/[容器ID]/config.v2.json | grep -o '"Image":"sha256:[a-f0-9]*"' | cut -d '"' -f4
- 使用提取的镜像ID和原容器配置重新创建容器,同时挂载原数据卷(需从
hostconfig.json中提取挂载路径信息):
docker run -d --name [原容器名] -v [原宿主机路径]:[容器内挂载路径] [镜像ID]
4. 修复目录权限问题
检查/var/lib/docker目录的权限,确保为root:root且权限位为700:
sudo chown -R root:root /var/lib/docker sudo chmod -R 700 /var/lib/docker
修复后重启Docker服务。
内容的提问来源于stack exchange,提问作者user12512444
相关产品推荐
相关产品推荐

