如何将maven多模块spring boot部署到docker容器

Posted

技术标签:

【中文标题】如何将maven多模块spring boot部署到docker容器【英文标题】:How to deploy maven multi-module spring boot to docker container 【发布时间】:2019-12-10 14:33:16 【问题描述】:

我正在设置一个多模块 maven 项目,并尝试将其部署到一个典型的 3 层项目中,该项目带有一个单独的容器用于 mysql DB。

我一直在网上做这样的研究,我遇到了docker-compose一个概念,如果我对配置YAML文件理解正确,你可以将每个jar文件部署到不同的容器中并使它们一起工作, ¿ 这是我的唯一方法吗?

我可以从 3 个模块中仅构建一个 jar 文件并将其部署到容器中吗? 就我而言,我不需要将每个项目视为单独的微服务。 另一方面,我需要 docker compose,因为除了我的 spring boot 项目之外,您还需要运行一个带有 MYSQL DB 的容器并将其连接到 spring-boot

我不确定如何处理这种情况,提前感谢您的任何建议。

【问题讨论】:

你的 web 模块不依赖于其他模块吗?有单独的 api 模块吗?我认为您需要更多地介绍您的架构。 是的,web 依赖于 Domain 和 Domain 依赖于 Persistence 是的,它们是分开的,每个项目都是一个单独的模块,代表一个层 【参考方案1】:

不要将应用程序中的 n 层与微服务架构混淆。

微服务是独立的部署单元,它们之间通过某种协议(http、消息总线等)进行通信。调用进程中的函数(从一个 jar 到另一个)不是这样,因此您的各个 maven 模块不适合放入容器中并由 docker-compose 编排。

如果您的 Web 应用程序通过例如 restful api 与域层通信,那么您可以使用 docker compose 来启动两个单独的容器。

但是,如果您的“api”很可能由 Web 应用程序中的控制器处理,对您的域层进行进程内调用,那么您只需创建和部署一个容器。

仍然有充分的理由将您的单体应用程序容器化。也许它具有复杂的操作系统依赖关系和/或您希望将其部署到像 AWS Fargate 或 gCloud 这样的 PAAS。

您可能还想使用 docker-compose,将 mysql 部署在 Web 应用旁边的容器中。

【讨论】:

如果我理解正确,你有 3 个罐子这一事实并不意味着你必须单独部署它们?该应用程序只是一个 Spring rest-api 没什么大不了的,所以你建议只要我在它们之间有依赖关系,如果我只部署 web 模块就可以了吗?正如您所说,通过将持久性链接到域层和将 Web 链接到域层的 maven 设置依赖项 是的。容器不是让 jar 相互通信的解决方案! 感谢您对概念的澄清,我将尝试部署 web 模块,看看会发生什么 另一方面,我可以在 docker 文件中包含 maven 并在容器中构建项目【参考方案2】:

同意 Robert 的观点,在大多数情况下,每个 jar/模块等于单个 Docker 映像(因此容器)。

我想补充一点,每个启动应用程序(即每个具有 main 方法的类)都可能最终位于其自己的容器中(并非总是如此,但这是一个很好的经验法则)。这是因为每个 Docker 镜像都可以有一个入口点,这实际上只是启动容器的命令。因此,您创建的每个 main 方法都可以放入自己的容器中,因为 java 命令在启动时只能执行一个 main 方法。

Docker Compose 非常适合自动启动容器,但它只是可以做到这一点的众多工具之一(docker swarm、rancher 和 kubernetes 是您可以查看的其他工具)。但是请记住,这些是其他重型、生产质量服务,对于简单的开发或测试设置可能会过度杀伤。 Docker Compose 非常适合不需要自动扩展、容错、复杂的安全策略、机密管理等的情况。

【讨论】:

【参考方案3】:

我认为您正在尝试对您的多模块 maven 项目进行 docker 化。

在这种情况下,您需要从包含您的引导应用程序@SpringBootApplication(例如 web)的模块中对接您的 fat Jar,而不是来自不同模块的所有 jar 文件。它们将作为内部依赖项自动包含在您的主模块(例如 web)中。

您可以在Optimized docker images for Spring Boot applications with layering feature 的末尾找到与如何 dockerize 多模块项目相关的部分。

【讨论】:

以上是关于如何将maven多模块spring boot部署到docker容器的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Spring Boot 项目集成到已经存在的多模块 Maven 项目中?

如何在我的 Maven Spring Boot 多模块项目的测试中引用兄弟模块?

如何正确设置 Maven Spring Boot 多模块项目?

带有 Spring Data 的 Spring Boot Maven 多模块项目

Spring Boot 多模块与 Maven 私有仓库

Maven 搭建spring boot多模块项目