我正在尝试在 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")
在此之后,我终于能够通过我的浏览器访问它。
叮当猫咪
TA贡献1776条经验 获得超12个赞
您已经发布了端口,它将端口从 docker 主机转发到容器。因此,您要连接到 http://localhost:3000。桌面安装时连接到容器 IP 可能会失败,因为 docker 在 VM 内部运行,并且这些私有 IP 仅在 VM 中可见。
如果您碰巧正在运行docker-machine
(安装较旧的 docker 工具箱就是这种情况),那么您需要获取 VM 的 IP。运行echo $DOCKER_HOST
查看IP地址并将端口调整为3000端口。
慕的地6264312
TA贡献1817条经验 获得超6个赞
- 3 回答
- 0 关注
- 134 浏览
添加回答
举报
0/150
提交
取消