如何排查容器内Quarkus应用的Connection refused问题?
排查DMZ环境下Quarkus容器连接拒绝问题的步骤
用Java自带工具测试基础连通性
由于micro镜像无curl,可借助Java代码临时验证目标端点的网络可达性。在应用启动逻辑中添加以下代码片段:try (Socket socket = new Socket()) { socket.connect(new InetSocketAddress("目标域名", 目标端口), 5000); System.out.println("成功连接到目标端点"); } catch (IOException e) { System.err.println("连接失败详情: " + e.getMessage()); e.printStackTrace(); }部署后查看应用日志,判断是DNS解析失败还是端口无法访问。
检查容器DNS配置
进入容器后,通过Java代码读取/etc/resolv.conf内容,确认DNS服务器配置是否正确:try (BufferedReader reader = new BufferedReader(new FileReader("/etc/resolv.conf"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }若DNS解析异常,可在容器启动时添加
--dns <DNS服务器IP>参数,或在Quarkus配置中指定quarkus.dns.nameservers。验证容器网络归属
检查Quarkus容器与目标端点容器是否处于同一Docker网络:# 在宿主机执行 docker inspect <Quarkus容器ID> | grep Networks docker inspect <目标容器ID> | grep Networks若不在同一网络,需将Quarkus容器加入目标容器所在网络,或创建共享网络实现互通。
排查DMZ网络规则限制
宿主机curl能通不代表容器网络不受限制,联系运维团队确认:- 容器所在网段到目标容器网段的端口是否开放
- 目标端点是否配置了仅允许宿主机IP访问的防火墙规则
- DMZ区域是否存在NAT或路由规则导致容器流量无法到达目标
临时换用完整镜像辅助排查
临时替换为quarkus/quarkus-jvm-image(包含curl等工具),进入容器后直接执行curl <目标端点>,快速验证容器内是否能正常访问目标,排除镜像环境差异问题。开启Quarkus客户端详细日志
在application.properties中添加日志配置,捕获JAX-RS客户端的完整请求流程:quarkus.log.category."org.jboss.resteasy.client".level=DEBUG quarkus.log.category."org.apache.http".level=DEBUG quarkus.log.category."java.net".level=DEBUG通过日志定位DNS解析、连接建立、请求发送等环节的具体异常。
内容的提问来源于stack exchange,提问作者eerriicc
相关产品推荐
相关产品推荐

