Docker 容器文件损坏导致 Harbor 启动失败:一次完整的排障复盘
Docker 容器文件损坏导致 Harbor 启动失败:一次完整的排障复盘
一、故障背景
安全检查后调整了 Docker 配置并重启 Docker 服务,随后出现连锁故障:
systemctl restart docker启动失败,反复重启退出- Harbor 部分容器处于异常状态,无法对外提供服务
环境信息:Docker 20.10.8,Harbor 通过 docker-compose 部署,数据目录已挂载到宿主机。
二、核心报错
Docker 启动日志中关键信息如下:
level=warning msg="could not change group /var/run/docker.sock to docker: group docker not found"
panic: runtime error: invalid memory address or nil pointer dereference
...
github.com/containerd/fifo.(*fifo).Close(0x0, 0x0, 0x0)
systemd 日志:
docker.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
docker.service: Failed with result 'exit-code'
定位结论:/var/lib/docker/containers 目录中部分容器元数据损坏,Docker Daemon 在 Restore 阶段对 FIFO 做 Close 时触发空指针 panic,导致 dockerd 直接崩溃。
Harbor 侧现象:
harbor-core、harbor-jobservice持续starting- 日志反复报错:
failed to connect to tcp://postgresql:5432: connection refused - 最终 core 容器 FATAL:
failed to initialize database
三、解决过程
✅ 第一阶段:清理无关告警(不影响启动,但建议处理)
grep ^docker /etc/group
# 不存在则创建
groupadd docker
该 warning 不会导致 dockerd panic,但按运维规范补齐用户组是好习惯。
✅ 第二阶段:修复 Docker 启动失败(核心步骤)
思路:Docker 启动时自动 restore 所有容器状态,损坏的容器元数据会导致 restore 阶段 panic。通过移走损坏目录,让 Docker 以"干净状态"启动。
# 1. 确保 Docker 完全停止
systemctl stop docker
systemctl status docker # 确认 dead
docker ps # 确认 command not found / 无法连接
# 2. 备份并清空 containers 目录(关键)
mv /var/lib/docker/containers /var/lib/docker/containers.bak
mkdir /var/lib/docker/containers
chmod 710 /var/lib/docker/containers
# 3. 启动 Docker
systemctl start docker
systemctl status docker # active (running)
docker ps # 正常返回
⚠️ 移走
containers目录后,原有容器会被 Docker 视为已删除(但镜像、volume、网络不受影响)。后续需要通过 compose 重新拉起业务容器。
✅ 第三阶段:恢复 Harbor 服务
确认 Harbor 的 docker-compose.yml 中数据目录(数据库、Redis、镜像存储等)均已挂载到宿主机,数据本身未丢失。
cd /var/data/harbor
# 1. 停掉现有容器
docker-compose down
# 2. 清理残留的 Docker 网络(重要,避免旧 IP/网段冲突)
docker network prune -f
# 3. 重新拉起全部服务
docker-compose up -d
✅ 第四阶段:验证
docker ps # 所有 harbor-* 容器状态为 healthy
docker logs harbor-core --tail 50
业务验证:
- 前端页面可正常访问
- 镜像推送/拉取正常
- 后端服务发版成功
四、关键经验总结
| 问题点 | 经验 |
|---|---|
| Docker 启动 panic | 大概率是 /var/lib/docker/containers 中容器元数据损坏;备份后移走即可恢复 dockerd |
| 数据是否丢失 | containers/ 只存容器配置和日志,镜像/volume/挂载数据不受影响 |
| Harbor 依赖异常 | core/jobservice 起不来,优先看 PostgreSQL 容器是否 healthy,不要只 restart 单个服务 |
| 网络残留问题 | 多次 docker-compose down/up 后 IP 冲突或 bridge 残留,用 docker network prune 清理 |
| 操作红线 | 修复前必须确认 Docker 已完全停止,避免写入损坏更多文件 |
五、一句话复盘
Docker 容器元数据损坏 → dockerd 启动时 panic 起不来 → 移走
/var/lib/docker/containers恢复 Docker →docker-compose down + network prune + up -d重建 Harbor → 全量 healthy,业务恢复。
如果你也在生产环境遇到 Harbor 升级/安全加固后 Docker 起不来的情况,希望这篇能帮你省掉 2 小时的 panic 时间。欢迎在评论区交流 👋
更多推荐



所有评论(0)