【问题标题】:Making a REST Call to Endpoint in Dockers在 Docker 中对端点进行 REST 调用
【发布时间】:2017-11-30 18:23:24
【问题描述】:

我正在构建一个 Spring Boot 应用程序,它有几个不同的 REST 端点。它可以在本地打包并成功作为jar文件启动。在本地运行时,我可以通过“http://localhost:8080/endpoint?params..”访问其端点。我现在的任务是准备这个应用程序以从 Docker 上运行。仍然在我的本地机器上工作,我已经创建了一个基于 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访问端点

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

【问题讨论】:

  • 你是否在 Dockerfile 中做了类似EXPOSE 8080 的操作?
  • @Gregg 我没有创建图像,因此我不确定 Dockerfile 包含什么。我在这里按照教程进行操作:octoperf.com/blog/2016/02/11/small-java-docker-images 解释了运行命令“docker pull java:8”

标签: java rest docker spring-boot


【解决方案1】:

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

EXPOSE 8080

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

所以尝试使用“http://172.17.0.2:8080/endpoint?params..”从 docker 外部访问。此外,如果您想允许外部访问(或从主机使用 localhost 访问),您应该使用 -p 参数从 EXPOSE 指令映射端口(请参阅Mapping Exposed Incoming Ports)。

【讨论】:

  • 如何测试是否可以从容器内访问它?一旦我在容器中运行 jar(应用程序),我就无法运行其他命令,因为 jar 的运行将接管命令行。因此,我无法尝试运行命令来访问 localhost:8080/endpoint,所以我不知道如何测试这个
  • 在后台启动您的应用程序:java -jar application.jar > log.txt 2>&1 & 。然后你可以使用“curl”或“wget”来访问你的服务
  • EXPOSE 的工作原理并非如此。见stackoverflow.com/questions/22111060/…
  • 我明白了。实际上,我从来没有尝试在不公开端口的情况下发布。但在他的情况下,他可能会暴露端口(因为它在教程中),他可以尝试使用 docker0 ip 访问而无需发布......
【解决方案2】:

您需要发布端口(不是EXPOSE 它)。暴露端口主要用于链接和服务上下文。在您仅运行 Docker 容器的示例中,您需要简单地发布端口,以便它可以从主机获得。您可以使用--publish-p 来执行此操作:

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

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

【讨论】:

  • 如果我运行命令:“docker run -d --name someName -p 8080:8080 imageName”它会返回一长串看似随机的字符,例如“a3431a0089937d5fc”等。 30个字符左右,然后命令行返回让我写另一个命令。似乎出乎意料。知道它在做什么吗?
  • 那个长字符串就是容器ID。在我的示例中,我使用了-d,它在后台运行容器。您应该能够通过docker ps(或docker ps -a,如果它没有运行)看到它。您可以使用docker stop <container_id>docker rm <container_id> 将其删除。然后,如果您删除 -d,它将改为在前台运行。
  • 现在可以使用了!我需要它在前台运行以导航到 jar 并运行它。现在我可以/拥有了,我可以像往常一样通过 localhost 调用端点。谢谢!
  • 还有一个问题。我在 localhost:3308 有一个本地 Maria DB,由应用程序调用。现在它在 Dockers 中运行,连接被拒绝。知道为什么吗?
  • localhost 现在是容器的本地 IP,而不是主机。您需要连接到主机 IP 或 Docker 网桥 IP(通常为 172.17.42.1)。
猜你喜欢
  • 1970-01-01
  • 2021-05-15
  • 2018-11-24
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
相关资源
最近更新 更多