在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

要在13个不同的云和虚拟化平台(包括vSphere,OpenStack,AWS,Rackspace,Microsoft Azure,Google Compute Engine,DigitalOcean,IBM SoftLayer等)上运行和管理此项目中的28个 Java应用程序模板,请确保您:

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

您可以从GitHub克隆此示例“名称目录” Java应用程序。 git clone https://github.com/dchqinc/dchq-docker-java-example.git

背景

容器化企业Java应用程序仍然是一个挑战,主要是因为现有的应用程序组合框架无法解决复杂的依赖关系,外部集成或置备后的自动扩展工作流。 此外,容器的短暂设计意味着开发人员必须启动新的容器并在每次版本更新时重新创建复杂的依赖关系和外部集成。

DCHQ具有托管和内部部署版本,可解决所有这些挑战,并通过高级应用程序组合框架简化了企业Java应用程序的容器化,该框架通过跨映像环境变量绑定,可扩展的BASH脚本插件扩展了Docker Compose。可以在请求时间或后置资源时调用,并通过应用程序群集在多个主机或区域上实现高可用性,并支持自动扩展。

设置应用程序后,用户可以监视正在运行的容器的CPU,内存和I / O,获取通知和警报,并访问应用程序备份,自动扩展/扩展工作流以及插件执行工作流,以更新正在运行的容器。 此外,借助Jenkins促进连续交付的即用型工作流使开发人员可以刷新正在运行的应用程序的Java WAR文件,而不会破坏现有的依赖关系和集成。

在以前的博客中,我们展示了跨13种不同的云和虚拟化平台的基于Docker的多层应用程序堆栈上各种Java应用程序(如Pizza Shop和Movie Store应用程序)的端到端部署自动化。 有关这些博客的完整列表,您可以访问以下页面: http : //dchq.co/docker-java-applications.html

但是,许多用户仍然对应用程序建模的一些基本方面感到困惑。 这些问题包括:

  • 这些环境变量来自基于YAML的应用程序模板中的何处?
  • 如何使用 Java应用程序所需的适当模式初始化数据库
  • 我已经有WebLogic应用服务器的部署计划。 我可以运行自己的脚本来部署Java应用程序吗?

为了解决这些问题,我们在此GitHub项目中创建了一个示例“ Names Directory” Java应用程序,可以将其部署在以下应用程序堆栈上:

  • Apache HTTP Server和Nginx(用于负载平衡)
  • WebSphere,JBoss,Tomcat和Jetty(作为应用程序服务器)
  • MySQL,PostgreSQL和Oracle(用于数据库)

在此项目中,我们将提供使用不同的应用程序堆栈以及在不同的云/虚拟基础架构上配置,部署和管理此Java应用程序的分步指南。

我们将介绍:

  • 在Java应用程序中配置web.xml和webapp-config.xml文件
  • 使用liquibase bean初始化连接的数据库
  • 构建基于YAML的应用程序模板,该模板可以在任何运行于任何地方的Linux主机上重复使用
  • 在任何云上配置和自动扩展基础架构(本博客中以Rackspace为例)
  • 在Rackspace集群上部署多层Java应用程序
  • 监视正在运行的容器的CPU,内存和I / O
  • 触发构建后,使用Jenkins启用持续交付工作流来更新正在运行的应用程序的WAR文件
  • 当应用程序资源受限时,向外扩展Application Server群集

在Java应用程序中配置web.xml和webapp-config.xml文件

您可以从GitHub克隆此示例“名称目录” Java应用程序。 git clone https://github.com/dchqinc/dchq-docker-java-example.git

这是“ Docker化” Java应用程序中最重要的步骤。 为了利用运行容器时可以传递的环境变量,您需要确保以某种方式配置您的应用程序,以允许您在请求时更改某些属性,例如:

  • 您要使用的数据库驱动程序
  • 数据库URL
  • 数据库凭证
  • 您希望在请求时间更改的任何其他参数(例如,最小/最大连接池大小,空闲超时等)

为此,您首先需要配置web.xml以使用引导Servlet来启动Spring上下文。

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

您将注意到contextConfigLocation引用了/WEB-INF/spring/webapp-config.xml

接下来,我们需要在webapp-config.xml文件中配置参数,以引用将在请求时传递的主机环境变量。

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

您会注意到,特定的dataSource属性引用了以下环境变量,这些变量将在请求时传递:

  • database_driverClassName
  • database_url
  • database_username
  • database_password

使用liquibase bean初始化连接的数据库

我们通常建议初始化数据库模式,作为Java应用程序部署本身的一部分。 这样,您不必担心维护需要在数据库上单独执行的单独SQL文件。

但是,如果您已经拥有这些SQL文件,并且仍然希望分别在数据库上执行这些文件,那么DCHQ可以通过其插件框架帮助您自动执行此过程。 您可以参考本以获取更多信息。

为了在Java应用程序中包括用于创建数据库表的SQL脚本,您将需要配置webapp-config.xml文件以使用liquibase Bean来检查dataSource并运行来自upgrade.sql的新语句。 Liquibase跟踪针对每个数据库运行了哪些changelog语句。

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

这是带有SQL语句的实际upgrade.sql文件,用于在连接的MySQL,PostgreSQL或Oracle数据库上初始化架构。

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

构建基于YAML的应用程序模板,该模板可以在任何运行于任何地方的Linux主机上重复使用

登录到DCHQ(托管的DCHQ.io或本地版本)后,用户可以导航至“ 管理” >“ 模板” ,然后单击“ +”按钮以创建新的Docker Compose模板。

我们使用来自Docker Hub官方映像针对相同的“名称目录” Java应用程序创建了28个应用程序模板 ,但针对不同的应用程序服务器和数据库。

模板包括以下应用程序堆栈的示例(对于同一Java应用程序):

  • Apache HTTP Server(httpd)和Nginx —用于负载平衡
  • Tomcat,Jetty,WebSphere和JBoss —用于应用程序服务器
  • MySQL,MariaDB,PostgreSQL和Oracle XE-用于数据库

在请求时间和事后置备状态下配置Web服务器和应用程序服务器的插件

在所有这些应用程序模板中,您会注意到一些容器正在请求时调用BASH脚本插件以配置容器。 这些插件也可以在置备后执行。

可以通过导航到Manage> Plug-ins来创建这些插件 提供BASH脚本后,DCHQ代理将在容器内执行此脚本。 用户可以指定可以在请求时和供应后覆盖的参数。 $之前的任何内容都被视为参数-例如, $ file_url可以是允许开发人员为WAR文件指定下载URL的参数。 当用户想要刷新正在运行的容器上的Java WAR文件时,可以在请求时间和后置资源中重写此方法。

定义基于YAML的应用程序模板时,需要提供插件ID。 例如,要为Nginx调用BASH脚本插件,我们将按如下所示引用插件ID:

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

在示例模板中,我们正在调用4个BASH脚本插件

Nginx正在调用一个BASH脚本插件,该插件动态(或在请求时)将应用程序服务器的容器IP注入default.conf文件中。 插件ID为0H1Nk

Apache HTTP Server(httpd)正在调用BASH脚本插件,该插件可动态(或在请求时)将应用程序服务器的容器IP注入httpd.conf文件中。 插件ID为uazUi

Nginx和Apache HTTP Server(httpd)插件的优点在于,它们可以在调配后执行,作为应用服务器集群扩展或扩展的一部分。 这样就可以定义自动扩展策略,以自动更新Web服务器(或负载平衡器)。

要以EULA许可访问Nginx和Apache HTTP Server(httpd)插件,请确保您执行以下任一操作:

应用程序服务器(Tomcat,Jetty,JBoss和WebSphere)也在调用BASH脚本插件,以从可访问的GitHub URL部署Java WAR文件。

Tomcat,JBoss和Jetty正在调用完全相同的BASH脚本插件(插件ID: oncXN )–除了将WAR文件部署在不同的目录上之外:

  • Tomcat –目录= / usr / local / tomcat / webapps / ROOT.war
  • 码头– dir = / var / lib / jetty / webapps / ROOT.war
  • JBoss –目录= / opt / jboss / wildfly / standalone / deployments / ROOT.war

BASH脚本插件是通过导航到“ 管理” >“ 插件”创建的,看起来像这样:

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

$ delete_dir$ dir$ file_url是可覆盖的参数,可以在创建插件或请求应用程序时定义。

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

WebSphere正在调用另一个BASH脚本插件(插件ID: rPuVb ),该插件将首先执行init-server-env.sh,然后从可访问的GitHub URL部署Java WAR文件。

Java WAR文件将部署在以下目录中:

  • WebSphere– dir = /opt/ibm/wlp/usr/servers/defaultServer/dropins/dbconnect.war

BASH脚本插件是通过导航到“ 管理” >“ 插件”创建的,看起来像这样:

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

$ delete_dir$ dir$ file_url是可覆盖的参数,可以在创建插件或请求应用程序时定义。

用于跨多个主机进行HA部署的cluster_size和主机参数

您会注意到, cluster_size参数使您可以指定要启动的容器数(具有相同的应用程序依赖性)。

host参数允许您指定要用于容器部署的主机。 如果在创建集群时选择了“ 编织”作为网络层,则可以这样做。 这样,您可以确保跨不同主机(或区域)的应用程序服务器群集的高可用性,并且可以遵守关联性规则以确保数据库在例如单独的主机上运行。 以下是host参数支持的值:

  • host1,host2,host3等–在数据中心(或集群)中随机选择一个主机进行容器部署
  • IP地址1,IP地址2等 -允许用户指定用于容器部署的实际IP地址
  • 主机名1,主机名2等 -允许用户指定用于容器部署的实际主机名
  • 通配符 (例如“ db- ”或“ app-srv- ”)–指定要在主机名中使用的通配符

跨图像的环境变量绑定

此外,用户可以通过引用另一个图像的环境变量来创建跨图像环境变量绑定。 在这种情况下,我们进行了几个绑定-包括database_url = jdbc:mysql:// {{MySQL | container_ip}}:3306 / {{MySQL | MYSQL_DATABASE}} –在请求时动态解析数据库容器IP,用于确保应用程序服务器可以与数据库建立连接。

以下是受支持的环境变量值的列表:

  • {{字母数字| 8}} –创建一个随机的8个字符的字母数字字符串。 这对于创建随机密码最有用。
  • {{图片名称| ip}} –允许您输入容器的主机IP地址作为环境变量的值。 这对于允许中间件层与数据库建立连接最有用。
  • {{图片名称| container_ip}} –允许您输入容器的名称作为环境变量的值。 这对于允许中间件层与数据库建立安全连接(不暴露数据库端口)最有用。
  • {{图片名称| container_private_ip}} –允许您输入容器的内部IP作为环境变量的值。 这对于允许中间件层与数据库建立安全连接(不暴露数据库端口)最有用。
  • {{图片名称| port_Port Number}} –允许您输入容器的端口号作为环境变量的值。 这对于允许中间件层与数据库建立连接最有用。 在这种情况下,指定的端口号必须是内部端口号,即不是分配给容器的外部端口。 例如,{{PostgreSQL | port_5432}}将转换为实际的外部端口,该端口将允许中间件层与数据库建立连接。
  • {{图片名称| 环境变量名称}} –允许您将一个图像的环境变量的值输入另一个图像的环境变量。 这里的用例是无止境的-因为大多数多层应用程序将具有跨映像依赖关系。

28个示例Docker Java应用程序模板

要查看所有28个Docker Java应用程序模板,请确保您访问以下GitHub项目页面:

  • https://github.com/dchqinc/dchq-docker-java-example

这是三个示例:

3层Java(Nginx – JBoss – PostgreSQL)

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

3层Java(ApacheHTTP – Tomcat – MySQL)

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

2层Java(WebSphere – Oracle-XE)

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

在任何云上预配和自动扩展基础架构

保存应用程序后,用户可以注册云提供商,以在12个不同的云端点上自动配置和自动扩展群集,这些端点包括VMware vSphere,OpenStack,CloudStack,Amazon Web Services,Rackspace,Microsoft Azure,DigitalOcean,IBM SoftLayer,Google Compute Engine等。

首先,用户可以导航至“ 管理” >“ Cloud Providers&Repos” ,然后单击“ +”按钮选择“ Rackspace” ,以注册用于Rackspace的Cloud Provider 需要提供Rackspace API**-可以从Rackspace Cloud控制面板的“帐户设置”部分检索。

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

然后,用户可以使用自动扩展策略创建集群,以自动启动新的Cloud Server。 可以通过导航到“ 管理” >“ 集群”页面,然后单击+按钮来完成。 您可以选择一个基于容量的放置策略,然后选择Weave作为网络层,以促进群集内多个主机之间安全,受密码保护的跨容器通信。 例如, 自动扩展策略可以将虚拟机(或云服务器)的最大数量设置为10。

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

现在,用户可以通过基于UI的工作流,或者通过定义可以从自助服务库请求的基于YAML的简单计算机组成模板来在新创建的群集上配置大量Cloud Server。

基于UI的工作流 –用户可以通过导航至“ 管理” >“ 主机” ,然后单击+按钮以选择Rackspace来请求Rackspace Cloud Server。 选择云提供商后,用户可以选择所需的区域,大小和图像。 默认情况下,会在Rackspace Cloud Server上打开端口以适应某些端口要求(例如,对于Docker是32000-59000,对于Weave是6783,对于RabbitMQ是5672)。 然后选择一个集群,然后可以指定云服务器的数量。

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

基于YAML的Machine Compose模板 -用户可以通过导航到Manage > Templates然后选择Machine Compose来为Rackspace创建Machine Compose模板。

这是请求4GB Cloud Server的模板。

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

Machine Compose模板支持的参数总结如下:

  • description :蓝图/模板的描述
  • instanceType :云提供商的特定值(例如general1-4)
  • 地区 :特定于云提供商的价值(例如,IAD)
  • 映像 :强制–完全限定的映像ID /名称(例如IAD / 5ed162cc-b4eb-4371-b24a-a0ae73376c73或vSphere VM模板名称)
  • username :可选–仅适用于vSphere VM模板用户名
  • password :可选–仅适用于vSphere VM Template加密密码。 您可以使用端点https://www.dchq.io/#/encrypt加密密码
  • 网络 :可选–云提供商特定值(例如,默认值)
  • securityGroup :云提供商特定值(例如dchq-security-group)
  • keyPair :云提供商的特定值(例如私钥)
  • openPorts :可选–逗号分隔的端口值
  • count :虚拟机总数,默认为1。

保存Machine Compose模板后,用户可以从自助服务库中请求此计算机。 用户可以单击“ 自定义” ,然后选择用于提供这些Rackspace Cloud Server的Cloud Provider群集

在Rackspace集群上部署多层Java应用程序

设置云服务器后,用户可以在新的云服务器上部署基于Docker的多层Java应用程序。 这可以通过导航到自助服务库,然后单击“自定义”来请求多层应用程序来完成。

用户可以选择环境标签(例如DEV或QE)和在单击“运行”之前创建的Rackspace群集。

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

访问正在运行的容器的浏览器内终端

在Live Apps页面上,容器名称旁边应有一个命令提示符图标。 这允许用户通过代理消息队列使用安全的通信协议进入容器。 租户管理员可以定义命令白名单,以确保用户不会对正在运行的容器进行任何有害更改。

例如,对于Tomcat部署,我们使用命令提示符来确保Java WAR文件已部署在/ usr / local / tomcat / webapps /目录下。

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

监视正在运行的容器的CPU,内存和I / O利用率

一旦应用程序启动并运行,我们的开发人员将监视正在运行的容器的CPU,内存和I / O,以在这些指标超过预定义的阈值时获得警报。 这在我们的开发人员执行功能和负载测试时特别有用。

用户可以执行历史监视分析,并将问题与容器更新或构建部署相关联。 这可以通过单击正在运行的应用程序的“ 动作”菜单,然后单击“ 监视”来完成 可以选择一个自定义日期范围以历史查看CPU,内存和I / O。

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

触发构建时,使用Jenkins启用持续交付工作流以更新正在运行的应用程序的WAR文件

对于希望遵循“不可变”容器模型的开发人员,通过重建包含应用程序代码的Docker映像并在每次应用程序更新时旋转新容器,DCHQ提供了自动构建功能,该功能允许开发人员从Dockerfiles或包含以下内容的私有GitHub项目中自动创建Docker映像: Dockerfiles。

但是,许多开发人员可能希望使用最新的Java WAR文件更新正在运行的应用程序服务器容器 为此,DCHQ允许开发人员使用Jenkins启用连续交付工作流程。 这可以通过单击正在运行的应用程序的“ 操作”菜单上,然后选择“ 连续交付”来完成 用户可以选择已经向DCHQ注册的Jenkins实例,将在Jenkins上生成最新WAR文件的实际Job,然后选择BASH脚本插件来获取此构建并将其部署在运行的应用程序服务器上。 保存此策略后,只要触发构建,DCHQ就会从Jenkins获取最新的WAR文件,并将其部署在运行的应用程序服务器上。

因此,开发人员将始终将最新的Java WAR文件部署在DEV / TEST环境中的运行容器上。

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

向外扩展Tomcat应用服务器集群

如果正在运行的应用程序受到资源限制,则用户可以扩展应用程序以满足不断增加的负载。 此外,例如,用户可以在工作时间安排向外扩展,在周末安排向外扩展。

要将Tomcat服务器集群从2扩展到4,用户可以单击正在运行的应用程序的“ 操作”菜单,然后选择“ 扩展” 然后,用户可以为群集指定新的大小,然后单击“立即运行”

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

然后,我们使用BASH插件来更新Apache HTTP Server的httpd.conf文件,以便它知道添加的新应用程序服务器。 还可以安排BASH脚本插件来适应用例,例如清理日志或以定义的频率更新配置。

要在正在运行的容器上执行插件,用户可以单击正在运行的应用程序的“ 操作”菜单,然后选择“ 插件” 然后,用户可以选择负载平衡器(Apache HTTP Server)容器,搜索需要执行的插件,并使用切换按钮启用容器重启。 该插件的默认参数将动态解析正在运行的Tomcat服务器的所有容器IP,并将它们添加为httpd.conf文件的一部分。

在28个不同应用程序堆栈上对Docker应用程序进行Docker化和管理的循序渐进指南...

应用程序时间轴可用于跟踪对应用程序所做的每个更改,以进行审核和诊断。 可以从正在运行的应用程序页面底部的可扩展菜单中访问它。

当容器或主机关闭或主机或容器的CPU和内存使用率超过定义的阈值时,警报和通知可用。

结论

容器化企业Java应用程序仍然是一个挑战,主要是因为现有的应用程序组合框架无法解决复杂的依赖关系,外部集成或置备后的自动扩展工作流。 此外,容器的短暂设计意味着开发人员必须启动新的容器并在每次版本更新时重新创建复杂的依赖关系和外部集成。

DCHQ具有托管和内部部署版本,可解决所有这些挑战,并通过高级应用程序组合框架简化企业Java应用程序的容器化,该框架可促进跨映像环境变量绑定,可在以下位置调用的可扩展BASH脚本插件。请求时间或事后置备,以及应用程序群集以在多个主机或区域上实现高可用性,并支持自动扩展。

免费注册在http://DCHQ.io或下载DCHQ内部部署 ,以获得与应用程序生命周期管理功能以及像监控,集装箱更新,规模输入/输出访问外的箱多层Java应用程序模板,持续交付。

翻译自: https://www.javacodegeeks.com/2015/12/step-step-guide-dockerizing-managing-java-app-28-different-application-stacks.html