容器的接口访问错误: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发布于博客园

 

posted @ 2024-05-23 17:17  快乐的欧阳天美1114  阅读(38)  评论(0编辑  收藏  举报