在进行处理服务器磁盘空间时,发现无法进入docker内部进行清理空间
在执行时,报下面错误
docker exec -it 容器ID bash
查看容器状态
docker ps
发现进程status 状态为up 启动状态,但是在进行进入容器操作时,却提示容器没有启动
临时解决:
重启了docker服务,正常进入容器
但是具体原因得找到,所以就进行了排查之路
排查过程:
首先此容器服务正常运行,考虑可能原因点:
- 内存溢出,导致hang住
- 服务进程被人异常删除(例如,直接清理了pid文件,却没有常规杀进程,导致ps可以看到进程存在)
- 在client和容器连接中出来问题(可能client连接不到容器)
- 容器代码有问题(比如进程的处理过程,资源分配不当)
- 容器内部署了supervisor,会不会是服务不可用的时候,自己已经停止,然后supervisor强行拉起,但是仍然不可用
- 容器内部应用服务不可用
- 磁盘空间不足
...
然后逐一分析可能性
-
1 内存
当时没有考虑到这点,所以重启之前忘了查看内存,也进不去容器,所以无法用free -m 查看当时容器的内存情况。后期在重启后有查看系统/var/log下的日志,并没有发现有报内存不足的错,这点排除了
-
2 pid删除
可以查看一下/root/.bash_history看一下历史命令,看有没有人误操作过删除pid文件,命令中没有找到,排除了这个原因
-
3 容器连接问题
这点源于看到一篇文章,里面讲了关于docker本身的处理架构,如下图所示:
当执行docker exec 时,实质是通过client连接daemon,然后转到容器
所以考虑是不是client和daemon之间出了问题,或是他们其中一个出了问题
因为重启,没办法问题重现,只能通过容器记录的日志寻找蛛丝马迹
找到在容器内的日志里报“容器不存在”,只能证明不是client出了问题,因为还能提供服务,也不像是容器内部的问题,那就剩下daemon了
总结出其他人解决的几个步骤(不知道是否适用,仅供排查参考):
- 1 strace -ff -o log -v docker ps 输出日志追踪
- 2 升级内核,升级daemon
- 3 重启
-
4容器代码问题
也就是daemon问题,因为重启了,就可以正常使用
-
5 supervisor导致
想到supervisor的原因是因为docker官方在最新版docker中基于supervisor部分的代码有了很大的改动,不确定是否在这其中存在bug
-
6 容器内应用问题
这点最先排除,排除理由,内部应用的启动停止,不会影响外部连接,所以排除
-
7空间问题
考虑这个原因是因为能发现登不进去容器的事情就是为了清理这台机器的空间,是否因为存储影响,但是docker重启问题消失了,所以排除
自我总结:
当遇到此类问题时,如果时间紧,可以先重启,之后排查具体原因,但重启前有些操作还是需要提前想到的(如我上面罗列的可能性),尤其是基础信息,其次,就是日志,要利用好系统日志和docker自己本身的日志,有机会的话对docker的内部机制深入了解,排查起来可能更能抓住重点。写下这次排查的过程,争取以后遇到类似的问题,不至于毫无头绪,不踩之前掉进去的坑