无法加载在 Docker 中运行的 Spring Boot 应用程序

Posted

技术标签:

【中文标题】无法加载在 Docker 中运行的 Spring Boot 应用程序【英文标题】:Unable to load Spring Boot application running in Docker 【发布时间】:2020-03-15 11:33:04 【问题描述】:

我使用 Gradle v5.6.4 创建了一个简单的 Spring Boot v2.1.10 应用程序,并尝试在 Docker v18.09.9 中运行它,构建 1752eb3。该应用程序在本地运行,但是当我在 Docker 中运行它时,网页不会在浏览器中加载。虽然,它在 Docker 控制台中正常启动,没有任何错误。

Dockerfile 内容

FROM java:8
EXPOSE 9090:8181
ADD /build/libs/docker-app-0.0.1-SNAPSHOT.jar docker-app-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","docker-app-0.0.1-SNAPSHOT.jar"]

Springboot 应用控制器

@RestController
public class Resource 

    @GetMapping(value = "/home")
    public String home() 
        return "<h1>up!!!.....running from docker!!!</h1>";
    

Docker 运行命令 :~/java-project/docker-app$ sudo docker run -p 9090:8181 springboot

Docker 控制台输出

:~/java-project/docker-app$ sudo docker run -p 9090:8181 springboot

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

2019-11-19 20:38:03.870  INFO 1 --- [           main] com.DockerAppApplication                 : Starting DockerAppApplication on 93febc16ff7d with PID 1 (/docker-app-0.0.1-SNAPSHOT.jar started by root in /)
2019-11-19 20:38:03.877  INFO 1 --- [           main] com.DockerAppApplication                 : No active profile set, falling back to default profiles: default
2019-11-19 20:38:06.459  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 9090 (http)
2019-11-19 20:38:06.528  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-11-19 20:38:06.528  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.27]
2019-11-19 20:38:06.669  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-11-19 20:38:06.669  INFO 1 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2642 ms
2019-11-19 20:38:07.012  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-11-19 20:38:07.333  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 9090 (http) with context path ''
2019-11-19 20:38:07.339  INFO 1 --- [           main] com.DockerAppApplication                 : Started DockerAppApplication in 4.276 seconds (JVM running for 5.029)

注意:当我在运行命令和 Dockerfile 中提供相同的端口号 (sudo docker run -p 9090:9090 springboot) 时,它可以正常工作。

docker run命令中端口号不同有什么不同?

【问题讨论】:

【参考方案1】:

TL;DR

将您的映射更改为-p 8181:9090


你弄错了。 -p 9090:8181 设置将在主机的端口 9090 上公开容器的端口 8181 — 假设该端口未使用。您可以有效地使用主机上的端口9090,但容器中的 Spring Boot 应用程序没有侦听8181,因此您不会得到任何响应。

当您执行-p 9090:9090 时,您正确地将9090 暴露在主机和容器上;同样,Spring Boot 应用程序正在有效地侦听端口 9090,因此您可以点击 Spring Boot 应用程序并获得一些东西。

无论如何,您要查找的是-p 8181:9090。这将让您在浏览器/主机中使用端口 8181 上的应用程序,而 Spring Boot 应用程序使用 9090

【讨论】:

当您的评论挽救了我的一天时,我面临着完全相同的问题。谢谢:)

以上是关于无法加载在 Docker 中运行的 Spring Boot 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 Docker 容器内运行 Spring Boot 应用程序,无法连接 MySQL

使用 MySQL 和 Docker 的 Spring Boot:IllegalStateException:无法加载驱动程序类:com.mysql.cj.jdbc.Driver

无法使用 Spring 数据源参数运行 docker 容器

Spring boot JDBC无法连接到docker容器中的mysql

Docker:图像无法运行:在 META-INF/spring.factories 中找不到自动配置类

spring-boot 无法在 docker 中启动