You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一主机上JBoss EAP 7.3服务间调用出现Connection refused问题求助

问题排查与解决建议

核心原因:Docker容器的网络隔离特性

Docker容器默认的localhost指向容器自身,而非宿主机。ServiceA如果配置调用localhost:8085或127.0.0.1:8085,实际是访问容器内部端口,自然会触发连接拒绝错误。

以下是具体排查和解决步骤:

1. 修正ServiceA的调用地址

将ServiceA中调用ServiceB的地址,从localhost:8085/127.0.0.1:8085改为宿主机的实际IP地址(可通过宿主机执行ip addr查看局域网/公网IP,比如192.168.1.100:8085)。

若使用Docker 20.10+版本,也可以用host.docker.internal作为宿主机地址,但启动ServiceA容器时需要添加参数:

docker run --add-host host.docker.internal:host-gateway ...

2. 验证容器内的网络连通性

进入ServiceA的容器,直接测试与ServiceB的连通性,确认网络层面是否正常:

# 进入容器
docker exec -it <serviceA容器ID/名称> bash
# 测试访问宿主机8085端口
curl http://<宿主机IP>:8085
# 或用telnet检查端口是否开放
telnet <宿主机IP> 8085

如果这一步失败,说明容器到宿主机的网络存在限制;如果成功,说明ServiceA的代码/配置里的调用地址有误。

3. 检查Docker网络模式

  • 默认的bridge模式下,容器与宿主机是隔离的,需确保容器能访问宿主机网络。
  • 若允许,可以尝试用host网络模式启动ServiceA,容器会直接复用宿主机网络栈,此时localhost即可指向宿主机:
docker run --network host ...

注意:host模式会消除容器的网络隔离,需评估安全性后使用。

4. 确认ServiceB的监听状态

执行以下命令,确认ServiceB确实监听了所有网卡的8085端口:

netstat -tulpn | grep 8085

输出需包含0.0.0.0:8085或宿主机的公网/局域网IP,若仅显示127.0.0.1:8085,说明ServiceB的启动参数覆盖了standalone.xml的配置,需检查启动命令是否指定了-b 127.0.0.1。

5. 排查SELinux限制(Fedora默认开启)

Fedora默认启用SELinux,即使关闭firewalld,SELinux仍可能阻止容器访问宿主机端口:

  • 临时关闭SELinux测试:
setenforce 0

若问题解决,需配置SELinux规则允许访问:

# 将8085端口标记为HTTP服务端口
semanage port -a -t http_port_t -p tcp 8085
# 或启动容器时添加SELinux标签
docker run --security-opt label=type:container_runtime_t ...

内容的提问来源于stack exchange,提问作者voccoeisuoi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:57:16