在 Dockers 中对终结点进行 REST 调用

2022-09-03 14:12:58

我正在构建一个Spring Boot应用程序,该应用程序具有几个不同的REST端点。它可以在本地打包并作为jar文件成功启动。在本地运行时,我可以通过“http://localhost:8080/endpoint?params..”访问其终结点。我现在的任务是准备这个应用程序以运行Dockers。我仍然在我的本地机器上工作,我已经基于Java:8映像创建了一个Dockers容器。在此容器中,我已经能够从.jar成功运行我的应用程序。我的问题是,当应用程序托管在Docker之外时,我不明白如何调用应用程序内部的REST端点,因为逻辑上localhost:8080 / endpoint不再响应调用。

附带信息:我的本地计算机是Windows,Docker映像是Ubuntu(最终将启动到Linux服务器上)。

更新:使用以下 Dockerfile 创建了一个新映像:

FROM openjdk:8
MAINTAINER  My Name email@email.com
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
EXPOSE 8080
RUN javac Main.java
CMD ["java", "Main"]

同样的问题,无法通过 http://localhost:8080/endpoint 访问端点

任何帮助将不胜感激。谢谢!


答案 1

您需要发布端口(而不是它)。公开端口主要用于链接和服务上下文。在仅运行 Docker 容器的示例中,只需发布端口即可从主机访问。您可以使用 或 执行此操作:EXPOSE--publish-p

docker run -d --name myapp -p 8080:8080 myappimage

然后,您可以在主机 IP 地址上的端口 8080 处访问应用程序(Windows 上的 Docker 和 Mac 上的 Docker 运行应该允许工作的代理)。localhost:8080


答案 2

如果您的应用程序在 Docker 容器内运行,并且您可以使用 localhost:8080 从此容器内部进行访问,那么您所要做的就是在 DOCKERFILE 中添加 EXPOSE 指令(请参阅 Dockerfile expose 选项)。

EXPOSE 8080

然后,您可能能够使用 docker0 网络接口中的默认 IP 从主机(安装并运行 Docker 的位置)进行访问。通常,此 IP 为 172.17.0.X,其中 X 为 2 表示第一个容器,依此类推(请参阅 docker 默认网络)。

因此,请尝试使用“http://172.17.0.2:8080/endpoint?params..”从docker外部访问。此外,如果要允许外部访问(或从主机使用 localhost 进行访问),则应使用 -p 参数从 EXPOSE 指令启动容器映射端口(请参阅映射公开的传入端口)。