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-coreharbor-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 时间。欢迎在评论区交流 👋


更多推荐