Docker部署Golang应用curl报(56)Connection reset by peer问题
报错原因
核心问题是Go服务的监听地址配置不符合容器网络规则,和Docker端口映射配置无关,你当前写的-p 7000:8007端口映射规则本身是正确的。
代码里把服务监听地址设置为localhost:8007时,服务只会绑定容器内部的回环网卡(127.0.0.1),仅能接收容器内部从回环地址发起的请求。而Docker端口映射的转发逻辑,是把宿主机7000端口收到的请求转发到容器虚拟网卡对应的IP的8007端口上,不会走容器内部的回环地址。此时服务没有在容器对外的虚拟网卡上监听8007端口,收到转发过来的请求时会直接重置连接,最终触发curl: (56) Recv failure: Connection reset by peer报错。
修复步骤
- 修改
main.go中的服务监听地址配置,将localhost:8007替换为0.0.0.0:8007,修改后的核心代码如下:
... srv := &http.Server { Handler: router, Addr: "0.0.0.0:8007", } ...
配置为0.0.0.0代表服务会绑定容器内所有可用网卡,既包含本地回环网卡,也包含Docker分配的虚拟网卡,可以正常接收端口映射转发的外部请求。
2. 重新构建镜像并启动容器:
- 重新构建应用镜像:
docker build -t sample_go . - 删除之前启动的异常容器:
docker rm -f sample_go_app - 按原有端口映射规则启动新容器:
docker run --name sample_go_app -p 7000:8007 sample_go
完成后执行curl http://localhost:7000即可正常访问服务。
内容的提问来源于stack exchange,提问作者Amjed saleel
相关产品推荐
相关产品推荐

