java - 在 Java EE 应用程序的开发中使用 Docker

标签 java maven jakarta-ee jboss docker

我会加 300 分作为赏金

我最近开始仔细研究 Docker 以及如何使用它来更快地让团队的新成员在开发环境中运行,以及将新版本的软件交付到生产环境中。

我有一些关于我应该如何以及在什么阶段将 Java EE 应用程序添加到容器的问题。在我看来,有多种方法可以做到这一点。

这是 Docker 之前的典型工作流程(在我的团队中):

  1. 开发人员编写代码
  2. 开发人员使用 Maven 构建代码并生成 WAR
  3. 开发人员在 JBoss 管理控制台/或使用 Maven 插件上传 WAR

现在,在 Docker 出现之后,我有点困惑是否应该创建我需要的镜像并配置它们,以便在运行 JBoss Wildfly 容器时剩下要做的就是通过管理控制台部署应用程序在网上。或者我应该每次在 Maven 中构建应用程序时创建一个新容器,并在 Dockerfile 中使用 ADD 命令添加它,然后只运行容器而无需在启动后部署到它?

在生产中,我猜最后一种方法是它所偏爱的?如果我错了,请纠正我。 但是在开发中应该怎么做呢?还有其他工作流程吗?

最佳答案

使用最新版本的 Docker,您可以使用 Docker Links、Docker Volume 和 Docker Compose 轻松实现这一目标。来自 Docker 站点的有关这些工具的更多信息。

回到您提到的工作流程:对于任何典型的 Java EE 应用程序,都需要一个应用程序服务器和一个数据库服务器。由于您在帖子中没有提及如何设置数据库,我假设您的开发环境将为每个开发人员提供单独的数据库服务器。

考虑到所有这些,我可以建议以下工作流程:

  • 从官方镜像构建基础 Wildfly 应用服务器。您可以通过以下方式实现:“docker pull”命令
  • 运行基础应用服务器:

docker run -d -it -p 8080:8080 -p 9990:9990 --name baseWildfly jboss/wildfly

应用程序服务器现在正在运行,您需要对其进行配置以连接到您的数据库服务器,并在必要时配置数据源设置和其他配置以启动您的 Java EE 应用程序。 为此,您需要登录到 Jboss 容器的 bash 终端:

docker exec -i -t baseWildfly /bin/bash/

你现在在容器的终端。您可以像在任何 linux 环境中一样配置应用程序服务器。

您可以通过手动将 WAR 文件部署到 Wildfly 来测试配置。正如您所说,这可以使用管理控制台、maven 插件或 ADD 命令轻松完成。我通常用管理控制台来做这件事,只是为了快速测试。当您验证配置工作时,您可以删除 WAR 文件并创建容器的快照:

docker commit --change "add base settings and configurations" baseWildfly yourRepository:tag

您现在可以将创建的图像推送到您的私有(private)存储库并与您的开发团队共享。他们现在可以拉取镜像并立即运行应用服务器进行部署。

我们不想使用管理控制台为每个 Maven 构建部署 WAR 文件,因为这太麻烦了,所以下一个任务是使用 Docker Volume 自动化它。

假设您已配置 Maven 将 WAR 文件构建到“../your_project/deployments/”,您可以将其链接到 Jboss 容器的部署目录,如下所示:

docker run -d -p 8080:8080 -v ../your_project/deployments:/opt/jboss/wildfly/standalone/deployments

现在,每次您使用 Maven 重建应用程序时,应用程序服务器都会扫描更改并重新部署您的 WAR 文件。

给每个开发者单独的数据库服务器也很成问题,因为他们必须在容器中自己配置它,因为他们可能有不同的设置(例如数据库的 url、用户名、密码等)。所以,最终将其 dockerize 是件好事。

假设您使用 Postgres 作为您的数据库服务器,您可以从 postgres 官方存储库中提取它。准备好镜像后,就可以运行数据库服务器了:

docker run -d -p 5432:5432 -t --name postgresDB postgres

或使用链接的“数据”目录运行数据库服务器:

docker run -d -p 5432:5432 -v ../your_postgres/data:/var/lib/postgresql -t --name postgresDB postgres

第一个命令会将您的数据保存在容器中,而后一个命令会将您的数据保存在主机环境中。

现在您可以将数据库容器与 Wildfly 链接:

docker run -d -p 8080:8080 --link postgresDB:database -t baseWildfly

以下是链接的输出: enter image description here

现在您可以为开发人员团队中的所有成员提供相同的环境,他们可以用最少的设置开始编码。

生产环境也可以使用相同的基础镜像,所以每当你想发布新版本时,只需将WAR文件复制到主机的“your_deployment”文件夹即可。

将应用服务器和数据库服务器 dockerizing 的好处是,您可以在将来轻松地将其集群化以扩展它或应用高可用性。

关于java - 在 Java EE 应用程序的开发中使用 Docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27342154/

相关文章:

web-services - 如何导入 WSDL 文件以使用 MAVEN 开发 SOAP web 服务?

Java:通配符数组类型可以同时用作参数和返回类型吗?

java - Maven - 您是否需要 main 才能将项目用作库?

java - sun.security.ssl.allowUnsafeRenegotiation

java - 如何使用maven运行构建

windows - 使用 maven 部署 github 站点时出错

java - 类路径和 java.library.path 之间的区别?在linux和windows下如何设置?

java - 当我在 GSON(使用枚举)上运行 Proguard 时应用程序崩溃

java - 在 eclipse 中调试注释处理器

java - Mockito mock 没有被调用 - ArgumentCaptor 被忽略