如何排查AWS服务器上Docker容器无预警异常退出的问题?
故障排查步骤
1. 确认容器退出的核心属性
执行以下命令获取容器退出的底层元数据:
docker inspect de63701bbc82 | grep -i 'exitcode\|oomkilled\|finishedat'
重点核对三个信息:
OOMKilled字段:如果为true说明程序内存占用超过实例可用上限,被系统内核强制终止。低配AWS EC2实例默认无swap分区,内存突增时OOM日志可能未及时落盘到syslog,属于高频触发原因ExitCode确认是否为固定值2,结合FinishedAt的退出时间,和EC2 CloudWatch监控对应时间点的CPU、内存、磁盘使用率做比对,确认是否是资源耗尽导致的退出
2. 调高日志等级捕获隐藏报错
当前你使用的是默认日志等级,遗漏了程序运行时的底层异常。重新启动容器时加上-v 2参数开启 verbose 全量日志:
docker run -dp 8081:8080 --log-opt max-size=100m --log-opt max-file=5 willnorris/imageproxy -addr 0.0.0.0:8080 -v 2
额外添加的日志滚动配置可以避免日志被自动覆盖,完整留存到下一次退出时排查,能捕获到程序未处理的panic、资源申请失败等隐藏错误。
3. 排查EC2底层事件
登录AWS控制台进入对应EC2实例的「事件」页,查看容器退出时间点是否有实例计划维护、宿主机故障迁移、健康检查失败等底层操作,这类操作会向容器发送终止信号,如果程序没有做信号捕获处理会直接退出,退出码可能显示为2。
临时兜底方案
启动容器时添加--restart=on-failure参数,出现异常退出时会自动重启服务,避免业务中断:
docker run -dp 8081:8080 --restart=on-failure --log-opt max-size=100m --log-opt max-file=5 willnorris/imageproxy -addr 0.0.0.0:8080 -v 2
内容的提问来源于stack exchange,提问作者oligofren
相关产品推荐
相关产品推荐

