这是一个由三部分组成的博客系列的第一个博客,该系列讨论了在Linux和Windows容器上自动部署.NET应用程序的问题。
在本博客中,我们将介绍使用HyperForm在Linux容器上部署非常基本的ASP.NET和ASP.NET MVC应用程序的过程,HyperForm是一种部署自动化平台,可简化应用程序到容器的旅程。 该博客涵盖6个应用程序模板,其中包括用于反向代理的Nginx和Apache HTTP。
在18个不同的云和虚拟化平台(包括HyperGrid,vSphere,OpenStack,AWS,Rackspace,Microsoft Azure,Google Compute Engine,DigitalOcean,IBM SoftLayer)上运行和管理简单的Docker的ASP.NET“ Hello MVC”和“ Hello Web”应用程序等),请确保您执行以下任一操作:
- 注册HyperForm SaaS - http: //dchq.io ,或
- 免费下载HyperForm内部标准版 — http://dchq.co/hyperform-on-premise.html
背景
容器化企业应用程序仍然是一个挑战,主要是因为现有的应用程序组合框架无法解决配置后的复杂依赖性,外部集成或应用程序生命周期管理任务。
HyperForm具有托管和内部部署版本,可解决所有这些挑战,并通过扩展了Docker Compose支持的高级应用程序组合框架简化了企业应用程序的容器化
- 可以在20多个不同生命周期阶段调用的高级插件 ,以实现服务发现,动态容器化和应用程序存储自动化,以及
- 数据注入以支持复杂的应用程序依赖关系。
插件框架依赖于可以用BASH,PowerShell,Perl,Ruby或Python编写的自定义脚本,可以实现高级应用程序部署并促进与任何外部服务(包括存储,网络或监视解决方案)的快速集成。
部署应用程序后,用户可以访问监视,警报和通知,使用Jenkins的连续交付,应用程序备份,放大/缩小,浏览器内置终端以访问容器,日志查看和使用自定义插件的容器更新。
为什么还要打扰容器?
容器一直是加快软件开发,云迁移和遗留应用程序现代化工作的推动力。 容器的主要优点是:
- 应用程序可移植性 – Docker容器在任何Linux主机上运行完全相同。 这消除了跨不同计算基础架构(例如本地开发人员计算机,vSphere VM或云中)部署应用程序的挑战。
- 更高的服务器密度 –容器的轻量特性使开发人员可以通过在同一主机上运行更多容器,同时实现虚拟机的相同隔离和资源分配优势,来优化其应用程序工作负载的服务器利用率。
对于仍然想知道虚拟机和容器之间的确切区别是什么的开发人员,这里列出了主要区别。
应用程序存储开销
- 虚拟机 :每个应用程序工作负载都在单独的虚拟机上运行-通常需要千兆字节的OS开销
- 容器 :容器可以在同一台物理机或虚拟机上独立运行- 所有容器都使用一个通用操作系统 。 Docker引擎的开销很小-即兆字节。
实例化
- 虚拟机 : 操作系统和应用程序的启动时间
- 容器 : 仅应用程序实例化时间 –即启动Linux进程的时间
资源分配
- 虚拟机 : 通常是刚性的 。 虚拟CPU和内存通常是预先分配给VM的,并且配置后很难更改-取决于所使用的虚拟化平台或云提供商。
- 容器 : 通常是柔性的 。 如果需要,可以为容器定义CPU和内存的最大限制(使用cpu_shares和mem_limit参数)。 默认情况下,容器可以继续消耗基础计算机上可用的资源。 借助HyperForm,还可以定义CPU和内存的最低限制–允许用户将应用程序工作负载放置在具有足够CPU和内存资源的计算机上。 您可以在此处了解更多信息: http : //dchq.co/docker-compose.html#docker-nodejs 。
使用microsoft / aspnet:1.0.0-rc1-final构建Docker映像
如果您的代码存储库中有一个Dockerfile用于构建最新映像,则可以使用HyperForm自动构建Docker映像,并将新映像推送到已注册的Docker注册表之一。
当然,如果您使用的是Docker Hub,则可以选择使用“ 自动构建”功能。 但是,如果您使用的是专用注册表 ,则HyperForm可以提供所需的映像构建自动化。
本博客中使用的ASP.NET示例是从GitHub上的Microsoft官方项目中克隆的:
- https://github.com/aspnet/Home/tree/dev/samples/1.0.0-rc1-final/HelloMvc
- https://github.com/aspnet/Home/tree/dev/samples/1.0.0-rc1-final/HelloWeb
登录到HyperForm(托管的DCHQ.io或内部部署版本)后,用户可以导航到“ 自动化” >“ 图像构建” ,然后单击+按钮创建新的Dockerfile(Git / GitHub / BitBucket)图像构建。
提供所需的值,如下所示:
- Git URL –(例如https://github.com/dchqinc/docker-aspnet-hellomvc.git或https://github.com/dchqinc/docker-aspnet-helloweb )
- Git分支 -该字段是可选的-但用户可以从GitHub项目中指定一个分支。 默认分支是master。
- Git凭证 –用户可以在HyperForm中将凭证安全地存储到私有GitHub存储库中。 这可以通过导航到Cloud Providers并单击+选择凭据来完成。
- 集群 – Docker映像的构建通过HyperForm代理进行协调。 结果,用户需要选择一个集群,在该集群上将使用代理执行Docker映像的构建。 如果尚未创建群集,请参考本节以注册已运行的主机或自动配置新的虚拟基础架构。
- 推送到注册表 -用户可以将新创建的映像推送到 Docker Hub,Nexus,Artifactory或Quay上的公共或私有存储库中。 要注册Docker注册表帐户,用户应导航至Cloud Providers ,然后单击+以选择Docker Registries。
- 资源库 –这是将在其上推送映像的资源库的名称。 例如,我们的图像被推送到dchq / php-example:latest
- 标签 -这是您要为新图像指定的标签名称。 HyperForm支持的标签名称包括:
- {{date}} -格式化日期
- Cron表达式 –用户可以使用开箱即用的cron表达式来计划Docker映像的构建。 这方便了用户的每日和每晚构建。
- 构建前插件和构建后插件 –用户可以在用于运行映像构建的机器上执行插件–例如,安装Linux库或运行映像构建清理脚本。
- 谁可以管理 –用户可以将此构建标记为私有或与其他用户或组共享。
完成必填字段后,用户可以点击保存 。
然后,用户可以单击“ 播放”按钮以按需构建Docker映像。
这是用于为ASP.NET Hello Web应用程序构建Docker映像的实际Dockerfile。
https://github.com/dchqinc/docker-aspnet-helloweb/blob/master/Dockerfile
构建基于YAML的应用程序模板,该模板可以在任何在任何地方运行的Linux主机上重复使用
HyperForm与Docker Compose( https://docs.docker.com/compose/compose-file/ )完全兼容。
但是,该平台为Docker Compose提供了核心( 可选 )增强功能,支持高级插件,可以在20多个不同的生命周期阶段调用这些插件,以实现服务发现,动态容器化和应用程序存储自动化。
它还支持跨映像环境变量绑定,自动容器IP检索和注入以及其他参数,如mem_min,publish_all,cluster_size和Registry_id。 当集群扩展/扩展或容器停止/启动时,服务发现框架负责重新配置负载平衡器和其他应用程序组件。
要创建应用程序模板,用户可以登录HyperForm(托管的DCHQ.io或本地版本),导航至“ 蓝图” >“ App / Machine” ,然后单击“ +”按钮以创建新的Docker Compose模板。
我们已经为基本的ASP.NET“ Hello MVC”和“ Hello Web”应用程序创建了6个应用程序模板 ,但是具有用于反向代理和负载平衡的不同Web服务器。
aspnet-mvc:
image: dchq/aspnet-hellomvc:latest
mem_min: 50m
host: host1
publish_all: true
cluster_size: 1
带有Nginx的Docker ASP.NET Hello MVC
nginx:
image: nginx:latest
publish_all: true
host: host1
mem_min: 50m
plugins:
- !plugin
id: 0H1Nk
restart: true
lifecycle: on_create, post_scale_out:aspnet-mvc, post_scale_in:aspnet-mvc
arguments:
# Use container_private_ip if you're using Docker networking
- servers=server {{aspnet-mvc | container_private_ip}}:5004;
# Use container_hostname if you're using Weave networking
#- servers=server {{aspnet-mvc | container_hostname}}:5004;
aspnet-mvc:
image: dchq/aspnet-hellomvc:latest
mem_min: 100m
host: host1
publish_all: false
cluster_size: 1
带有Apache HTTP的Docker ASP.NET Hello MVC
http-lb:
image: httpd:latest
publish_all: true
mem_min: 50m
host: host1
plugins:
- !plugin
id: uazUi
restart: true
lifecycle: on_create, post_scale_out:aspnet-mvc, post_scale_in:aspnet-mvc
arguments:
# Use container_private_ip if you're using Docker networking
- BalancerMembers=BalancerMember http://{{aspnet-mvc | container_private_ip}}:5004
# Use container_hostname if you're using Weave networking
#- BalancerMembers=BalancerMember http://{{aspnet-mvc | container_hostname}}:5004
aspnet-mvc:
image: dchq/aspnet-hellomvc:latest
mem_min: 100m
host: host1
publish_all: false
cluster_size: 1
aspnet:
image: dchq/aspnet-helloweb:latest
mem_min: 50m
host: host1
publish_all: true
cluster_size: 1
带有Nginx的Docker ASP.NET Hello Web
nginx:
image: nginx:latest
publish_all: true
host: host1
mem_min: 50m
plugins:
- !plugin
id: 0H1Nk
restart: true
lifecycle: on_create, post_scale_out:aspnet, post_scale_in:aspnet
arguments:
# Use container_private_ip if you're using Docker networking
- servers=server {{aspnet | container_private_ip}}:5004;
# Use container_hostname if you're using Weave networking
#- servers=server {{aspnet | container_hostname}}:5004;
aspnet:
image: dchq/aspnet-helloweb:latest
mem_min: 100m
host: host1
publish_all: false
cluster_size: 1
带有Apache HTTP的Docker ASP.NET Hello Web
http-lb:
image: httpd:latest
publish_all: true
mem_min: 50m
host: host1
plugins:
- !plugin
id: uazUi
restart: true
lifecycle: on_create, post_scale_out:aspnet, post_scale_in:aspnet
arguments:
# Use container_private_ip if you're using Docker networking
- BalancerMembers=BalancerMember http://{{aspnet | container_private_ip}}:5004
# Use container_hostname if you're using Weave networking
#- BalancerMembers=BalancerMember http://{{aspnet | container_hostname}}:5004
aspnet:
image: dchq/aspnet-helloweb:latest
mem_min: 100m
host: host1
publish_all: false
cluster_size: 1
跨图像的环境变量绑定
用户可以通过引用另一个图像的环境变量或容器值来创建跨图像环境变量绑定。 例如,在Apache HTTP容器中使用的插件引用了ASP.NET容器BalancerMembers = BalancerMember http:// {{aspnet-mvc | container_private_ip}}:5004 –在其中ASP.NET Hello MVC容器的容器IP被自动检索并注入到Apache HTTP配置文件中。
以下是受支持的环境变量值的列表:
- {{字母数字| 8}} –创建一个随机的8个字符的字母数字字符串。 这对于创建随机密码最有用。
- {{图片名称| ip}} –允许您输入容器的主机IP地址作为环境变量的值。 这对于允许中间件层与数据库建立连接最有用。
- {{图片名称| container_hostname}}或{{Image Name | container_ip}} –允许您输入容器的名称作为环境变量的值。 这对于允许中间件层与数据库建立安全连接(不暴露数据库端口)最有用。
- {{图片名称| container_private_ip}} –允许您输入容器的内部IP作为环境变量的值。 这对于允许中间件层与数据库建立安全连接(不暴露数据库端口)最有用。
- {{图片名称| port_Port Number}} –允许您输入容器的端口号作为环境变量的值。 这对于允许中间件层与数据库建立连接最有用。 在这种情况下,指定的端口号必须是内部端口号,即不是分配给容器的外部端口。 例如,{{PostgreSQL | port_5432}}将转换为实际的外部端口,该端口将允许中间件层与数据库建立连接。
- {{图片名称| 环境变量名称}} –允许您将一个图像的环境变量的值输入另一个图像的环境变量。 这里的用例是无止境的-因为大多数多层应用程序将具有跨映像依赖关系。
使用插件和host参数部署高可用性Docker Java应用程序
在HyperForm中创建应用程序模板时, host参数允许您指定要用于容器部署的主机。 如果在创建集群时选择了Weave作为网络层,则可以这样做。 这样,您可以确保跨不同主机(或区域)的应用程序服务器群集的高可用性,并且可以遵守关联性规则以确保数据库在例如单独的主机上运行。 以下是host参数支持的值:
- host1,host2,host3等–在数据中心(或集群)中随机选择一个主机进行容器部署
- IP地址1,IP地址2等 -允许用户指定用于容器部署的实际IP地址
- 主机名1,主机名2等 -允许用户指定用于容器部署的实际主机名
- 通配符 (例如“ db- ”或“ app-srv- ”)–指定要在主机名中使用的通配符
使用插件生命周期阶段进行Docker服务发现
HyperForm中的服务发现框架提供了事件驱动的生命周期阶段,该阶段执行自定义脚本以重新配置应用程序组件。 在向外扩展可能需要为其重新配置负载平衡器或可能需要重新平衡副本集的群集时,这至关重要。
您会注意到,Nginx和Apache HTTP插件正在以下不同阶段或事件中执行:
- 创建Nginx或Apache HTTP容器后 ,在这种情况下,应用程序服务器的容器IP将注入默认配置文件中,以促进对正确服务的负载平衡
- 扩展或扩展ASP.NET应用程序服务器群集时 -在这种情况下,将应用程序服务器的更新后的容器IP注入默认配置文件中,以促进对正确服务的负载平衡
- 当ASP.NET应用程序服务器停止或启动时 -在这种情况下,应用程序服务器的更新后的容器IP被注入到默认配置文件中,以促进对正确服务的负载平衡
因此,这里的服务发现框架既要进行服务注册 (通过跟踪容器IP和环境变量值), 也要进行服务发现 (通过在某些事件或阶段执行正确的脚本)。
插件中的生命周期参数允许您指定执行插件的确切阶段或事件。 如果未指定生命周期,则默认情况下,该插件将执行on_create 。 以下是受支持的生命周期阶段:
- on_create —创建容器时执行插件
- on_start-在容器启动后执行插件
- on_stop-在容器停止之前执行插件
- on_destroy-在销毁容器之前执行插件
- pre_create –在创建容器之前执行插件
- post_create —在容器创建并运行后执行插件
- post_start [:Node] -在另一个容器启动后执行插件
- post_stop [:Node] -在另一个容器停止后执行插件
- post_destroy [:Node] -在另一个容器销毁后执行插件
- post_scale_out [:Node] -在扩展另一个容器集群后执行插件
- post_scale_in [:Node] -在扩展另一个容器集群后执行插件
- cron(0 1 1 * *?) –根据指定的cron表达式安排插件。 以下是cron表达式的一些示例 。
- exec_on_machine –在基础计算机上执行插件。 此生命周期可以与其他容器生命周期一起使用。 例如, exec_on_machine pre_create将在创建容器之前在计算机上执行插件。
在任何云上配置基础架构
保存应用程序后,用户可以将应用程序部署到已经可用的集群(或服务器池)中,或在18个不同的云端点上配置基础架构,这些端点包括HyperGrid,VMware vSphere,OpenStack,CloudStack,Amazon Web Services,Rackspace ,Microsoft Azure,DigitalOcean,IBM SoftLayer等。
有关自动执行基础结构配置的详细说明,请参阅此处的详细文档:
http://dchq.co/docker-infrastructure-as-a-service.html
此博客中记录的演示使用Microsoft Azure资源管理器上的预配置VM群集。 有关使用可重复使用的YAML模板在ARM上自动配置VM的说明,请参阅此处的详细文档。
http://dchq.co/docker-azure-resource-manager.html
在HyperGrid群集上部署ASP.NET应用程序
用户可以在任何可用群集上部署ASP.NET应用程序。 在HyperForm SaaS平台( http://dchq.io )上–在HyperGrid基础架构上设置的公共群集可用于免费应用程序部署(最大2GB内存)。 该群集仅适用于DEV / TEST部署,每2至3个月刷新一次。
要将应用程序部署在HyperGrid群集上,用户可以导航到“ 库”页面,单击“ 自定义” ,然后选择可用的HyperGrid群集。
访问正在运行的容器的浏览器内终端
在“ 应用程序”页面上,容器名称旁边应有一个命令提示符图标。 这允许用户通过代理消息队列使用安全的通信协议进入容器。 租户管理员可以定义命令白名单,以确保用户不会对正在运行的容器进行任何有害更改。
例如,对于ASP.NET部署,我们使用命令提示符来确保应用程序代码确实在/ app目录下。
监视正在运行的容器的CPU,内存和I / O利用率
一旦应用程序启动并运行,用户便可以监视正在运行的容器的CPU,内存和I / O,以在这些指标超过预定义的阈值时获得警报。 特别是在执行功能和负载测试时。
用户可以执行历史监视分析,并将问题与容器更新或构建部署相关联。 这可以通过单击统计链接来完成。 可以选择一个自定义日期范围以历史查看CPU,内存和I / O。
将新映像推入注册表时替换(重新部署)容器
对于希望遵循“不可变”容器模型的开发人员,通过重建包含应用程序代码的Docker映像并在每次应用程序更新时拆分新的容器,HyperForm提供了自动容器替换工作流,该工作流将注册表中的最新映像提取并替换为运行中的容器。最新图片。
要设置容器重新部署(或替换)配置文件,用户可以从“ 操作”菜单中选择“ 容器重新部署配置文件 ” 。
然后,用户可以选择存储的Docker注册表之一,并输入替换正在运行的容器时应使用的映像的名称。 要注册Docker Hub,Nexus,Artifactory或Quay帐户,用户应导航至Cloud Providers ,然后单击+以选择Docker Registries 。
向外扩展ASP.NET应用程序
如果正在运行的应用程序变得资源受限,则用户可以扩展应用程序以满足不断增长的负载。 此外,例如,用户可以在工作时间安排向外扩展,在周末安排向外扩展。
要将ASP.NET容器的群集从1扩展到2,用户可以单击正在运行的应用程序的“ 操作”菜单,然后选择“ 扩展” 。 然后,用户可以为群集指定新的大小,然后单击“立即运行” 。
将自动触发为负载平衡器配置的服务发现插件(即Nginx或Apache HTTP),以将新应用程序服务器的容器IP注入默认配置文件中,以促进对正确服务的负载平衡。
应用程序时间轴可用于跟踪对应用程序所做的每个更改,以进行审核和诊断。 可以从正在运行的应用程序页面底部的可扩展菜单中访问它。
当容器或主机关闭或主机或容器的CPU和内存使用率超过定义的阈值时,警报和通知可用。
执行后置插件以更新应用程序
如果用户想通过利用ASP.NET动态编译( https://msdn.microsoft.com/zh-cn/library/ms366723.aspx )对ASP.NET应用程序进行简单更改,则可以使用自定义脚本插件可以调用in进行此类更新。
插件框架依赖于可以用BASH,PowerShell,Perl,Ruby或Python编写的自定义脚本,可以实现高级应用程序部署并促进与任何外部服务(包括存储,网络或监视解决方案)的快速集成。
为此,用户必须首先通过导航到Blueprints > Plug-ins创建一个插件 。
然后,从应用程序页面,用户可以从“ 操作”菜单中选择“ 插件运行” 。
然后,用户可以搜索该插件,并在需要时覆盖可用的参数(例如,URL以获取最新的ASP.NET文件)。 由于在此示例中使用了ASP.NET动态编译,因此不需要重新启动容器。 但是,对于需要快速重新启动容器的其他更新,则可以选择“ 重新启动”切换。
结论
容器化企业应用程序仍然是一个挑战,主要是因为现有的应用程序组合框架无法解决配置后的复杂依赖性,外部集成或应用程序生命周期管理任务。
HyperForm具有托管和内部部署版本,可解决所有这些挑战,并通过扩展了Docker Compose支持的高级应用程序组合框架简化了企业应用程序的容器化
- 可以在20多个不同生命周期阶段调用的高级插件 ,以实现服务发现,动态容器化和应用程序存储自动化,以及
- 数据注入以支持复杂的应用程序依赖关系。
在18个不同的云和虚拟化平台(包括HyperGrid,vSphere,OpenStack,AWS,Rackspace,Microsoft Azure,Google Compute Engine,DigitalOcean,IBM SoftLayer)上运行和管理简单的Docker的ASP.NET“ Hello MVC”和“ Hello Web”应用程序等),请确保您执行以下任一操作:
- 注册HyperForm SaaS - http: //dchq.io ,或
- 免费下载HyperForm内部标准版 — http://dchq.co/hyperform-on-premise.html
翻译自: https://www.javacodegeeks.com/2016/08/6-docker-net-app-templates-get-started-containers.html