我正在尝试在Docker容器中运行用Golang编写的HTTP服务器,但我一直收到连接被拒绝的错误。所有内容都在Ubuntu 20.04服务器虚拟机内运行,在我的Windows 10机器上运行。
Go服务器代码如下:
我的Dockerfile:
我构建给定的Dockerfile,然后运行:
最后我使用 cURL 发送了一个 http 请求:
但应该得到
如果我在Ubuntu虚拟机上运行Go服务器,从我的Win10机器上调用它没有任何问题,但是当它存在于Docker容器中时,似乎无法从Ubuntu机器上调用Go服务器。
Go代码比这更复杂,但在此处发布所有内容太多了,请随意查看整个repo https://github.com/lkelly93/scheduler。
最终它将成为我想要创建的网站的后端,该网站可以运行代码。类似于LeetCode或Repl.it。
谢谢!
编辑:
我获得了正确的输出。虽然这有效,但我希望能够同时运行多个docker镜像。因此,我更喜欢使用IP地址来寻址它们。所以我认为这不是一个永久的解决办法。
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虚拟机上运行Go服务器,从我的Win10机器上调用它没有任何问题,但是当它存在于Docker容器中时,似乎无法从Ubuntu机器上调用Go服务器。
Go代码比这更复杂,但在此处发布所有内容太多了,请随意查看整个repo https://github.com/lkelly93/scheduler。
最终它将成为我想要创建的网站的后端,该网站可以运行代码。类似于LeetCode或Repl.it。
谢谢!
编辑:
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a56a973040f scheduler:latest "./scheduler" 37 seconds ago Up 36 seconds 0.0.0.0:3000->3000/tcp scheduler
docker容器2a56a973040f的日志未输出。
编辑2:
docker run -it --net container:2a56a973040f nicolaka/netshoot ss -lnt
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 4096 *:3000 *:*
编辑3:
阅读手册后,我发现如果在我的镜像中添加标签--network=host,然后运行。
curl http://localhost:3000/execute/python --data '{"Code":"print(\"Hello\")"}'
我获得了正确的输出。虽然这有效,但我希望能够同时运行多个docker镜像。因此,我更喜欢使用IP地址来寻址它们。所以我认为这不是一个永久的解决办法。