首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >解决docker服务假死问题

解决docker服务假死问题

作者头像
鲲志说
发布于 2025-04-07 21:51:37
发布于 2025-04-07 21:51:37
1.8K0
举报

工作中使用docker-compose部署容器,有时候会出现使用docker-compose stop或docker-compose down命令想停掉容器,但是依然无法停止或者一直卡顿在停止中的阶段,这种问题很让人头疼啊!

问题描述

在使用docker部署服务时,偶尔会遇到docker服务假死的情况,使用的命令如下:

  • docker ps 显示容器状态正常,但是对外服务已经不可用不可访问
  • docker stats 没有任何反应
  • docker stop CONTAINER_ID 也没有任何反应
  • docker restart CONTAINER_ID 也没有任何反应
  • docker exec -it --user root CONTAINER_ID /bin/bash 也没有任何反应
  • docker logs CONTAINER_ID --tail 111 -f 也没有任何反应
  • docker-compose stop/down 命令也提示响应超时,不可用

问题排查

之前没有遇到过这种问题,也是第一次,于是就各种信息都看一下,各种可能性也都考虑到位

猜测这种情况,可能是由于容器内部的问题导致服务无法正常运行,或者Docker守护进程本身出现了问题。

  1. 查看容器内部日志(我的容器日志也没有问题)
  • 使用以下命令查看容器内的stdout和stderr输出,以获取有关容器内部问题的更多信息。
代码语言:javascript
复制
docker logs CONTAINER_ID
  • 使用-f选项可以实时跟踪日志
代码语言:javascript
复制
docker logs -f CONTAINER_ID
  1. 检查宿主机资源: 使用以下命令检查宿主机的资源使用情况,确保资源(CPU、内存)没有被耗尽(我的没有问题)
代码语言:javascript
复制
docker stats
  1. 查看Docker守护进程状态(我的容器依然处于运行状态)
  • 检查Docker守护进程的运行状态,确保它没有出现问题。
代码语言:javascript
复制
sudo systemctl status docker
  • 如果守护进程出现问题,可以尝试重启Docker服务
代码语言:javascript
复制
sudo systemctl restart docker
  1. 手动停止和启动容器: 尝试手动停止和启动容器,看是否能够解决问题。(我的问题么有解决啊😭)
代码语言:javascript
复制
docker stop CONTAINER_ID
docker start CONTAINER_ID
  1. 检查端口冲突: 确保容器所使用的端口没有被其他进程占用。(不可能,绝对不可能.jpg)
  2. 查看系统日志: 查看系统日志以获取更多关于系统或Docker的问题的信息。(说实话么有看出来什么问题)
代码语言:javascript
复制
dmesg | grep -i docker
  1. 查看网络配置(正常的网络状况,网络配置也没有修改)
  • 检查Docker网络配置,确保网络正常。
代码语言:javascript
复制
docker network ls
  • 查看容器的网络配置
代码语言:javascript
复制
docker inspect CONTAINER_ID | grep NetworkMode
  1. 查看防火墙设置: 如果使用防火墙,确保容器所需的端口没有被阻塞。
  2. 尝试重启Docker服务: 如果以上方法都没有解决问题,可以尝试重启整个Docker服务。(终极大招,管用!)
代码语言:javascript
复制
sudo systemctl restart docker

问题解决

终极杀招-最粗暴的解决方法

  • 重启docker(慎用):
代码语言:javascript
复制
sudo systemctl restart docker

要注意,这个操作会把所有的docker服务无差别的重启,慎用

手动清理假死的docker服务

  1. 找到假死的docker服务:执行docker ps命令找到容器ID【CONTAINER_ID】
  2. 先尝试使用docker自带的命令停止容器:docker stop 【CONTAINER_ID】 发现停不掉
  3. 手动查找docker目录下的容器信息
  • docker默认目录:/var/lib/docker
  • 所有docker容器的信息都挂载在/var/lib/docker/containers目录下
  • 通过【CONTAINER_ID】找到该假死服务的目录
    • ll /var/lib/docker/containers | grep 【CONTAINER_ID】
    • cd /var/lib/docker/containers
  1. 删除该容器 rm -rf 目录名

这里删除可能会报下面的错误,因为你的容器还挂载了其他目录,信息如下: rm:无法删除"/var/lib/docker/containers/目录名/secrets":设备或资源忙无法删除"/var/lib/docker/containers/目录名/shm": 设备或资源忙

这个时候查一下容器对应的挂载目录

代码语言:javascript
复制
cat /proc/mounts |grep "docker" |grep "【CONTAINER_ID】"

然后先取消挂载

代码语言:javascript
复制
umount /data/sys/var/docker/containers/挂载目录/secretsumount /data/sys/var/docker/containers/挂载目录/shm

如果这一步 unmout 不了,可以尝试找到使用该目录的进程

代码语言:javascript
复制
lsof |grep "挂载目录"

如果有相关进程,记录相关的进程号直接 kill -9 进程号

代码语言:javascript
复制
ll /var/lib/docker/containers | grep 【CONTAINER_ID】

这个时候再重新执行删除目录命令

代码语言:javascript
复制
cd /var/lib/docker/containers
代码语言:javascript
复制
rm -rf 目录名

这个时候就可以删掉了

  1. 再次尝试通过docker的命令停止容器
代码语言:javascript
复制
docker stop 【CONTAINER_ID】

或

代码语言:javascript
复制
docker rm -f 【CONTAINER_ID】或docker kill --signal=SIGINT  【CONTAINER_ID】

如果还是无法停掉改服务,可以按如下步骤:

使用linux进程管理命令来结束容器进程

  • 先找到该进程:ps -ef | grep【CONTAINER_ID】
  • 强制杀掉筛选出来的进程信息:kill -9 PID
  1. 再次检查docker服务状态 docker ps

先可以看到该服务已经被干掉了。

如果说按照这个操作依然无法解决docker假死问题,那么我还是建议大家采用上面最粗暴的方式去解决,但是要注意,这个操作会把所有的docker服务无差别的重启。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 问题描述
  • 问题排查
  • 问题解决
    • 终极杀招-最粗暴的解决方法
    • 手动清理假死的docker服务
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档