容器的接口访问错误:Recv failure: Connection reset by peer,Gin
go version go1.22.1 windows/amd64
Windows 11 + amd64
x86_64 x86_64 GNU/Linux
---
开发了一个 golang 程序:基于 Gin web 框架 的 服务,部署到了 ECS 的 容器(docker) 上,端口 40000 也暴露成功了。ben发布于博客园
# docker run -itd --name go1 -m 128MB -p 40000:40000 go1:v0.1
其中,go1:v0.1 是 自己 build 的 镜像。
在 宿主机访问出错:ben发布于博客园
# curl -v http://localhost:40000/api/sys/info
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 40000 (#0)
> GET /api/sys/info HTTP/1.1
> Host: localhost:40000
> User-Agent: curl/7.61.1
> Accept: */*
>
* Recv failure: Connection reset by peer
* Closing connection 0
curl: (56) Recv failure: Connection reset by peer
容器的日志也查不到访问记录。
使用 docker exec 进入容器调用接口 成功。
为什么呢?
查询资料得知,这是 Gin web 框架的错误使用导致的。ben发布于博客园
问题代码:
import "github.com/gin-gonic/gin"
//...
router := gin.Default()
//...
router.Run("localhost:40000")
这里调用了 Run方法,其参数有一个 localhost,只是绑定到了 localhost,这就是错误的原因。
更改为如下即可:🚩
// Listen and serve on 0.0.0.0:40000
router.Run(":40000")
重建镜像,使用新镜像运行容器,这样,就可以从 宿主机访问了。
END.
ben发布于博客园
ben发布于博客园