Docker部署的Go应用消费消息时出现Connection Refused错误
问题解决:Docker中Go应用无法连接本地STOMP服务
核心原因
Docker容器的localhost指向容器自身的网络环境,而非宿主机。你的Go应用在容器里访问localhost:61616,实际是尝试连接容器内部的61616端口,但STOMP服务运行在宿主机的Tomcat上,所以会出现连接拒绝。而本地Java应用直接使用宿主机的localhost,自然能正常连接。
解决方案
1. 修改Go代码的连接地址
把代码中的"localhost:61616"替换为宿主机的实际IP地址,或者使用Docker提供的宿主机别名:
- Windows/macOS:Docker内置了
host.docker.internal作为宿主机的别名,直接用这个地址即可:import ( "fmt" "github.com/go-stomp/stomp/v3" ) func main() { conn, err := stomp.Dial("tcp", "host.docker.internal:61616") if err != nil { fmt.Println("连接失败: ", err.Error()) return } defer conn.Disconnect() fmt.Println("连接成功") } - Linux:启动容器时添加
--add-host=host.docker.internal:host-gateway参数,然后代码里同样使用host.docker.internal:61616;或者直接使用宿主机的局域网IP(比如192.168.1.100:61616)。
2. 确认Tomcat STOMP服务的绑定地址
检查Tomcat的STOMP配置,确保服务绑定到0.0.0.0(允许所有IP访问),而不是仅127.0.0.1(仅本地访问)。如果绑定的是127.0.0.1,即使容器用了宿主机IP,也无法访问。
3. 检查宿主机防火墙设置
确保宿主机的61616端口没有被防火墙拦截,允许Docker容器所在的网络段访问该端口。
验证修改
修改代码后重新构建Docker镜像并启动容器,再次尝试连接STOMP服务,应该能正常建立连接。
内容的提问来源于stack exchange,提问作者shaaa
相关产品推荐
相关产品推荐

