【问题标题】:Cannot access app in Docker container from outside无法从外部访问 Docker 容器中的应用程序
【发布时间】:2015-11-22 03:32:08
【问题描述】:
docker pull kovacshuni/riptube:1.0.0-SNAPSHOT
docker run -it -P --name="riptube" kovacshuni/riptube:1.0.0-SNAPSHOT
bin/riptube &
curl -X POST -d "Hi there" localhost:8082/notify
INFO 15:55:06 c.h.r.NotificationReceiver$ - Hi there

所以这行得通。但是从外部,从 docker 守护进程的主机来看,它没有。尽管有 EXPOSE 命令和 -P 参数。

docker port riptube 8082
0.0.0.0:32785
curl -X POST -d "Hi there" localhost:32785/notify
curl: (52) Empty reply from server

为什么? :( :(

源代码here。 Dockerfile 也是如此,但粘贴在下面:

 FROM frolvlad/alpine-oraclejdk8

 RUN apk add --update bash py-pip ca-certificates curl
 RUN rm -rf /var/cache/apk/*
 RUN pip install youtube-dl

 WORKDIR /opt/riptube
 ADD target/pack/ /opt/riptube
 EXPOSE 8082
 ENTRYPOINT /bin/bash
 CMD

【问题讨论】:

  • 您似乎将您的服务器绑定到github.com/kovacshuni/riptube/blob/question/src/main/scala/com/… 中的8080 端口。您是否在某处将暴露的端口 8082 和绑定的端口 8080 关联起来?
  • 我的主要应用是 RipTube,但这需要复杂的设置。对于这个问题,我主要在 NotificationReceiver 中,我绑定到 8082。所以不是这样。还有比较:从 docker 容器内部,curl 工作到 8082,从外部没有。

标签: docker sbt port akka-http


【解决方案1】:

我遇到了同样的问题:

替换这个:

private val httpBindingF = Http().bindAndHandle(ripController.route, "localhost", 8080)

用这个:

private val httpBindingF = Http().bindAndHandle(ripController.route, "0.0.0.0", 8080)

令人惊讶的是,它对我有用!

【讨论】:

  • 感谢您的提示,我会尝试一下。
  • 这是正确答案。在大多数系统中,localhost 被硬编码为 127.0.0.1
【解决方案2】:

假设你不在Linux机器上,我猜你必须在vm中转发你的端口:

$ VBoxManage controlvm "name-of-your-vm" natpf1 "tcp-port8082,tcp,,8082,,8082"

【讨论】:

  • 我知道,但我也在 linux 机器上试过这个。同样在 Mac 上,我首先通过 SSH 连接到 docker deamon VM,即使从那里我也无法访问该应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
相关资源
最近更新 更多