首页 > 解决方案 > 如何从 docker 容器发送 http 请求到本地机器?

问题描述

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

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

我试图给你一些更多的细节。我看了这篇文章,但它对我不起作用。
首先,我想解释一下我的项目结构: 1. 我有一个项目,它由两部分组成:前端(angular 9)和后端(play 2.8.x 框架) 2. 我还有另一个项目(web-service)

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

标签: javadockerplayframeworknetty

解决方案


您不能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


推荐阅读