带有Tomcat + Spring-Boot和配置共享机制的Docker基础映像

时间:2019-03-09 17:23:07

标签: spring-boot docker

我是一位寻求想法的码头工人。

对于一个需要将tomcat用作应用服务器的用例,在其顶部添加自定义的spring-boot代码并将其设置为容器。我应该使用多阶段docker构建机制来做到这一点吗?

可以有一个基本的tomcat映像,然后在其顶部弹出启动映像。或者只是将spring boot代码放入tomcat映像并在容器中使用它?

我也有一些用例,其中弹簧引导代码必须连接到外部数据库(外部映像),并且由于我希望集中管理连接,因此想知道具有连接池策略的最佳方法。

两种思想流派- 首先是使用docker卷,因为我不希望团队每次使用设置的配置参数/环境变量? 其次-每个Docker容器都有连接池,因此连接总数除以容器运行情况(这很危险,因为使用Kubernetes会进行自动缩放)

1 个答案:

答案 0 :(得分:1)

您在这里有很多问题-我将从最核心的问题开始。

在docker容器中部署Spring Boot应用程序

如果您正在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,它会详细进入流程并概述您的选项。

Spring Boot应用程序的多阶段docker构建?

我要说的是,几乎没有必要这样做。我将在此处勾勒出一些常见方案:

  • 在您的开发机上构建胖子,然后在此处也构建映像。将映像推送到注册表并从那里进行部署。
  • 使用docker映像在本地构建应用程序,然后在本地构建应用程序映像,推送到注册表并部署。
  • 如果您使用Jenkins,GitLab或其他某种机制来构建映像,则他们将负责在同一管道中构建应用程序和最终docker映像。不需要多阶段构建。

除非您有特定的要求,使您的应用程序映像基于其他映像,否则我无法识别。

从Spring Boot应用程序连接到多个数据库

这基本上没有问题。尽管仅将外部内容链接到答案中被认为是可疑的做法,但我将在此处进行。选中this article from Baeldung on multiple databases

我不确定您的意思是要集中管理连接吗?您是否需要在Spring Boot应用程序上下文之外管理数据库连接?在我看来,至少在处理Spring Boot时,这是一种过时的思想。

但是,如果您要处理连接到同一数据库的多个Spring Boot应用程序,则应考虑使用分布式缓存设置。像HazelcastInfinispanMemcached

在Spring Boot应用程序容器中绑定docker卷以进行配置

好吧,我想我理解您在这里所说的。通常,将配置注入到Docker容器以及Spring Boot应用程序中的首选模式是使用环境变量。或Spring Cloud配置。这里的环境变量特别好,因为可以使用它们对容器进行参数化,并且可以在Spring Boot应用程序加载的属性文件中直接使用它们。并直接在您的@Value带注释的字段中找到它们。

但是,对于微服务设置来说,它会不时地产生新的服务实例,并且需要找到它们的配置-我建议您研究Spring Cloud config

使用Spring Cloud cofig,您实际上是在设置中引入一项新服务,该服务负责托管服务的配置。该服务本身是一个Docker容器和一个Spring Boot应用程序。而且,您的其他Spring Boot应用程序将可以轻松使用它。

因此,基本上我建议不要通过将配置安装到Docker卷中的容器中来开始搞混注入配置。

我希望我已经解决了您所有的问题?否则请在评论中让我知道。