来自docker container

时间:2017-09-12 19:40:32

标签: windows bash docker docker-compose

我一直试图在最后几个小时解决这个问题,但我被困住了。

我有一个非常简单的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

但是没有成功。

5 个答案:

答案 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