无法进入docker容器内排查总结
在进行处理服务器磁盘空间时,发现无法进入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的内部机制深入了解,排查起来可能更能抓住重点。写下这次排查的过程,争取以后遇到类似的问题,不至于毫无头绪,不踩之前掉进去的坑
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
为什么配置模式令人抓狂?尝试用编程语言来写吧
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 本文将试着解释为什么大多数配置格式用起来都不太舒服,作者建议大家尝试使用一门真正的编程语言(例如,像 Python 这样的通用编程语言)来编写配置,通常这是一种可行的选择,且使用过程更感愉悦。 大多数现代配置格式都很糟糕 本节,我主要针对 JSON/YAML/TOML/ini 文件,这是我遇到过最常见的配置格式。 我们暂将这种配置称为常见配置(如果有更好的名字,欢迎在评论中留言,谢谢)。 大家可能遇到过如下情况: JSON 没有注释,设计如此 大量配置无法重用 例如,虽然 YAML 在理论上支持重用 / 引用配置(他们称之为锚),但有些软件(如 Github Actions )却并不支持。通常,开发者无法重用配置的一部分,必须复制粘贴。 .gitconfig 使用一个自定义语法来合并这些配置 不能包含任何逻辑 很多人认为这是一种积极的做法,但我认为,如果不能定义临时变量、辅助函数、替换字符串或连接列表,那就有点差劲。变通方法(如果有的话)通常也不好用,因为它们额外增加了认知开销。于是,出...
- 下一篇
MaxCompute 基本概念与术语
项目空间• 项目空间(Project)是MaxCompute的基本组织单元,类似于传统数据库的DataBase或Schema的概念,是进行多用户隔离和访问控制的主要边界。项目空间中包含多个对象,例如表(Table)、资源(Resource)、函数(Function)和实例(Instance)等。• 一个用户可以同时拥有多个项目空间的权限。通过安全授权,可以跨项目空间访问对象。• 通过在MaxCompute客户端中运行useproject命令进入一个项目空间。 表• 表是MaxCompute的数据存储单元,逻辑上是二维结构,MaxCompute中不同类型计算任务的操作对象(输入、输出)都是表。• MaxCompute的表分为内部表和外部表(2.0版本开始支持)。• 对于内部表,所有的数据都被存储在MaxCompute中。• 对于外部表,MaxCompute并不真正持有数据,表格的数据可以存放在OSS或OTS中,MaxCompute仅会记录表格的Meta信息,OSS上的信息可以是非结构化的,例如视频、音频等。• MaxCompute与Oracle等数据库不同,系统并不会自动创建dual表。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Red5直播服务器,属于Java语言的直播服务器