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

Linux服务器Docker部署Java应用端口105连接被拒绝问题排查求助

Linux服务器Docker部署Java应用端口105连接被拒绝问题排查求助

我来帮你分析下这个问题的可能原因和排查步骤,从你的描述来看,核心矛盾是宿主机公网IP访问端口105被拒绝,但localhost访问正常,结合Docker部署的场景,主要从以下几个方向入手:

  • 首先检查Docker的端口映射是否正确配置
    你用netstat -an | grep 105看到的是宿主机上的端口处于监听状态,但这个监听可能是Docker守护进程在处理端口转发,而非直接对应容器内的应用。你需要确认启动容器时是否正确做了端口映射:

    1. 执行docker ps查看容器的PORTS列,确认是否有0.0.0.0:105->[容器内应用端口]/tcp这样的配置;
    2. 如果没有这个映射,说明启动容器时遗漏了-p 105:容器内端口参数,需要重新启动容器并添加该参数;
    3. 如果有映射,要确认容器内应用实际监听的端口和你映射的端口是否一致——可以进入容器内部(docker exec -it 容器ID bash),执行netstat -an | grep 容器内端口,看应用是否真的在监听这个端口。
  • 确认Java应用的绑定地址是否为0.0.0.0
    从nc localhost 105能成功连接,但用公网IP不行,很大概率是Java应用只绑定了容器内的localhost(127.0.0.1),而非所有网卡(0.0.0.0)。因为Docker容器的localhost和宿主机的localhost是完全隔离的网络空间,应用如果只绑定容器内的localhost,即使宿主机做了端口映射,外部请求也无法穿透到容器内的应用。

    • 如果你用的是Spring Boot应用,需要在配置文件中设置server.address=0.0.0.0;
    • 其他Java框架也需要找到对应的绑定地址配置,确保应用监听容器内的所有网卡。
  • 排查Linux服务器的防火墙和安全组规则
    即使端口映射和应用配置都正确,防火墙或云服务商的安全组(如果是云服务器)也可能拦截了105端口的入站请求:

    1. 临时关闭宿主机防火墙测试(比如systemctl stop firewalld,测试后记得恢复systemctl start firewalld),如果关闭后能连接,说明是防火墙规则的问题;
    2. 永久放行105端口:用firewall-cmd --add-port=105/tcp --permanent,然后firewall-cmd --reload;如果是ufw防火墙,执行ufw allow 105/tcp;
    3. 如果你用的是云服务器,还要检查云平台的安全组规则,确保105端口的入站流量被允许。
  • 检查Docker网络模式的特殊配置
    如果你启动容器时用了--network host模式,那么容器会直接使用宿主机的网络栈,这时候需要确认:

    1. 宿主机上的105端口没有被其他非Docker的进程占用(虽然netstat显示LISTEN,但要确认监听进程是Docker还是其他进程);
    2. 应用在host模式下是否正确绑定了0.0.0.0,而非仅localhost。
  • 验证宿主机的IP和路由配置
    有时候服务器有多个网卡,0.0.0.0虽然表示监听所有网卡,但如果XX.XX.XX.XX这个IP对应的网卡有特殊路由限制,或者服务器配置了IPtables的转发规则,也可能导致连接被拒绝。你可以试试用服务器的内网IP(如果有的话)测试连接,看看是否能成功,以此排除IP本身的问题。

备注:内容来源于stack exchange,提问作者El_Merendero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 09:37:57