我一直试图在最后几个小时解决这个问题,但我被困住了。
我有一个非常简单的Dockerfile,如下所示:
FROM alpine:3.6
COPY gempbotgo /
COPY configs /configs
CMD ["/gempbotgo"]
EXPOSE 8025
gempbotgo只是一个运行网络服务器和其他东西的二进制文件。 网络服务器在8025上运行,应该回答一个问候世界。
我的问题是暴露端口。我像这样运行我的容器(在构建之后)
docker run --rm -it -p 8025:8025 asd
一切似乎都很好但是当我尝试在浏览器中打开127.0.0.1:8025或尝试wget时我只得到一个空的回复。 Chrome:ERR_EMPTY_RESPONSE
该端口在我的Windows 10系统上使用,不受防火墙的限制。 只在我的“Windows上的Ubuntu上的Bash”终端上运行没有容器的go二进制文件,然后浏览到127.0.0.1:8025即可顺利运行。 其他地址返回了“ERR_CONNECTION_REFUSED”,如127.0.0.1:8030,因此在端口上确实有一些活动。
然后我带着
走进了那个人docker exec -it e1cc6daae4cf /bin/sh
并在那里检查了wget会发生什么。也没有问题。 index.html文件下载时带有“Hello World”
为什么docker没有发送任何数据?我也用docker-compose运行我的容器,但没有区别。
我还在外部托管的VPS上运行了容器。同样的问题......(Debian)
我的代码:(注意Makefile) https://github.com/gempir/gempbotgo/tree/docker
修改
获得一些评论后,我将Dockerfile更改为多阶段构建。这是我的Dockerfile现在:
FROM golang:latest
WORKDIR /go/src/github.com/gempir/gempbotgo
RUN go get github.com/gempir/go-twitch-irc \
&& go get github.com/stretchr/testify/assert \
&& go get github.com/labstack/echo \
&& go get github.com/op/go-logging
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY configs ./configs
COPY --from=0 /go/src/github.com/gempir/gempbotgo/app .
CMD ["./app"]
EXPOSE 8025
可悲的是,这并没有改变任何事情,我尽可能地保持一切尽可能接近指南:https://docs.docker.com/engine/userguide/eng-image/multistage-build/#use-multi-stage-builds
我也尝试过golang.org的极简主义Dockerfile,如下所示:
FROM golang:onbuild
EXPOSE 8025
但是没有成功。
答案 0 :(得分:6)
您的问题是您绑定到代码中的127.0.0.1:8025
。这使代码在容器内部工作,但不在外部。
您需要绑定到0.0.0.0:8025
以绑定到容器内的所有接口。因此,Go应用程序也接受来自容器外部的流量
答案 1 :(得分:0)
出现此错误的另一种可能性是docker run命令是通过常规cmd提示符而不是admin命令提示符运行的。确保您以管理员身份运行!
答案 2 :(得分:0)
添加到可接受的答案:我在尝试运行docker / getting-started时遇到了相同的错误消息。
问题是“入门”正在使用端口80,而这是
我的机器上的“已占用”(SL6X95n4rk<[VHK_ $2b$12$q6DfXygpSFW3JI9EQXJmm.wy8ZhhJiJ6mK907bHJXnv8XQdEe9ofG
True
)。
我必须使用netsh http show urlacl
,其中
8888是未使用的端口。然后打开“ http:// localhost:8888 / tutorial /”。
答案 3 :(得分:0)
对我来说,这是 docker swarm 模式入口网络的问题。我不得不重新创建它。 https://docs.docker.com/network/overlay/#customize-the-default-ingress-network
答案 4 :(得分:0)
我在使用 Dockerize GatsbyJS 时遇到了同样的问题。正如上面Tarun Lalwani的评论,我通过绑定或使用0.0.0.0
作为主机名
yarn develop -P 0.0.0.0 -p 8000