我将加300分作为赏金
最近,我开始更深入地了解Docker,以及如何使用它来更快地获得团队的新成员,并在开发环境中运行,以及将新版本的软件交付生产。
对于如何以及在什么阶段将Java应用程序添加到容器中,我有一些疑问。在我看来,有多种方法可以做到这一点。
这是Docker之前的典型工作流(在我的团队中):
现在,在Docker出现之后,我对是否应该创建所需的映像并对其进行配置感到有点困惑,以便在运行JBoss Wildfly容器时,只需在web上通过管理控制台部署应用程序。或者,我是否应该每次在Maven中构建应用程序时创建一个新容器,并使用Dockerfile中的ADD命令添加它,然后只运行容器,而不会在启动后部署到它?
在生产中,我想最后一种方法是它所预言的吗?如果我错了,请纠正我。但在发展过程中,应该如何做呢?还有其他工作流吗?
发布于 2016-01-12 09:00:09
使用最新版本的Docker,您可以通过Docker链接、Docker卷和Docker Compose轻松地实现这一点。有关这些工具的更多信息来自Docker站点。
回到您刚才提到的工作流:对于任何典型的Java应用程序,都需要一个应用服务器和一个数据库服务器。由于您在文章中没有提到数据库是如何设置的,所以我假设您的开发环境将为每个开发人员分离数据库服务器。
考虑到所有这些假设,我可以建议以下工作流程:
docker run -d -it -p 8080:8080 -p 9990:9990
应用程序服务器现在正在运行,您需要配置它以连接到数据库服务器,还需要配置数据源设置和其他配置,以便启动Java应用程序。为此,您需要登录到Jboss容器的bash终端:
码头主管-i -t baseWildfly /bin/bash/
你现在在集装箱码头。您可以像在任何linux环境中一样配置应用服务器。
您可以通过手动将WAR文件部署到Wildfly来测试配置。可以很容易地使用管理控制台、maven插件或添加命令来完成这一任务。我通常在管理控制台上这样做,只是为了快速测试。当您验证配置是否有效时,可以删除WAR文件并创建容器的快照:
docker -更改“添加基本设置和配置”baseWildfly yourRepository:标记
现在,您可以将创建的映像推送到您的私有存储库中,并与您的开发团队共享该映像。他们现在可以提取映像并运行应用服务器立即部署。
我们不想使用管理控制台为每个Maven构建部署WAR文件,因为这太麻烦了,所以下一个任务是使用Docker卷将其自动化。
假设您已经将Maven配置为将WAR文件构建为“./ you _project/部署/”,则可以将该文件链接到Jboss容器的部署目录,如下所示:
码头运行-d -p 8080:8080 -v -v
现在,每次使用Maven重新构建应用程序时,应用服务器都会扫描更改并重新部署WAR文件。
为每个开发人员分离数据库服务器也是一个相当大的问题,因为他们必须在容器中自己配置数据库服务器,因为它们可能有不同的设置(例如db的url、用户名、密码等)。所以,最终把它篡改是很好的。
假设您使用Postgres作为db服务器,则可以从postgres官方存储库中提取它。当映像就绪后,可以运行db服务器:
docker run -d -p 5432:5432 -t --名称postgresDB postgres
或者使用链接的"data“目录运行数据库服务器:
docker运行-d -p 5432:5432 -v ./your_ postgres /data:/var/lib/postgresql -t -name postgresDB postgres
第一个命令将您的数据保存在容器中,而后一个命令将您的数据保存在主机env中。
现在您可以将数据库容器与Wildfly链接起来:
docker运行-d -p 8080:8080 -链接postgresDB:数据库-t baseWildfly
以下是链接的输出:

现在,您可以为开发人员团队中的所有成员创建相同的环境,并且他们可以以最少的设置开始编码。
生产环境可以使用相同的基本映像,因此每当您想发布新版本时,只需将WAR文件复制到主机的"your_deployment“文件夹。
对接应用程序服务器和db服务器的好处是,将来可以很容易地对其进行集群,以对其进行扩展或应用高可用性。
发布于 2014-12-07 15:54:00
我在玻璃鱼中广泛使用了Docker,很长一段时间以来,我已经在这里上写了一个关于这个主题的博客。
它是一个很好的JavaEE开发工具。
对于您的生产映像,我更喜欢将所有东西捆绑在一起,在新的战争中构建静态的基本映像和分层。我喜欢使用CI服务器来完成工作,并对生产分支进行CI配置,这将在发行版构建中获取一个基础层,然后发布工件。通常,我们会手动部署到生产中,但是如果您真的想要获得更好的效果,您甚至可以通过将CI服务器部署到生产环境中,并使用代理服务器来确保新的会话得到更新的版本,从而实现这一点。
在开发中,我喜欢在本地运行任何依赖于容器的程序时,采用同样的方法(例如。在签入代码之前进行Arquillian集成测试。这使环境尽可能接近生产,我认为这在测试时是很重要的。这是我反对使用嵌入式容器进行测试,但部署到非嵌入式容器的一个重要原因。我见过很多情况,测试将在嵌入式环境中通过,而在生产/非嵌入式环境中失败。
在开发/部署/手动测试周期中,在提交代码之前,我认为部署到容器中(这是基本映像的一部分)的方法在开发速度方面更符合成本效益。每一次你的战争中的循环和建筑。如果开发环境使用像JRebel或XRebel这样的工具,可以热部署代码,只需刷新浏览器就可以查看更改,这也是一种更好的方法。
发布于 2014-12-09 21:09:28
您可能想看看rhuss/docker-maven-plugin。它允许无缝集成,将docker用作您的部署单元:
docker:build构建映像,这样您就可以生成WAR文件,或者您的Microservice可以轻松地添加到Docker映像中。docker:push推送创建的映像。docker:start和docker:stop,您可以在单元测试期间利用您的映像。这个插件附带了一个全面的文档,如果有任何问题,请打开一个问题。
正如你可能已经注意到的,我是这个插件的作者;-)坦率地说,还有其他的docker插件,它们都有一个稍微不同的关注点。对于一个简单的检查,您可以查看枪战-码头-马文,它为四个最活跃的maven-docker提供了示例配置。
然后,工作流简单地将工件边界从WAR/EAR文件转移到Docker映像。mvn docker:push将它们移动到Docker注册中心,在连续交付管道中使用的各个测试阶段从那里提取。
https://stackoverflow.com/questions/27342154
复制相似问题