大佬教程收集整理的这篇文章主要介绍了Docker Go 构建不为 HTTP 服务器提供服务,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
尝试为我的 Go 应用程序创建一个 Docker 容器 - 它在端口 8080 上创建一个 http 服务器:
package main
import (
"net/http"
)
func main() {
http.HandleFunc("/",doX)
if err := http.ListenAndServe("localhost:8080",nil); err != nil {
panic(err)
}
}
func doX(w http.ResponseWriter,r *http.Request) {
x
}
当我运行 go build 然后转到 localhost:8080 时它可以工作,但是当我尝试在 Docker 中构建和运行它时它没有响应:
# Start from the latest golang base image
FROM golang:1.14.3-alpine
# Set the Current Working Directory insIDe the container
workdir /app
# copy the source from the current directory to the Working Directory insIDe the container
copY /src .
# Build the Go app
RUN go build -o main .
# Expose port 8080 to the outsIDe world
EXPOSE 8080
# Command to run the executable
CMD ["./main"]
我正在运行的命令是:
docker build -t src 。 docker run -d -p 8080:8080 src
我所有的 .go 文件都在一个名为“src”的目录中。感谢帮助 - Docker 新手,谢谢!
将主机从 localhost 更改为 0.0.0.0
。没事的。
即
func main() {
http.HandleFunc("/",doX)
if err := http.ListenAndServe("0.0.0.0:8080",nil); err != nil {
panic(err)
}
}
环回的主要思想是在同一主机上提供资源。如果您要公开端口,则主机会发生变化,因此应该抛出 connection reset by peer
类型的错误。
或者,如果您的 golang 应用程序需要在不同图像的其他容器之间进行通信,您可能希望创建一个网络。 所以首先需要创建一个新网络。
docker network create <network_name>
然后在启动这个 go 容器和不同的容器时(如果需要的话)传递 network
标志以使它们在同一子网下可用。
docker run --network <network_name> -d -p 8080:8080 src
如果您不想这样做,请在 docker 的 host
网络上运行容器(PS。这不是标准做法,但有利于调试)。如果您在 host
网络中使用 localhost
处的 http.ListenAndServe
运行您的 src 映像,您会立即注意到它是可访问的,但是在 docker 的 bridge
网络模式下公开端口时,无法访问。所以应用程序设置中肯定有一些错误,它对外部网络是不可见的。
docker run -d --network host src
谢谢:)
以上是大佬教程为你收集整理的Docker Go 构建不为 HTTP 服务器提供服务全部内容,希望文章能够帮你解决Docker Go 构建不为 HTTP 服务器提供服务所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。