当遇到 Docker 容器无法通过 docker kill
或 docker stop
命令正常停止时,可能是由多种原因导致的。以下是详细的排查和解决方法:
现象:容器内的主进程(PID 1)无响应或成为僵尸进程
解决方案:
# 尝试强制杀死容器
docker kill -s KILL <container_id>
# 如果仍无效,直接杀死宿主机上的容器进程
ps aux | grep <container_id> # 找到对应的进程ID
kill -9 <pid>
现象:进程处于D状态(不可中断的睡眠状态)
解决方案:
# 检查进程状态
ps aux | grep <container_id>
# 如果是D状态,可能需要重启docker服务
sudo systemctl restart docker
# 或者重启宿主机
现象:存储驱动死锁导致容器无法停止
解决方案:
# 检查docker存储驱动
docker info | grep "Storage Driver"
# 尝试切换存储驱动(需备份数据)
# 编辑/etc/docker/daemon.json
{
"storage-driver": "overlay2"
}
# 然后重启docker
sudo systemctl restart docker
现象:系统资源耗尽导致操作无法完成
解决方案:
# 检查系统资源
free -h
df -h
dmesg | grep oom
# 释放资源或重启docker服务
sudo systemctl restart docker
现象:容器已停止但资源未释放
解决方案:
# 强制删除容器
docker rm -f <container_id>
检查容器日志:
docker logs <container_id>
检查docker守护进程日志:
journalctl -u docker.service
使用nsenter进入容器命名空间:
nsenter --target $(docker inspect -f '{{.State.Pid}}' <container_id>) --mount --uts --ipc --net --pid
检查内核消息:
dmesg | grep -i docker
如果以上方法都无法解决问题,可能需要考虑重启Docker服务或宿主机系统作为最后手段。