docker 容器部署_在任何云上的Docker容器上进行多层Java应用程序部署的最佳实践...

docker 容器部署

本文基于DCHQ白皮书(2015年9月)。 DCHQ是用于在任何云上自动化基于容器的应用程序的高级平台。

该托管平台非常适合快速增长并希望自动化应用程序的部署,生命周期管理和监视以减少在DEV / TEST环境中复制应用程序的成本的开发团队。

http://DCHQ.io上免费注册,以访问现成的多层Java应用程序模板以及应用程序生命周期管理功能,例如监视,容器更新,扩展/扩展和连续交付。

1.背景

Java开发人员和DevOps专业人员长期以来一直在努力实现企业Java应用程序的自动化部署。 这些应用程序的复杂性通常意味着,每次在DEV / TEST环境中部署应用程序时,都必须重新配置应用程序依赖性和外部集成。

许多解决方案宣传“一次建模,随处部署”消息,以进行应用程序部署。 但是,实际上,总会有一些复杂性,例如,很难在本地vSphere虚拟环境和AWS环境中重用应用程序模板。

但是,最近,Docker容器普及了将应用程序组件打包到Linux容器中的想法,只要安装了Docker Engine,它们就可以在所有Linux主机上完全相同地部署。

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

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

dchq-ss-1

设置应用程序后,用户可以监视正在运行的容器的CPU,内存和I / O利用率,获取通知和警报,并执行第二天的操作,例如计划备份,使用BASH脚本插件的容器更新以及放大/缩小。 此外,借助Jenkins促进连续交付的即用型工作流使开发人员可以刷新正在运行的应用程序的Java WAR文件,而不会破坏现有的依赖关系和集成。

在本文中,将介绍部署在群集Tomcat服务器上的基于Docker的3层Java应用程序的部署自动化和生命周期管理,其中Nginx用于负载平衡,而MySQL用于数据库。 我们将介绍:

  • 构建可在任何地方运行的任何Linux主机上重复使用的应用程序模板
  • 在任何云上配置和自动扩展基础架构(本文以Rackspace为例)
  • 在Rackspace集群上部署多层Java应用程序
  • 监视正在运行的容器的CPU,内存和I / O利用率
  • 向外扩展Tomcat应用服务器集群
  • 触发构建时,使用Jenkins启用持续交付工作流以更新正在运行的应用程序的WAR文件

2.集装箱面临的挑战

许多Java开发人员对Docker的兴起持怀疑态度-不了解Docker容器如何适应其应用程序开发过程。 毕竟,JVM本身就是一个容器-为什么开发人员需要另一个抽象层来容器化容器?

最初,有关Java应用程序的Docker容器的兴奋来自于:

  • Docker提供应用程序可移植性的能力。 开发人员不再需要担心安装正确版本的Java或JVM。 Java应用程序将在任何地方运行的任何Linux主机上完全相同地运行。
  • Docker的抽象层,如果存在安全漏洞,它可以防止黑客访问本机操作系统。

当Java开发人员开始探索Docker时,他们很快意识到容器化企业Java应用程序仍然是一个挑战,因为:

  • 在学习Dockerfile中的新语法时,通常涉及到重要的学习过程
  • 现有的应用程序组合框架无法解决复杂的依赖关系或事后自动扩展工作流
  • 与现有的负载平衡或数据库服务的集成如今很难管理(尤其是在配置了应用程序之后)

此外,容器的短暂设计意味着每当新版本的Java应用程序可用时,就会从更新的Docker映像中生成新的容器。 尽管“不可变”容器对于无状态应用程序非常有效,但是企业Java应用程序有时可能具有数百个依赖关系,这些依赖关系在每次版本更新时都很难重新创建。

最后,对于Java开发人员要使用Docker,必须确保可以在生产中使用它。 结果,在容器上运行生产工作负载引起了很多担忧,例如:

  • 高可用性 -在分布式主机甚至不同区域上运行容器以确保高可用性
  • 复杂应用程序的应用程序组成 —能够对具有多个依赖项的非常复杂的应用程序进行建模,以实现一键式部署
  • 监视和警报 -获取有关资源利用率指标何时超过运行容器的指定阈值的典型警报和通知
  • Auto-Scaling —在资源受限或基于已定义的计划时(例如,在工作时间内)自动扩展应用程序
  • 持续交付 –能够通过Jenkins等构建服务器上的最新构建不断更新生产环境
  • 容器更新 -如果需要某些配置更改,则需要使用标准的,经过测试的脚本以自动方式更新容器
  • 日志记录 -能够访问正在运行的容器的日志以进行故障排除和分析
  • 与现有服务集成—以无缝方式与现有负载均衡器或数据库集成
  • 审核 -能够跟踪正在运行的应用程序上发生的所有更改以及由谁应用这些更改

3. DCHQ解决方案概述

DCHQ解决了所有这些挑战,并通过一个高级应用程序组合框架简化了企业Java应用程序的容器化,该框架为Docker Compose引入了关键的增强功能,例如:

  • 跨图像环境变量绑定
  • 可在请求时间或事后置备中调用的可扩展BASH脚本插件
  • 应用程序集群可在多个主机或区域中实现高可用性并自动扩展

设置应用程序后,用户可以监视正在运行的容器的CPU,内存和I / O利用率,获取通知和警报,并执行第二天的操作,例如计划备份,使用BASH脚本插件的容器更新以及放大/缩小。 此外,借助Jenkins促进连续交付的即用型工作流使开发人员可以刷新正在运行的应用程序的Java WAR文件,而不会破坏现有的依赖关系和集成。

dchq-ss-2

DCHQ不仅使应用程序部署自动化,而且还与12个不同的云提供商集成在一起,以自动进行由分布式虚拟机组成的支持Weave的群集的配置和自动扩展。 它还支持基于容量的放置以及主机和集群的历史监视和警报。

所有这些都在控制层下,允许用户定义对群集,应用程序模板,插件,内部版本和Docker存储库(包括Docker Hub,Quay,Red Hat Container Registry)的细粒度访问控制。

4.在任何云上部署容器化多层Java应用程序的最佳实践

在本文中,我们将介绍部署在群集Tomcat服务器上的基于Docker的3层Java应用程序的部署自动化和生命周期管理,其中Nginx用于负载平衡,而MySQL用于数据库。

我们将介绍:

  • 构建可在任何地方运行的任何Linux主机上重复使用的应用程序模板
  • 在任何云上配置和自动扩展基础架构(本文以Rackspace为例)
  • 在Rackspace集群上部署多层Java应用程序
  • 监视正在运行的容器的CPU,内存和I / O利用率
  • 向外扩展Tomcat应用服务器集群
  • 触发构建时,使用Jenkins启用持续交付工作流以更新正在运行的应用程序的WAR文件

为基于Docker的Java 3-Tier Nginx,集群Tomcat和MySQL应用程序构建应用程序模板

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

在这个开箱即用的示例中,我们有一个多层应用程序,由Nginx(用于负载平衡),Tomcat(集群应用程序服务器)和MySQL(作为数据库)组成。 您会注意到Nginx正在调用BASH脚本插件来动态(或在请求时)在default.conf文件中添加应用程序服务器的容器IP。 Tomcat也正在调用BASH脚本插件来从指定的URL部署Java WAR文件。在这种情况下,WAR托管在Dropbox上: https : //dl.dropboxusercontent.com/u/4090128/pizzashop-0.1.0 .BUILD-SNAPSHOT.war

您会注意到, 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和名称。在请求时使用,并用于在应用程序服务器中配置数据库URL。

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

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

image003

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

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

首先,用户可以通过导航到“ 管理” >“ 仓库和云提供商” ,然后单击“ +”按钮选择“ Rackspace”,为Rackspace注册一个Cloud Provider。 需要提供Rackspace API密钥-可以从Rackspace Cloud控制面板的“帐户设置”部分检索。

image004

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

图片006

用户现在可以通过导航到“ 管理” >“ 裸机服务器和VM” ,然后单击“ +”按钮选择“ Rackspace” ,在新创建的集群上配置许多Cloud Server。 选择云提供商后,用户可以选择所需的区域,大小和图像。 可以在新的云服务器上打开端口(例如,对于Docker是32000-59000,对于Weave是6783,对于RabbitMQ是5672)。 然后选择一个数据中心(或集群),并可以指定云服务器的数量。

image008

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

设置云服务器后,用户可以在新的云服务器上部署基于Docker的多层应用程序。 可以通过导航到自助服务库,然后单击“自定义”来请求多层应用程序来完成。 用户可以选择环境标签(例如DEV或QE)和在单击“运行”之前创建的Rackspace集群。

image010

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

一旦应用程序启动并运行,用户就可以监视正在运行的容器的CPU,内存和I / O利用率,并执行第二天的操作,例如预定备份,使用BASH插件进行容器更新,扩展/扩展和连续交货。

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

image013

image015

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

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

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

然后,我们使用BASH插件来更新Nginx的default.conf文件,以便它知道添加的新应用程序服务器。 还可以安排BASH脚本插件来适应用例,例如清理日志或以定义的频率更新配置。 应用程序时间轴可用于跟踪对应用程序进行的每个更改,以进行审核和诊断。

image016

向外扩展完成后,用户可以执行BASH插件来更新Nginx的default.conf文件,以便它知道所添加的新应用程序服务器。 还可以安排BASH脚本插件来适应用例,例如清理日志或以定义的频率更新配置。

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

image018

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

image021

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

image022

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

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

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

image025

5.结论

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

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

http://DCHQ.io上免费注册,以访问现成的多层Java应用程序模板以及应用程序生命周期管理功能,例如监视,容器更新,扩展/扩展和连续交付。

翻译自: https://www.javacodegeeks.com/2015/09/best-practices-for-multi-tier-java-application-deployments-on-docker-containers-on-any-cloud.html

docker 容器部署

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值