我创建了我的第一个docker容器,它使用Go运行服务器,但我无法从主机外部访问它.我刚刚开始使用码头工具,所以我有点迷失在这里.
所以我有一个非常简单的Go代码启动服务器,我已经构建了docker镜像,它安装Go并在Linux基础映像中构建代码.我在端口8080上运行服务器,所以我将该端口暴露给运行容器的主机,如下所示:
docker run -p 8080:8080 dockertest
Run Code Online (Sandbox Code Playgroud)
这工作,我通过docker的机器IP(启动时出现在Docker Quickstart终端上的那个)访问服务器,问题是我无法访问我从主机外部托管的网站,所以如果我尝试要在我的手机上打开相同的IP地址,它只会给我一个错误:此网页不可用(ERR_CONNECTION_TIMED_OUT).
我也试过像这样指定IP:
docker run -p 192.168.0.157:8080:8080 dockertest
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,我可以通过上面的命令行上的docker机器的IP和指定的IP访问该网站.我也不确定我应该在该命令中使用我的计算机IP写入哪个IP,我也尝试过127.0.0.1(localhost),但这给了我相同的结果:无法访问任何网站知识产权无论如何.
我已经搜索了这个问题,发现了许多StackOverflow问题但是没有帮助我解决我的问题,其中大多数都面向Linux或Mac,所以解决方案不适用于我的情况.
此外,我可以在我的计算机上运行Go代码,并通过我的计算机的IP从同一网络中的另一台设备访问该网站.我不明白为什么我在docker机器上运行它时无法访问它,我想到它可能与IP转发或其他东西有关但我在网络中是一个完整的菜鸟,我我主要是一名网络开发人员,几乎没有本地人的经验.
我最近开始玩,所以我仍然是一个菜鸟,如果我犯了太多错误,对不起.我一直试图解决这个问题很长一段时间,但我只是不明白发生了什么.在我的main.go文件中,我有一个主要功能:
func main() {
http.HandleFunc("/", handler)
http.HandleFunc("/submit/", submit)
log.Fatal(http.ListenAndServe(":8080", nil))
}
Run Code Online (Sandbox Code Playgroud)
处理函数如下所示:
func handler(w http.ResponseWriter, r *http.Request) {
data, _ := ioutil.ReadFile("web/index.html")
w.Write(data)
}
Run Code Online (Sandbox Code Playgroud)
我知道这不是服务网站的最佳方式提交功能如下所示:
func submit(w http.ResponseWriter, r *http.Request) {
log.Println("METHOD IS " + r.Method + " AND CONTENT-TYPE IS " + r.Header.Get("Content-Type"))
r.ParseMultipartForm(32 << 20)
file, header, err := r.FormFile("uploadFile")
if err != nil {
json.NewEncoder(w).Encode(Response{err.Error(), true})
return
}
defer file.Close()
out, err := os.Create("/tmp/file_" + time.Now().String() + ".png")
if err != nil {
json.NewEncoder(w).Encode(Response{err.Error(), true})
return
} …Run Code Online (Sandbox Code Playgroud)