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

Docker容器暴露端口访问报Connection Refused问题求助

问题根因

故障核心原因是你的Go Web服务仅绑定了容器内的loopback回环地址(127.0.0.1),没有监听所有网卡的0.0.0.0地址。这种绑定模式下只有容器内部走localhost的流量能被服务接收,经过eth0网卡的流量(包括Docker端口映射转发、K8s Service转发、同Pod其他容器访问的流量)都会被内核直接丢弃,和Docker、K8s的网络配置无关。

你观察到的「curl localhost:8080正常返回、curl eth0网卡IP:8080请求失败」的现象,完全匹配该故障的典型特征。

排查验证

进入容器执行以下命令确认监听地址:

ss -tulnp | grep 8080

如果输出结果中监听地址显示为127.0.0.1:8080,即可直接确认问题。

修复方案

1. 修正服务监听地址

修改Go代码中HTTP服务的启动监听参数,不要写死回环地址:

  • 错误写法(仅本地可访问):
// 原生net/http写法
log.Fatal(http.ListenAndServe("127.0.0.1:8080", router))
// Gin框架写法
r.Run("127.0.0.1:8080")
// Echo框架写法
e.Start("127.0.0.1:8080")
  • 正确写法(所有网卡可访问):
// 原生net/http写法,:8080默认等价于0.0.0.0:8080
log.Fatal(http.ListenAndServe(":8080", router))
// 也可以显式指定全地址绑定
log.Fatal(http.ListenAndServe("0.0.0.0:8080", router))

// Gin框架写法
r.Run(":8080")
// Echo框架写法
e.Start(":8080")

如果你的服务监听地址是通过环境变量、配置文件传入的,同步修改对应配置项的值为:8080或者0.0.0.0:8080即可。

2. 重新部署验证

修改完成后重新构建镜像、启动容器,再次在容器内用eth0网卡IP执行curl请求,能正常收到响应后,Docker的端口映射、K8s的Service转发规则就可以正常工作了。

避坑提示
  • Dockerfile里的EXPOSE指令仅做端口声明,不会修改服务的监听绑定,不要把流量不通的问题归因到EXPOSE配置上
  • 不要在容器内用localhost作为服务连通性的唯一验证标准,容器场景下必须用网卡IP或者0.0.0.0绑定验证,才能确认服务可以接收外部转发的流量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.14 16:15:48