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

2022-09-03 13:29:31

我将添加300点作为赏金

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

对于如何以及在哪个阶段将 Java EE 应用程序添加到容器中,我有一些问题。正如我所看到的,有多种方法可以做到这一点。

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

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

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

在生产中,我想最后一种方法是它所预示的是什么?如果我错了,请纠正我。但是在开发过程中,应该如何做到这一点呢?还有其他工作流程吗?


答案 1

使用最新版本的 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 configuration” baseWildfly yourRepository:tag

现在,您可以将创建的映像推送到专用存储库,并与开发团队共享。他们现在可以拉取映像并运行应用程序服务器以立即部署。

我们不想使用管理控制台为每个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 文件。

为每个开发人员设置单独的数据库服务器也是非常有问题的,因为他们必须在容器中自行配置它,因为他们可能具有不同的设置(例如.db的url,用户名,密码等)。所以,最终把它做成是件好事。

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

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

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

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”文件夹中。

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


答案 2

我已经将Docker与Glassfish广泛使用了很长时间,并且不久前在这里写了一篇关于这个主题的博客。

它是JavaEE开发的绝佳工具。

对于您的生产映像,我更喜欢将所有内容捆绑在一起,在新的 WAR 中构建静态基础映像和分层。我喜欢使用CI服务器来完成工作,并为生产分支提供CI配置,这将在发布版本中获取基础层,然后发布工件。通常,我们手动部署到生产中,但如果您真的想获得幻想,您甚至可以通过将CI服务器部署到生产环境中并使用代理服务器来自动执行该操作,以确保它获得更新的版本。

在开发中,我喜欢在本地运行任何依赖于容器的方法时采取相同的方法(例如。Arquillian 集成测试),在签入代码之前。这使环境尽可能接近生产环境,我认为这在测试方面很重要。这是我反对使用嵌入式容器进行测试但部署到非嵌入式容器等方法的一个重要原因。我见过很多这样的情况,即测试将在嵌入式环境中通过,而在生产/非嵌入式环境中失败。

在开发/部署/手动测试周期中,在提交代码之前,我认为部署到容器(作为基础映像的一部分)的方法在开发周期的速度方面更具成本效益,而不是每次都在WAR中构建。如果您的开发环境使用 JRebel 或 XRebel 等工具,您可以在其中热部署代码并简单地刷新浏览器以查看更改,这也是一种更好的方法。


推荐