我是一位寻求想法的码头工人。
对于一个需要将tomcat用作应用服务器的用例,在其顶部添加自定义的spring-boot代码并将其设置为容器。我应该使用多阶段docker构建机制来做到这一点吗?
可以有一个基本的tomcat映像,然后在其顶部弹出启动映像。或者只是将spring boot代码放入tomcat映像并在容器中使用它?
我也有一些用例,其中弹簧引导代码必须连接到外部数据库(外部映像),并且由于我希望集中管理连接,因此想知道具有连接池策略的最佳方法。
两种思想流派- 首先是使用docker卷,因为我不希望团队每次使用设置的配置参数/环境变量? 其次-每个Docker容器都有连接池,因此连接总数除以容器运行情况(这很危险,因为使用Kubernetes会进行自动缩放)
答案 0 :(得分:1)
您在这里有很多问题-我将从最核心的问题开始。
如果您正在docker容器中部署Spring Boot应用程序,那么实际上就不需要使用tomcat
映像。您只需要在映像中提供一个Java运行时环境,因为使用Spring Boot可以将Web服务器嵌入到胖的.jar中。
您应该在项目中使用spring-boot-starter-web
,这将嵌入Web服务器:
带有spring-boot-starter-web
- 2.1.3.RELEASE
在您的pom.xml中添加此依赖项(让spring通过顺便管理这些依赖项,这只是我在这里链接的最新内容):
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
有了这个,您的Dockerfile将变得更加简单:
Dockerfile
FROM openjdk:8-jdk-alpine
COPY build/libs/myfatjar.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
选中this guide from spring.io,它会详细进入流程并概述您的选项。
我要说的是,几乎没有必要这样做。我将在此处勾勒出一些常见方案:
除非您有特定的要求,使您的应用程序映像基于其他映像,否则我无法识别。
这基本上没有问题。尽管仅将外部内容链接到答案中被认为是可疑的做法,但我将在此处进行。选中this article from Baeldung on multiple databases。
我不确定您的意思是要集中管理连接吗?您是否需要在Spring Boot应用程序上下文之外管理数据库连接?在我看来,至少在处理Spring Boot时,这是一种过时的思想。
但是,如果您要处理连接到同一数据库的多个Spring Boot应用程序,则应考虑使用分布式缓存设置。像Hazelcast,Infinispan或Memcached。
好吧,我想我理解您在这里所说的。通常,将配置注入到Docker容器以及Spring Boot应用程序中的首选模式是使用环境变量。或Spring Cloud配置。这里的环境变量特别好,因为可以使用它们对容器进行参数化,并且可以在Spring Boot应用程序加载的属性文件中直接使用它们。并直接在您的@Value
带注释的字段中找到它们。
但是,对于微服务设置来说,它会不时地产生新的服务实例,并且需要找到它们的配置-我建议您研究Spring Cloud config。
使用Spring Cloud cofig,您实际上是在设置中引入一项新服务,该服务负责托管服务的配置。该服务本身是一个Docker容器和一个Spring Boot应用程序。而且,您的其他Spring Boot应用程序将可以轻松使用它。
因此,基本上我建议不要通过将配置安装到Docker卷中的容器中来开始搞混注入配置。
我希望我已经解决了您所有的问题?否则请在评论中让我知道。