关于java:在Dockers中对端点进行REST调用

Making a REST Call to Endpoint in Dockers

我正在构建一个Spring引导应用程序,它有几个不同的REST端点。它可以在本地打包并作为JAR文件成功启动。在本地运行时,我可以通过"http://localhost:8080/endpoint"访问其端点。帕拉姆…我现在的任务是准备这个应用程序,以摆脱码头工人。仍然在我的本地机器上工作,我创建了一个基于Java:8图像的坞箱。在这个容器中,我已经能够成功地从.jar运行我的应用程序。我的问题是,当应用程序托管在Docker之外时,我不理解如何调用应用程序内的其余端点,因为逻辑上localhost:8080/endpoint不再响应调用。

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

更新:使用以下dockerfile创建新图像:

1
2
3
4
5
6
7
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访问端点

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


您需要发布端口(不是EXPOSE端口)。公开端口主要用于链接和服务上下文。在运行Docker容器的示例中,您只需发布端口即可从主机获得该端口。你用--publish-p做这个:

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

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


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

1
EXPOSE 8080

然后,您可能能够使用Docker0网络接口的默认IP从主机(安装和运行Docker的地方)访问。通常,这个IP是172.17.0.x,其中x是第一个容器的2,依此类推(参见Docker默认网络)。

因此,尝试使用"http://172.17.0.2:8080/endpoint"从Docker外部访问?帕拉姆…此外,如果要允许外部访问(或从主机使用localhost访问),则应使用-p参数从expose指令启动容器映射端口(请参见映射暴露的传入端口)。