无法使用 Spring Boot 应用程序连接到 Docker 映像

Posted

技术标签:

【中文标题】无法使用 Spring Boot 应用程序连接到 Docker 映像【英文标题】:Not able to connect to docker image with a spring boot application 【发布时间】:2019-08-28 22:49:11 【问题描述】:

Dockerfile

FROM openjdk:8 
ADD target/docker-spring-boot.jar docker-spring-boot.jar
EXPOSE 8085
ENTRYPOINT ["java","-jar","docker-spring-boot.jar"]

构建 docker 的命令

docker build -f Dockerfile -t docker-spring-boot .

spring boot jar 位置如下。

target/docker-spring-boot.jar

运行docker的命令

docker run -p 8085:8085 docker-spring-boot

应用程序在没有 docker 的情况下正常工作。无法在 docker 上运行应用程序。

错误:

This site can’t be reached

docker 运行日志

 E:\micorservices_samples\docker-spring-boot\docker-springbootdocker run -p 8085 :8085 docker-spring-boot

   .   ____          _            __ _ _  /\\ / ___'_ __ _ _(_)_ __  __
 _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )   '  |____| .__|_| |_|_| |_\__, | / / / / 
 =========|_|==============|___/=/_/_/_/  :: Spring Boot ::        (v2.1.4.RELEASE)

 2019-04-07 18:29:47.944  INFO 1 --- [           main]
 c.r.d.DockerSpringbootAppl ication        : Starting
 DockerSpringbootApplication v0.0.1-SNAPSHOT on 352ac4d 12009 with PID
 1 (/docker-spring-boot.jar started by root in /) 2019-04-07
 18:29:47.970  INFO 1 --- [main] c.r.d.DockerSpringbootAppl
 ication        : No active profile set, falling back to default
 profiles: defaul t 2019-04-07 18:29:54.302  INFO 1 --- [          
 main] o.s.b.w.embedded.tomcat.To mcatWebServer  : Tomcat initialized
 with port(s): 8085 (http) 2019-04-07 18:29:54.463  INFO 1 --- [       
 main] o.apache.catalina.core.Sta ndardService   : Starting service
 [Tomcat] 2019-04-07 18:29:54.464  INFO 1 --- [           main]
 org.apache.catalina.core.S tandardEngine  : Starting Servlet engine:
 [Apache Tomcat/9.0.17] 2019-04-07 18:29:54.854  INFO 1 --- [          
 main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring
 embedded WebApplicationContext 2019-04-07 18:29:54.855  INFO 1 --- [  
 main] o.s.web.context.ContextLoa der            : Root
 WebApplicationContext: initialization completed in 6539 ms 2019-04-07
 18:29:55.859  INFO 1 --- [main] o.s.s.concurrent.ThreadPoo
 lTaskExecutor  : Initializing ExecutorService
 'applicationTaskExecutor' 2019-04-07 18:29:56.691  INFO 1 --- [       
 main] o.s.b.w.embedded.tomcat.To mcatWebServer  : Tomcat started on
 port(s): 8085 (http) with context path '' 2019-04-07 18:29:56.705 
 INFO 1 --- [main] c.r.d.DockerSpringbootAppl ication       
 : Started DockerSpringbootApplication in 10.902 seconds (JVM runn ing
 for 12.566)



 C:\Users\Mabeldocker logs -f 20026c6c7602

   .   ____          _            __ _ _  /\\ / ___'_ __ _ _(_)_ __  __
 _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )   '  |____| .__|_| |_|_| |_\__, | / / / / 
 =========|_|==============|___/=/_/_/_/  :: Spring Boot ::        (v2.1.4.RELEASE)

 2019-04-07 18:51:23.381  INFO 1 --- [           main]
 c.r.d.DockerSpringbootAppl ication        : Starting
 DockerSpringbootApplication v0.0.1-SNAPSHOT on 20026c6 c7602 with PID
 1 (/dsb.jar started by root in /) 2019-04-07 18:51:23.403  INFO 1 ---
 [           main] c.r.d.DockerSpringbootAppl ication        : No
 active profile set, falling back to default profiles: defaul t
 2019-04-07 18:51:29.434  INFO 1 --- [main]
 o.s.b.w.embedded.tomcat.To mcatWebServer  : Tomcat initialized with
 port(s): 8085 (http) 2019-04-07 18:51:29.608  INFO 1 --- [          
 main] o.apache.catalina.core.Sta ndardService   : Starting service
 [Tomcat] 2019-04-07 18:51:29.613  INFO 1 --- [           main]
 org.apache.catalina.core.S tandardEngine  : Starting Servlet engine:
 [Apache Tomcat/9.0.17] 2019-04-07 18:51:30.012  INFO 1 --- [          
 main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring
 embedded WebApplicationContext 2019-04-07 18:51:30.014  INFO 1 --- [  
 main] o.s.web.context.ContextLoa der            : Root
 WebApplicationContext: initialization completed in 6275 ms 2019-04-07
 18:51:31.038  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoo
 lTaskExecutor  : Initializing ExecutorService
 'applicationTaskExecutor' 2019-04-07 18:51:31.879  INFO 1 --- [       
 main] o.s.b.w.embedded.tomcat.To mcatWebServer  : Tomcat started on
 port(s): 8085 (http) with context path '' 2019-04-07 18:51:31.895 
 INFO 1 --- [           main] c.r.d.DockerSpringbootAppl ication       
 : Started DockerSpringbootApplication in 10.631 seconds (JVM runn ing
 for 12.241)

Github 链接 https://github.com/robert07ravikumar/spring-boot-docker

【问题讨论】:

您能否提供更多的日志输出。根据日志,您的应用正在运行,但是当您点击 API 时发生了什么? 使用docker run -d -p 8085:8085 image-name 启动您的应用程序,然后发布docker logs -f container_id 的输出 添加了 docker 日志 您如何运行 docker(Mac、Windows、Linux 主机、docker 工具箱)?并包含echo $DOCKER_HOST 的值。 $ echo $DOCKER_HOST tcp://192.168.99.100:2376 .在 windows 7 和 docker 工具箱上运行 docker。 【参考方案1】:

您的应用程序看起来不错,并且您似乎可以根据您的评论使用本地主机从容器内访问它

root@a6664e1d3b83:/# curl localhost:8085/rest/docker/hello1 
Greetings
root@a6664e1d3b83:/# . I am able to get the response from the curl url 

这可能是因为 Spring Boot 默认绑定到 localhost (127.0.0.1)。您需要添加以下属性以绑定到所有主机(或指定要绑定的 IP):

server.address=0.0.0.0 # Bind all

在你的application.properties

参见this post 和Spring Boot Common Properties

【讨论】:

【参考方案2】:

我尝试的 URL 是 localhost127.0.0.10.0.0.0 等。

一旦我运行了 docker 主机 URL,应用程序就可以工作了:

http://192.168.99.100:8085/rest/docker/hello1

【讨论】:

【参考方案3】:

我可以使用 docker 运行 spring boot 应用程序,如下 dockerfile :

FROM maven:3-alpine AS build-project
ADD . ./docker-spring-boot
WORKDIR /docker-spring-boot
RUN mvn clean install

FROM openjdk:8-jre-alpine
EXPOSE 8080
WORKDIR /app
COPY --from=build-project ./docker-spring-boot/target/docker-spring-boot-*.jar ./docker-spring-boot.jar
CMD ["java", "-jar", "docker-spring-boot.jar"]

对于运行命令:

docker build -t docker-spring-boot .
docker run -it -d -p 8080:8080 docker-spring-boot

您需要将 docker-spring-boot 替换为构建后位于目标中的 jar 文件名。

【讨论】:

请检查我的代码并找出我犯的错误 我的 jar 名称是 docker-spring-boot.jar 你能进入你的容器并发送一个 curl 请求来验证你的应用程序在容器内正确运行吗? docker exec -it containerId /bin/bash && curl http://localhost:8085 root@a6664e1d3b83:/# curl localhost:8085/rest/docker/hello1 Greetingsroot@a6664e1d3b83:/# 。我能够从 curl url 获得响应。 @RestController 当您看到“问候”时,您的应用程序会返回响应。您是否尝试从主机发送请求?你看到了什么错误?【参考方案4】:

您的代码在任何 UNIX 机器上运行良好,问题与 Windows 版本的 Docker 网络有关。默认情况下,运行 docker 时使用 bridge 网络,如果未指定其他网络,但在 Windows 中 Docker 网络以不同的方式工作,您可以查看链接 here 以获取有关该问题的更多详细信息。这是一个已知的错误,但希望 Docker 团队有一天会解决。

Elton Stoneman 在他的博客中也会对这个问题给你一个更好的解释,见下面link。

【讨论】:

【参考方案5】:

它对我有用。这里我使用的是 docker Quick start terminal (Oracle Virtual Box)。我试图通过在快速启动终端中使用“docker-machine ip”命令来查找什么是容器 IP。它给了我像 192.168.99.100 这样的 ip。所以然后在浏览器中我输入了http://192.168.99.100:8080/hello1 之类的网址,它给了我预期的结果。所以首先尝试使用 docker-machine ip 命令获取 ip。

【讨论】:

【参考方案6】:

希望这可以帮助某人避免我刚刚忍受的:意识到我已经用server.port: 8049 更新了我的application.properties / yml,但我的docker-compose 文件映射了端口- '8049:8080'。在 IDE 中工作正常,但尝试远程登录到连接的 docker 容器,然后立即关闭连接。我将把我浪费在试图追查这件事上的小时数带到坟墓里……

【讨论】:

以上是关于无法使用 Spring Boot 应用程序连接到 Docker 映像的主要内容,如果未能解决你的问题,请参考以下文章

无法将 Spring Boot 应用程序连接到 IBM Informix 数据库

Docker 上的 Spring Boot 无法连接到 MySQL

docker-compose spring boot无法连接到Postgres [重复]

无法在 Spring Boot 应用程序中连接到 MongoDB

Spring Boot Docker Container 无法连接到托管在 Docker 主机上的 postgresql

无法将mysql连接到spring boot项目