**问题描述(198词):**
执行 `docker rm -f ` 后,`docker ps -a` 持续显示容器状态为 **"Removal In Progress"**,且长时间不消失(数分钟至数小时),容器无法重新创建同名容器、占用资源、阻塞镜像清理或守护进程响应。该状态表明 Docker daemon 正在同步卸载容器根文件系统(如 overlay2)、释放网络命名空间或等待内核资源回收,但因挂载残留、僵尸进程、存储驱动异常(如 overlay2 元数据损坏)、或容器内存在不可中断睡眠(D-state)进程而卡死。**强行 kill dockerd 或重启 Docker 服务虽可解除阻塞,但存在风险:可能破坏存储元数据一致性,导致后续 `docker info` 报错或镜像/卷不可用。** 此问题在高负载宿主机、使用 NFS/Bind Mount、或容器曾执行 `mknod`/`mount --bind` 等特权操作时尤为常见。需优先尝试无损诊断与恢复手段,而非直接重启服务。关键排查点包括:检查 `/var/lib/docker/containers//` 是否残留 `config.v2.json` 或 `hostconfig.json`;验证 `mount | grep ` 是否存在未释放挂载;确认 `ps aux | grep ` 是否存在关联进程残留。安全终止的核心原则是:**最小干预、保留数据完整性、避免强制 umount 或 rm -rf docker 目录。**
1条回答 默认 最新
rememberzrr 2026-02-28 06:55关注```html一、现象定位:识别“Removal In Progress”状态的本质
执行
docker rm -f <container_id>后,docker ps -a持续显示容器状态为 "Removal In Progress",且数分钟至数小时不消退。该状态非 UI 延迟,而是 Docker daemon 在同步执行根文件系统卸载(如 overlay2 的umount)、网络命名空间释放、cgroup 清理及内核资源回收。本质是 daemon 主动阻塞等待内核返回 —— 一旦挂载点被子进程持有、存在 D-state 进程、overlay2 元数据损坏或 bind-mount/NFS 资源未解耦,即陷入不可中断等待。二、根因分层:从用户态到内核态的四维归因模型
- 存储层:overlay2 下层目录(
/var/lib/docker/overlay2/<id>/merged)仍被挂载,或link/lower-id文件损坏导致overlayfs驱动拒绝解挂 - 进程层:容器 init 进程(PID 1)已退出但子进程残留(尤其
strace或sleep类 D-state 进程),或通过setns()重入命名空间的守护进程持续 hold 引用 - 命名空间层:netns、mntns 未完全释放,
ls -la /proc/*/ns/* | grep <container_id>可发现异常引用计数 - 外部依赖层:NFS 服务器响应延迟、bind-mount 目标路径被其他进程
chroot或open(O_PATH)持有,触发 VFS 层锁竞争
三、无损诊断:标准化排查流水线(含关键命令速查表)
检查维度 核心命令 预期健康输出 挂载残留 mount | grep $(cat /var/lib/docker/containers/<cid>/hostname 2>/dev/null | cut -c1-12)无任何输出 进程残留 ps -eo pid,ppid,comm,wchan:20 --forest | grep -A5 -B5 <cid>无 overlayfs、do_unmount或D状态行命名空间引用 find /proc/[0-9]*/ns -lname "*<cid>*" 2>/dev/null返回空 四、安全干预:渐进式解除阻塞的三级操作策略
- 一级(推荐):向 dockerd 发送 SIGUSR1 触发 debug 日志,观察
/var/log/docker.log中removing container后是否卡在unmounting layer或release network namespace - 二级(谨慎):使用
nsenter -m -t $(pidof dockerd) -- umount -l /var/lib/docker/overlay2/<layer_id>/merged执行 lazy unmount(-l),规避强制 umount 风险 - 三级(兜底):仅当确认无业务卷挂载且
docker volume ls输出为空时,执行systemctl kill --signal=SIGURG docker(触发 daemon 内部 GC 唤醒)
五、深度修复:Overlay2 元数据一致性校验与恢复
若怀疑 overlay2 损坏,进入
/var/lib/docker/overlay2目录后执行:# 校验 link 文件完整性 find . -name "link" -exec sh -c 'for f; do [ -n "$(cat "$f" 2>/dev/null)" ] || echo "CORRUPTED: $f"; done' _ {} \; # 安全重建 lowerdir 映射(需停 dockerd) dockerd --dump-sysinfo 2>/dev/null | grep -A5 "overlay2"六、预防机制:生产环境加固建议(Mermaid 流程图)
flowchart TD A[容器启动] --> B{是否使用特权?} B -->|Yes| C[禁用 mknod/mount --bind] B -->|No| D[启用 --read-only + --tmpfs /run] C --> E[添加 seccomp profile 禁止 unshare] D --> F[设置 oom_score_adj=-999] E --> G[部署 cadvisor + cgroupv2 监控] F --> G G --> H[自动告警 RemovalInProgress > 60s]```本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- 存储层:overlay2 下层目录(