【问题标题】:How to send http request from docker container to the local machine? [duplicate]如何从 docker 容器发送 http 请求到本地机器? [复制]
【发布时间】:2020-08-22 22:49:08
【问题描述】:

我有一个在 docker 容器上运行的 Web 应用程序,该应用程序必须向我的本地计算机 (localhost) 发送请求,当我尝试这样做时,出现以下异常:

java.util.concurrent.ExecutionException: java.net.ConnectException: Connection refused: localhost/127.0.0.1:9033

我正在尝试为您提供更多详细信息。我看了这个post,但它对我不起作用。
首先,我想解释一下我的项目的结构: 1.我有一个项目,由两部分组成:前端(angular 9)和后端(玩 2.8.x 框架) 2.我还有一个项目(web-service)

我的第一个项目(后端、前端)放置在 docker 容器中,第二个项目(网络服务)放置在 localhost 中。我在这些项目之间有以下流程:
1.用户向后端发送请求(从网络浏览器),例如可能是登录请求。
2. 后端处理此请求(从数据库中检索数据)并将这些数据发送到放置在本地主机上的 Web 服务。
我在尝试将数据发送到 Web 服务的第 2 步时遇到问题。我得到了上面写的异常。
我正在尝试设置--network=host,但在这种情况下,我在浏览器中得到404 status code。 我该如何解决这个问题?

【问题讨论】:

  • 你是否使用了 --network="host" 标志?
  • @VM4 不,我不使用这个标志
  • 试试看。这很好解释:stackoverflow.com/questions/24319662/…
  • 感谢所有人,但这种方法对我不起作用。当我使用--network=host 时,我无法在浏览器中获取任何内容,当我输入http://localhost:4200 时,我找不到页面。我正在尝试编辑我的问题并向您提供更多详细信息。

标签: java docker playframework netty


【解决方案1】:

您不能在容器内执行对localhost 的请求,因为从容器的角度来看,localhost 不是主机(docker 运行的地方),而是容器本身。

如果9033是你的服务器在你的机器上监听的端口,你可以在运行容器的时候通过

docker run --expose 9033 containerName

然后,如果没有对容器应用自定义网络配置,则默认网关(使用 ip route show | grep 'default' | awk '{print $3}' 看到)对应于您应该连接到的 IP。

我在主机的端口9000 上运行了一个简单的 Python HTTP 服务器来尝试这个。

来自主机内部:python3 -m http.server 9000

从容器中:

export IP=$(ip route show | grep 'default' | awk '{print $3}')
curl -k -I -X GET "${IP}:9000"

HTTP/1.0 200 OK

【讨论】:

  • docker run --expose 对这种情况没有任何作用。 (它在 Docker 容器间通信的过时模式中很有用,并命名容器内的服务器正在侦听的端口;现代 Docker 几乎不做任何事情,它的端口号不是主机端口。)跨度>
  • 您提到,“如果没有将自定义网络配置应用于容器。”如果应用了自定义网络配置怎么办?在这种情况下,有没有办法连接到主机上运行的服务器?
猜你喜欢
  • 2023-02-07
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
相关资源
最近更新 更多