如何部署 Maven 多模块 spring 启动到 docker 容器

How to deploy maven multi-module spring boot to docker container

我正在设置一个多模块 Maven 项目并尝试将其部署到 docker 一个典型的 3 层项目,并为 MYSQL 数据库提供一个单独的容器。

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

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

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

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

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

编排。

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

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

可能仍然有很好的理由将您的单体应用程序容器化。也许它具有复杂的 OS 依赖项 and/or 您希望将其部署到 AWS Fargate 或 gCloud 等 PAAS。

您可能仍想使用 docker-compose,将 mysql 部署到与您的 Web 应用程序一起的容器中。

同意罗伯特的观点,在大多数情况下,每个 jar/module 等于单个 Docker 图像(因此是容器)。

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

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

我认为您正在尝试将您的多模块 Maven 项目 docker 化。

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

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