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

我正在尝试在 docker 容器内运行一个用 Golang 编写的 HTTP 服务器,但我一直被拒绝连接。一切都在我的 Windows 10 机器上运行的 Ubuntu 20.04 Server VM 内运行。


Go 服务器代码:


package main


import "github.com/lkelly93/scheduler/internal/server"


func main() {

    server := server.NewHTTPServer()

    server.Start(3000)

}

package server


import (

    "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.04


RUN apt-get update -y


#Install needed packages

RUN apt-get install software-properties-common -y

RUN apt-get install python3 -y

RUN apt-get update -y 

RUN apt-get install python3-pip -y

RUN 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 DIRs

RUN mkdir secure

RUN mkdir secure/runner_files


COPY scheduler /secure

WORKDIR /secure


EXPOSE 3000


CMD ["./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 这样的东西。


海绵宝宝撒
浏览 135回答 3
3回答

LEATH

为了在我的服务器上解决这个问题,我将 IP 地址设置为 0.0.0.0:4000。我正在使用杜松子酒,所以这个例子看起来像:r&nbsp;:=&nbsp;gin.Default() r.run("0.0.0.0:4000")在此之后,我终于能够通过我的浏览器访问它。

叮当猫咪

您已经发布了端口,它将端口从 docker 主机转发到容器。因此,您要连接到 http://localhost:3000。桌面安装时连接到容器 IP 可能会失败,因为 docker 在 VM 内部运行,并且这些私有 IP 仅在 VM 中可见。如果您碰巧正在运行docker-machine(安装较旧的 docker 工具箱就是这种情况),那么您需要获取 VM 的 IP。运行echo $DOCKER_HOST查看IP地址并将端口调整为3000端口。

慕的地6264312

在进行更多谷歌搜索后,我按照本指南创建了自己的“用户定义的桥接网络”。如果我启动我的容器并将它附加到这个网络,那么它就可以工作了!如果有人能解释为什么,我会喜欢的!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go