Java 对Dockers中的端点进行REST调用
我正在构建一个Spring引导应用程序,它有几个不同的REST端点。它可以在本地打包并作为jar文件成功启动。在本地运行时,我可以通过“.”访问其端点。我现在的任务是准备这个应用程序,以应对码头工人的流失。我仍然在本地机器上工作,基于Java:8图像创建了一个Dockers容器。在这个容器中,我已经能够成功地从.jar运行我的应用程序。我的问题是,当应用程序托管在Docker之外时,我不理解如何调用应用程序内部的REST端点,因为逻辑上localhost:8080/endpoint不再响应调用 旁白:我的本地计算机是Windows,Docker映像是Ubuntu(最终将被启动到Linux服务器上) 更新:使用以下Dockerfile创建了一个新映像:Java 对Dockers中的端点进行REST调用,java,rest,docker,spring-boot,Java,Rest,Docker,Spring Boot,我正在构建一个Spring引导应用程序,它有几个不同的REST端点。它可以在本地打包并作为jar文件成功启动。在本地运行时,我可以通过“.”访问其端点。我现在的任务是准备这个应用程序,以应对码头工人的流失。我仍然在本地机器上工作,基于Java:8图像创建了一个Dockers容器。在这个容器中,我已经能够成功地从.jar运行我的应用程序。我的问题是,当应用程序托管在Docker之外时,我不理解如何调用应用程序内部的REST端点,因为逻辑上localhost:8080/endpoint不再响应调用
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"]
同样的问题,无法通过访问终结点
任何帮助都将不胜感激。谢谢大家! 如果您的应用程序在Docker容器内运行,并且您可以使用localhost:8080从此容器内访问,那么您所要做的就是在Docker文件中添加EXPOSE指令(请参阅) 然后,您可能可以使用docker0网络接口中的默认IP从主机(安装并运行Docker的地方)进行访问。一般来说,这个IP是172.17.0.X,其中,对于第一个容器,X是2,依此类推(请参阅)
因此,尝试使用“.”从docker外部访问。此外,如果要允许外部访问(或从主机使用localhost进行访问),则应使用-p参数从EXPOSE指令启动容器映射端口(请参阅)。您需要发布端口(而不是
EXPOSE
它)。公开端口主要用于链接和服务上下文。在您刚刚运行Docker容器的示例中,您只需发布端口,使其可从主机获得。您可以使用--publish
或-p
执行此操作:
docker run -d --name myapp -p 8080:8080 myappimage
然后,您可以在主机IP地址的端口8080访问应用程序(Windows上的Docker和Mac上的Docker运行一个代理,该代理应允许
localhost:8080
工作) 您是否在Dockerfile中执行了类似于暴露8080的操作?@Gregg我没有创建图像,因此我不确定Dockerfile包含什么内容。我在这里遵循了教程:其中解释了如何运行命令“docker pull java:8”,如何测试是否可以从容器中访问它?一旦我在容器中运行jar(应用程序),我就不能运行其他命令,因为jar的运行将接管命令行。因此,我无法尝试运行一个命令来访问localhost:8080/endpoint,因此我不知道如何在后台测试这个应用程序:java-jar application.jar>log.txt 2>&1&
。然后您可以使用“curl”或“wget”访问您的服务这并不是EXPOSE
真正的工作方式。明白了,我明白了。事实上,我从未试图在未公开端口的情况下发布。但在他的例子中,他可能公开了端口(因为它在教程中),他可以尝试使用docker0 ip访问,而无需发布…如果我运行命令:“docker run-d--name someName-p 8080:8080 imageName”,它将返回一个看似随机字符的长字符串,即“a3431a0089937d5fc”等等。对于另外30个字符左右,然后命令行返回,让我编写另一个命令。似乎出乎意料。知道它在做什么吗?这个长字符串就是容器ID。在我的示例中,我使用了-d
,它在后台运行容器。您应该能够使用docker ps
(或者docker ps-a
查看它,如果它没有运行)。您可以使用docker stop
和docker rm
将其删除。然后,如果删除-d
,它将在前台运行。它现在可以工作了!我需要它在前台运行,以便导航到jar并运行它。现在我可以/拥有了,我可以像平常一样通过localhost调用端点。非常感谢。还有一个问题。我在localhost:3308上有一个本地Maria DB,该数据库由应用程序调用。现在,这在Dockers中运行,连接被拒绝。知道为什么吗?localhost
现在是容器的本地IP,而不是主机。您需要连接到主机IP或Docker网桥IP(通常为172.17.42.1
)。
docker run -d --name myapp -p 8080:8080 myappimage