1. 问题现象描述
最近在维护生产环境Docker服务时遇到一个奇怪现象:服务器重启后,虽然docker服务状态显示为active (running),但执行docker ps -a命令却返回空列表,所有容器都不见了。更诡异的是,这些容器对应的数据卷和网络配置却依然存在。作为运维人员,这种情况让我瞬间血压升高——明明服务正常运行,为什么容器集体消失了?
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题根因分析
2.1 Docker运行时目录被篡改
经过排查发现,根本原因是Docker的运行时目录(/var/lib/docker)被挂载到了临时文件系统tmpfs上。当系统重启时,tmpfs分区会被清空,导致所有容器元数据丢失。但为什么数据卷还在呢?因为数据卷默认存储在/var/lib/docker/volumes目录,而这个目录通常不在tmpfs上。
2.2 典型错误配置场景
这种情况常发生在以下两种配置错误时:
- 误将/var/lib/docker挂载为tmpfs(常见于误操作或自动化脚本错误)
- 系统默认将/run或/var/run挂载为tmpfs,而docker.sock等运行时文件存放在这些路径
3. 完整解决方案
3.1 紧急恢复方案
如果容器刚刚消失且服务器还未再次重启,可以尝试从内存恢复:
bash复制# 查找仍在运行的容器进程
ps aux | grep -E 'docker-containerd-shim|containerd'
# 通过containerd直接恢复容器
ctr -n moby task ls
3.2 永久修复步骤
- 检查当前挂载点配置:
bash复制mount | grep docker
-
修改/etc/fstab文件,移除对/var/lib/docker的tmpfs挂载(如果有)
-
重启docker服务:
bash复制systemctl restart docker
- 验证存储驱动配置:
bash复制docker info | grep "Storage Driver"
3.3 数据恢复方案
如果容器已经无法恢复,但需要找回数据:
- 查找原容器的数据卷:
bash复制ls -l /var/l
