普通网友 2026-02-28 06:55 采纳率: 98.5%
浏览 4
已采纳

`docker ps -a` 显示容器状态为 “Removal In Progress”,如何安全终止卡住的删除操作?

**问题描述(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)已退出但子进程残留(尤其 stracesleep 类 D-state 进程),或通过 setns() 重入命名空间的守护进程持续 hold 引用
    • 命名空间层:netns、mntns 未完全释放,ls -la /proc/*/ns/* | grep <container_id> 可发现异常引用计数
    • 外部依赖层:NFS 服务器响应延迟、bind-mount 目标路径被其他进程 chrootopen(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>overlayfsdo_unmountD 状态行
    命名空间引用find /proc/[0-9]*/ns -lname "*<cid>*" 2>/dev/null返回空

    四、安全干预:渐进式解除阻塞的三级操作策略

    1. 一级(推荐):向 dockerd 发送 SIGUSR1 触发 debug 日志,观察 /var/log/docker.logremoving container 后是否卡在 unmounting layerrelease network namespace
    2. 二级(谨慎):使用 nsenter -m -t $(pidof dockerd) -- umount -l /var/lib/docker/overlay2/<layer_id>/merged 执行 lazy unmount(-l),规避强制 umount 风险
    3. 三级(兜底):仅当确认无业务卷挂载且 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]
    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 3月1日
  • 创建了问题 2月28日