Docker 容器无法停止的排障与解决全过程

前言

在使用docker stop命令停止Nginx容器时,出现Error response from daemon: cannot stop container: a5c1bb8580d5: tried to kill container, but did not receive an exit event报错,常规操作难以解决。

问题现象

执行docker stop a5c1bb8580d5命令尝试停止目标Nginx容器时,Docker守护进程返回错误,提示无法停止容器,尝试杀死容器但未收到退出事件。

后续尝试docker inspect -f '{``{.State.Pid}}' a5c1bb8580d5查看容器对应的宿主机进程ID时,发现返回值为0 ,这意味着容器在Docker层面已经没有对应的进程记录,但容器资源却依然残留,常规的docker rm -f命令也无法将其删除。

问题排查

尝试强制停止容器

面对容器无法正常停止的情况,首先想到的是使用docker kill命令强制发送SIGKILL信号终止容器,命令如下:

bash 复制代码
docker kill a5c1bb8580d5

docker kill 仍失败,手动清理容器进程

复制代码
# 1. 查找容器对应的宿主机进程ID(PID)
docker inspect -f '{{.State.Pid}}' a5c1bb8580d5

# 2. 强制杀死该进程(替换为上一步查到的PID)
sudo kill -9 <查到的PID>

# 3. 清理残留的容器资源
docker rm -f a5c1bb8580d5

但执行后发现,该方法并未生效,容器依旧无法被停止和删除,因为容器 pid 为 0,说明进程在 Docker 层面已无记录,但容器仍残留,这是 Docker 的一种资源残留异常状态。

清理残留容器资源,解决问题

清理 PID 为 0 的残留容器

由于容器 PID 为 0,常规命令无法清理,需要绕过 Docker CLI,直接操作 Docker 的底层存储目录来删除残留资源,具体步骤如下:

停止 Docker 服务

注意:该操作会停止所有正在运行的容器,建议在业务低峰期执行,或提前做好业务容灾准备。

复制代码
# Ubuntu/Debian系统
sudo systemctl stop docker
# CentOS/RHEL系统
sudo service docker stop

删除容器残留文件

Docker 的容器数据默认存储在/var/lib/docker/containers/目录下,我们需要找到对应容器 ID 的文件夹并删除:

复制代码
# 进入容器存储目录
cd /var/lib/docker/containers/
# 查找目标容器的文件夹
ls -la | grep a5c1bb8580d5
# 删除该容器的残留文件夹
sudo rm -rf a5c1bb8580d5*

清理网络残留(可选)

如果存在网络关联残留问题,可以删除 Docker 网络的本地键值数据库文件:

复制代码
sudo rm -rf /var/lib/docker/network/files/local-kv.db

重启 Docker 服务

复制代码
# Ubuntu/Debian系统
sudo systemctl start docker
# CentOS/RHEL系统
sudo service docker start

验证清理结果

执行 docker ps -a 命令查看容器列表,确认目标容器已被清理。

相关推荐
乘云数字DATABUFF4 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
Patrick_Wilson4 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
阿里云云原生4 天前
AI 开发新常态:当 Cursor、Claude、Codex 并行,如何统一管理散落的 Skill 资产?
云原生·ai编程
探索云原生4 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
Suroy4 天前
DockerView-Go:用 Go 写一个终端 Docker 监控工具,顺便做了个 Web 仪表盘
docker
云恒要逆袭5 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美5 天前
从edge-trigger到level-trigger,谈谈 Kubernetes controller 的开发范式
云原生
阿里云云原生5 天前
深度解构:当 Append-only 的 SLS 遇上 Update/Delete,是如何实现设计权衡的?
云原生
荣--5 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森5 天前
动手实战学 Docker — 从零到集群编排完全指南
运维