为了账号安全,请及时绑定邮箱和手机立即绑定

无法连接到 Docker 容器中的 Go Server

无法连接到 Docker 容器中的 Go Server

Go
海绵宝宝撒 2022-06-27 16:19:29
我正在尝试在 docker 容器内运行一个用 Golang 编写的 HTTP 服务器,但我一直被拒绝连接。一切都在我的 Windows 10 机器上运行的 Ubuntu 20.04 Server VM 内运行。Go 服务器代码:package mainimport "github.com/lkelly93/scheduler/internal/server"func main() {    server := server.NewHTTPServer()    server.Start(3000)}package serverimport (    "context"    "fmt"    "net/http")type HTTPServer interface {    Start(port int) error    Stop() error}func NewHTTPServer() HTTPServer {    return &httpServer{}}type httpServer struct {    server *http.Server}func (server *httpServer) Start(port int) error {    serveMux := newServeMux()    server.server = &http.Server {        Addr: fmt.Sprintf(":%d", port),        Handler: serveMux,    }    return server.server.ListenAndServe()}func (server *httpServer) Stop() error {    return server.server.Shutdown(context.Background())}我的 Dockerfile:FROM ubuntu:20.04RUN apt-get update -y#Install needed packagesRUN apt-get install software-properties-common -yRUN apt-get install python3 -yRUN apt-get update -y RUN apt-get install python3-pip -yRUN apt-get install default-jre -y#Install language dependacies    #Python    RUN pip3 install numpy#Reduce VM size# RUN rm -rf /var/lib/apt/lists/*#Setup working DIRsRUN mkdir secureRUN mkdir secure/runner_filesCOPY scheduler /secureWORKDIR /secureEXPOSE 3000CMD ["./scheduler"] <-- The go server is compiled into a binary called scheduler我构建给定的 Dockerfile,然后运行:docker run -d --name scheduler -p 3000:3000 scheduler:latest然后我抓住容器的地址:docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' scheduler->172.17.0.2最后我使用 cURL 发送一个 http 请求:curl http://172.17.0.2:3000/execute/python --data '{"Code":"print(\"Hello\")"}'我正进入(状态curl: (7) Failed to connect to 172.17.0.2 port 3000: Connection refused但应该得到{"Stdout":"Hello\n"}%如果我在 Ubuntu VM 上运行 Go 服务器,从我的 Win10 机器调用它没有问题,但是当 Go 服务器存在于 Ubuntu 机器的 docker 容器中时,我似乎无法调用它。Go 代码比这更复杂,但是在这里发布所有内容太多了,请随时查看https://github.com/lkelly93/scheduler上的整个 repo 。最终它将成为我想要运行代码的网站的后端。像 LeetCode 或 Repl.it 这样的东西。
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

为了在我的服务器上解决这个问题,我将 IP 地址设置为 0.0.0.0:4000。我正在使用杜松子酒,所以这个例子看起来像:

r := gin.Default()
r.run("0.0.0.0:4000")

在此之后,我终于能够通过我的浏览器访问它。


查看完整回答
反对 回复 2022-06-27
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

您已经发布了端口,它将端口从 docker 主机转发到容器。因此,您要连接到 http://localhost:3000。桌面安装时连接到容器 IP 可能会失败,因为 docker 在 VM 内部运行,并且这些私有 IP 仅在 VM 中可见。

如果您碰巧正在运行docker-machine(安装较旧的 docker 工具箱就是这种情况),那么您需要获取 VM 的 IP。运行echo $DOCKER_HOST查看IP地址并将端口调整为3000端口。


查看完整回答
反对 回复 2022-06-27
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

在进行更多谷歌搜索后,我按照指南创建了自己的“用户定义的桥接网络”。

如果我启动我的容器并将它附加到这个网络,那么它就可以工作了!如果有人能解释为什么,我会喜欢的!


查看完整回答
反对 回复 2022-06-27
  • 3 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信