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

Luc*_*uke 14 java jboss java-ee maven docker

我会加300分作为赏金

我最近开始仔细研究Docker以及如何使用它来更快地获得团队的新成员并运行开发环境以及将新版本的软件发布到生产中.

关于我应该如何以及在什么阶段将Java EE应用程序添加到容器中,我有一些问题.我认为有很多方法可以做到这一点.

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

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

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

在制作中,我猜最后一种方法是它的优先选择?如果我错了,请纠正我.但在开发中应该怎么做?还有其他工作流程吗?

NBW*_*NBW 7

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

它是JavaEE开发的一个很好的工具.

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

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

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


小智 6

使用最新版本的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 - 更改"添加基本设置和配置"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官方存储库中提取它.准备好映像后,可以运行db服务器:

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

以下是链接的输出: 在此输入图像描述

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

相同的基本映像可用于生产环境,因此无论何时要发布新版本,只需将WAR文件复制到主机的"your_deployment"文件夹即可.

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