无法进入docker容器内排查总结

简介:

在进行处理服务器磁盘空间时,发现无法进入docker内部进行清理空间

在执行时,报下面错误

docker exec -it 容器ID bash

image

查看容器状态

docker ps

发现进程status 状态为up 启动状态,但是在进行进入容器操作时,却提示容器没有启动
临时解决
重启了docker服务,正常进入容器
但是具体原因得找到,所以就进行了排查之路
排查过程
首先此容器服务正常运行,考虑可能原因点:

  1. 内存溢出,导致hang住
  2. 服务进程被人异常删除(例如,直接清理了pid文件,却没有常规杀进程,导致ps可以看到进程存在)
  3. 在client和容器连接中出来问题(可能client连接不到容器)
  4. 容器代码有问题(比如进程的处理过程,资源分配不当)
  5. 容器内部署了supervisor,会不会是服务不可用的时候,自己已经停止,然后supervisor强行拉起,但是仍然不可用
  6. 容器内部应用服务不可用
  7. 磁盘空间不足
    ...

然后逐一分析可能性

  • 1 内存

      当时没有考虑到这点,所以重启之前忘了查看内存,也进不去容器,所以无法用free -m 查看当时容器的内存情况。后期在重启后有查看系统/var/log下的日志,并没有发现有报内存不足的错,这点排除了
  • 2 pid删除

     可以查看一下/root/.bash_history看一下历史命令,看有没有人误操作过删除pid文件,命令中没有找到,排除了这个原因
  • 3 容器连接问题

    这点源于看到一篇文章,里面讲了关于docker本身的处理架构,如下图所示:

    image

当执行docker exec 时,实质是通过client连接daemon,然后转到容器
所以考虑是不是client和daemon之间出了问题,或是他们其中一个出了问题
因为重启,没办法问题重现,只能通过容器记录的日志寻找蛛丝马迹
image

找到在容器内的日志里报“容器不存在”,只能证明不是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的内部机制深入了解,排查起来可能更能抓住重点。写下这次排查的过程,争取以后遇到类似的问题,不至于毫无头绪,不踩之前掉进去的坑

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
4月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
4月前
|
监控 Linux 调度
【赵渝强老师】Docker容器的资源管理机制
本文介绍了Linux CGroup技术及其在Docker资源管理中的应用。通过实例演示了如何利用CGroup限制应用程序的CPU、内存和I/O带宽使用,实现系统资源的精细化控制,帮助理解Docker底层资源限制机制。
455 6
|
4月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
636 5
|
4月前
|
存储 关系型数据库 MySQL
MySQL Docker 容器化部署全指南
MySQL是一款开源关系型数据库,广泛用于Web及企业应用。Docker容器化部署可解决环境不一致、依赖冲突问题,实现高效、隔离、轻量的MySQL服务运行,支持数据持久化与快速迁移,适用于开发、测试及生产环境。
773 5
|
6月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1026 108
|
7月前
|
存储 监控 测试技术
如何将现有的应用程序迁移到Docker容器中?
如何将现有的应用程序迁移到Docker容器中?
588 57
|
7月前
|
存储 监控 Java
如何对迁移到Docker容器中的应用进行性能优化?
如何对迁移到Docker容器中的应用进行性能优化?
507 59