Java 对Dockers中的端点进行REST调用

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不再响应调用

我正在构建一个Spring引导应用程序,它有几个不同的REST端点。它可以在本地打包并作为jar文件成功启动。在本地运行时,我可以通过“.”访问其端点。我现在的任务是准备这个应用程序,以应对码头工人的流失。我仍然在本地机器上工作,基于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"]
同样的问题,无法通过访问终结点


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

如果您的应用程序在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