地  址:江苏省南京市玄武区玄武湖
电  话:4008-888-888
邮  箱:9490489@qq.com
商  务QQ:6777101068
大型门户网站建设:利用 Docker 让传统 .NET 应用程序现代化
作者:管理员    发布于:2020-05-28 01:02   文字:【】【】【
利用 Docker 让传统 .NET 应用程序现代化 我将先把整个应用程序原样挪动到 Docker 中,而不执行任何代码更改,而后在轻型容器中运转网站和数据库。接下来,我将先容一种功用驱动型办法,用于扩展应用程序、晋升性能并为用户提供自助式分析。 作者:微软中国MSDN

15 年来,Microsoft .NET Framework 始终都是成功的应用程序平台,在旧版 Framework 和旧版 Windows Server 上运转的事务要害应用程序不可胜数。这些传统应用程序仍具有很大的事务代价,但其维护、晋级、扩展和治理难度可能很大。

相同,没有任何理由能证实投资彻底重写这些应用程序是正当的。借助在轻型容器中运转应用程序的平台 Docker 和 Windows Server 2016,可以赋予传统应用程序全新的生命,不只能够完成更多功用,还晋升了平安性和性能,更是朝着继续布置这个方向迈出了重要的一步,而无需创立耗时长且本钱高的从头生成项目。

在本文中,我将以连贯 SQL Server 数据库的整个 ASP.NET WebForms 应用程序为例,使用 Docker 平台让其现代化。我将先把整个应用程序原样挪动到 Docker 中,而不执行任何代码更改,而后在轻型容器中运转网站和数据库。接下来,我将先容一种功用驱动型办法,用于扩展应用程序、晋升性能并为用户提供自助式分析。借助 Docker 平台,你将了解怎么迭代应用程序的新版本、平安疾速地晋级组件,以及怎么向 Microsoft Azure 布置完整的解决方案。

Docker 怎么在 .NET 解决方案中大展拳脚

Docker 适用于效劳器应用程序,包含网站、API、音讯传送解决方案以及在后盾运转的别的组件。不克不及在 Docker 中运转桌面应用程序,由于 Docker 平台和 Windows 主机之间没有 UI 集成。因而,无奈在容器中运转 Windows 窗体或 Windows Presentation Foundation (WPF) 应用程序(虽然能够利用 Docker 打包和分发这些桌面应用程序),但 Windows Communication Foundation (WCF)、.NET 管束台应用程序和所有品种的 ASP.NET 应用程序都是适宜之选。

若要打包应用程序以供在 Docker 中运转,需要编写小型脚本文件 Dockerfile,用于主动执行所有应用程序布置步骤。这通常包含 Windows PowerShell 配置命令,以及用于复制应用程序内容和设置所有依赖项的指令。也能够解紧缩已紧缩的存档或装配 MSI,但打包步调全都是主动执行的,因而不克不及运转利用 Windows UI 并需要用户输入的装配步调。

经过查看解决方案系统结构来定夺哪些局部能够在 Docker 容器中运转时,请注意,不利用 Windows UI 即可进行装配和运转的任何组件都是适宜之选。本文将重点放在 .NET Framework 应用程序上,但你能够在 Windows 容器中运转 Windows Server 上运转的任何应用程序,包含 .NET Core、Java、Node.js 和 Go 应用程序。

将 .NET 应用程序迁移到容器中

怎么迁移到 Docker 取决于应用程序的其时运转方式。如果是在 Hyper-V VM 中运转的彻底配置应用程序,开放源代码 Image2Docker 东西能够从 VM 的磁盘主动生成 Dockerfile。如果有效于颁布 MSI 或 WebDeploy 包的生成步调,能够利用 Docker Hub 上的任一 Microsoft 根本映像编写你本人的 Dockerfile。

下面展现了完整的 Dockerfile,用于编写脚本将 ASP.NET WebForms 应用程序打包到 Docker 映像中:

FROM microsoft/asp:windowsservercore-10.0.14393.693SHELL ["powershell"]RUN Remove-Website -Name 'Default Web Site'; New-Item -Path 'C:web-app' -Type Directory; New-Website -Name 'web-app' -PhysicalPath 'C:web-app' -Port 80 -ForceEXPOSE 80RUN Set-ItemProperty -Path 'HKLM:SYSTEMCurrentControlSetServicesDnscacheParameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWordCOPY ProductLaunch.Web /web-app

九行脚本我全都需要,其其实不触及应用程序更改。假设有一个 ASP.NET 2.0 应用程序,其时在 Windows Server 2003 上运转。利用上面的 Dockerfile,我能够在映像中生成此应用程序,该映像可当即将此应用程序晋级到 Windows Server 2016 和 .NET Framework 4.5。我将一一先容下面这些指令:

FROM microsoft/asp 指示 Docker 从哪一个映像下手。在此示例中,从在 Windows Server Core 特定版本根底之上装配 IIS 和 ASP.NET 的 Microsoft 映像下手。

SHELL ["powershell"] 针对 Dockerfile 的残余局部变为差别的 shell,以便我能够运转 PowerShell cmdlet。

RUN Remove-Website 利用 PowerShell 设置 IIS,同时删除默许网站并为应用程序新建一个地位已知的网站。

EXPOSE 80 显式公然端口 80,以允许网络流量在 Docker 容器默许被锁定时流入容器。

RUN Set-ItemProperty 禁用映像内的 Windows DNS 缓存,以便 Docker 可以响应所有 DNS 申请。

COPY ProductLaunch.Web 将主机上 ProductLaunch.Web 目录中已颁布的网站项目复制到映像中。

Dockerfile 相似于 Web 应用程序的布置指南,但它不是意义模糊的用户文档,而是意义准确的可操作脚本。为了生成打包的应用程序,我从包括 Dockerfile 和已颁布的网站的目录运转 Docker 生成命令:

docker build --tag sixeyed/msdn-web-app:v1 .

此命令生成名为 sixeyed/msdn-web-app 且标记为 v1 的 Docker 映像。此名称包括我的 Hub 用户帐户名称 (sixeyed),因而我能够利用本人的把柄登录,并将这个映像颁布到 Hub,从而同享它。标记可用于对映像进行版本管束,因而在打包应用程序的新版本时,映像名称将保持不变,但标记会酿成 v2。

我目前能够经过映像运转容器,这将会启动应用程序,但示例应用程序依赖 SQL Server,因而我有必要先运转 SQL Server,而后才能启动网站。

从 Docker Hub 拉取依赖项

Docker 包括网络堆栈。这样一来,容器既能够经过虚构网络互相拜访,也能够拜访在物理网络上运转的外部主机。如果 SQL Server 实例是在网络中的一台核算机上运转,那么容器中的 ASP.NET 应用程序能够利用它,我只要在连贯字符串中指定效劳器名称即可。我也能够在容器中运转 SQL Server,Web 应用程序将可以在连贯字符串中指定容器名称,从而拜访它。

SQL Server Express 坐落 Docker Hub 上 Microsoft 维护的映像中。为了经过此映像启动数据库容器,我将运转以下代码:

docker run --detach ` --publish 1433:1433 ` --env sa_password=MSDNm4g4z!n3 ` --env ACCEPT_EULA=Y ` --name sql-server ` microsoft/mssql-server-windows-express

这会在后盾启动具有拆离标记的容器,并颁布端口 1433,以便我能够从外部连贯容器中的 SQL 实例(可能在主机上利用 SQL Server Management Studio)。env 选项是键值对,Docker 在容器内将其公然为体系环境变量。SQL Server 映像利用这些值来确认许可协定是否已被承受,并为 sa 用户设置密码。

Docker 有必要先在本地复制映像,而后才能运转容器。分发内容会在 Docker 平台中生成。因而,如果在运转此命令时没有本地 SQL Server Express 映像,Docker 将会从 Hub 下载。Docker Hub 上有超过 50 万个映像,这些映像已被下载超过 90 亿次。Docker 始于 Linux,其间大局部映像是 Linux 应用程序,但优质的 Windows 应用程序也愈来愈多,可供你下载并间接应用到解决方案中。

目前,SQL Server 在 Docker 容器中运转,我的 Web 应用程序在连贯字符串中将 sql-server 指定为主机名,以便连贯在 Docker 中运转的数据库。我能够在后盾启动 WebForms 应用程序,并颁布端口 80,让网站可供拜访:

docker run --detach ` --publish 80:80 ` sixeyed/msdn-web-app:v1

如果外部核算机在端口 80 上向我的主机发送申请,Docker 会接管申请,并通明地将申请转发给容器中运转的 ASP.NET 应用程序。如果我利用的是主机,则需要运转 docker inspect 获取容器的 IP 地点,而后转到容器即可显示网站(这是一个简单的产物颁布微站)。图 1展现了在 Docker 中运转的网站的数据捕获页面。

图 1:在 Docker 中运转的网站的注书页

运转 docker ps 将列出所有正在运转的容器。一个是数据库,另外一个是 Web 应用程序,但能够同样方式对两者进行治理:运转 docker top 能够查看在容器中运转的步调;运转 docker logs 能够查看应用程序的日志输出;运转 docker inspect 能够查看公然的端口以及有关容器的别的许多信息。共鸣性是 Docker 平台的主要上风。能够同样方式打包、分发和治理应用程序,无论其利用什么技能。

拆分整个应用程序的功用

至此,应用程序已在新式平台上运转,我能够初步让应用程序自身现代化了。尽管将整个应用程序细分红较小效劳的事件量十分浩大,但能够采取更有针对性的办法,将重点放在要害功用(如守时变化的功用)上,这样就能布置有变化的功用的更新,而无需对整个应用程序执行回归测试。具有非功用性要求的功用能够获益于另外一种设计(即无需对应用程序进行彻底的系统结构重建),也是适宜之选。

我将从修复性能问题下手。在现有代码中,应用程序同步连贯数据库来保存用户数据。这种办法的扩展性欠安。也就是说,如果有许多并发用户,就会造成 SQL Server 瓶颈。与音讯行列进行异步通讯是更具扩展性的设计。关于此功用,我能够将 Web 应用程序中的工作颁布到音讯行列,而后将数据暂留代码移到用于办理此工作音讯的新组件中。

此设计的确也具有很好的扩展性。如果呈现网站流量顶峰,我能够在更多主机上运转更多容器,以办理传入的申请。在音讯办理程序办理工作音讯前,它们会始终保留在行列中。关于没有特定 SLA 的功用,能够在一个容器中运转一个音讯办理程序,并依赖音讯行列的保证,即所有工作最终都会得处处理。关于 SLA 驱动型功用,能够经过运转更多的音讯办理程序容器来扩展暂留层。

本文随附的源代码包括应用程序版本 1、2 和 3 的文件夹。在版本 2 中,SignUp.aspx 页面在用户提交具体信息表单时颁布工作:

vareventMessage = newProspectSignedUpEvent{ Prospect = prospect, SignedUpAt = DateTime.UtcNow};MessageQueue.Publish(eventMessage);

此外,在版本 2 中,有一个同享的音讯传送项目,用于提撤销息行列的具体信息;另有一个管束台应用程序,用于侦听 Web 应用程序颁布的工作,并将用户数据保存到数据库。管束台应用程序中的暂留代码间接取自 Web 应用程序中的版本 1 代码,以是完成代码是一样的,差别的地方在于功用设计现已过现代化。

应用程序的新版本是包括许多事件部件的已分发解决方案,如图 2所示。

图 2:通过现代化的应用程序包括许多事件部件

组件之间有依赖项,有必要以正确的顺序启动,这样解决方案才能正常运转。这是安顿跨许多容器运转的应用程序的事务流程时面对的问题之一,而为了解决此问题,Docker 平台将已分发的应用程序视作 一等公民 。

利用 Docker Compose 安顿应用程序的事务流程

Docker Compose 属于 Docker 平台,主要办理对象是已分发的应用程序。在简单文本文件中将应用程序的所有局部界说为各个效劳,包含组件之间的依赖项及其需要的所有配置值。下面展现了局部版本 2 Docker Compose 文件,仅包括 Web 应用程序的配置:

product-launch-web: image: sixeyed/msdn-web-app:v2 ports: - "80:80" depends_on: - sql-server - message-queue works: - app-

此时,我要指定要对 Web 应用程序利用的映像版本。我颁布端口 80,而后显式申明 Web 应用程序依赖 SQL Server 和音讯行列容器。Web 容器有必要坐落同一虚构 Docker 网络中,才能拜访这些容器。因而,Docker Compose 文件中的所有容器都会联接到同一虚构网络 app- 中。

在 Docker Compose 文件中的别的地位,我利用 Docker Hub 上的 Microsoft 映像界说 SQL Server 效劳,并利用 NATS 音讯传送体系界说音讯行列效劳(这是性能卓越的开放源代码音讯行列)。NATS 是 Docker Hub 上的官方映像。最终界说的是音讯办理程序效劳,这是利用简单的 Dockerfile 打包成 Docker 映像的 .NET 管束台应用程序。

目前,我能够利用以下 Docker Compose 命令行运转应用程序:

docker-pose up -d

Docker Compose 会按正确的顺序启动每一个组件的容器,只要一个命令就能为我提供有用的解决方案。有权拜访 Docker 映像和 Docker Compose 文件的任何人都能够运转应用程序,且行为方式是同样的,无论是在 Windows 10 笔记本电脑上,仍是在或 Azure 中运转的 Windows Server 2016 核算机上。

关于版本 2,我略微更改了一下应用程序代码,将功用完成代码从一个组件移到另外一个组件。尽管最终用户行为方式是同样的,但目前解决方案易于扩展,由于 Web 层与数据层分离,音讯行列负责办理任何流量峰值。新设计也易于扩展,由于我引入了工作驱动型系统结构,从而能够经过联接现有工作音讯来触发新行为。

增加自助式分析

关于我的示例应用程序,我将再更改一下代码,以讲解利用 Docker 平台只要很少的事件即可完成大量功用。应用程序其时利用 SQL Server 当做业务数据库,我将增加第二个数据存储当做报表数据库。这样一来,我能够单方办理报表和业务问题,并能自在挑选技能堆栈。

在示例代码的版本 3 中,我增加了新的 .NET 管束台应用程序,用于侦听 Web 应用程序颁布的同一工作音讯。当两个管束台应用程序同时运转时,NATS 音讯行列会包管两个应用程序都能取得所有工作的副本。新的管束台应用程序会接管工作,并在 Elasticsearch(能够在 Windows Docker 容器中运转的开放源代码文档存储)中保存用户数据。此时,Elasticsearch 是理想之选,既由于它具有杰出的扩展性,以便我可以出于冗余思考跨多个容器对它进行汇集,也由于它提供了非常有效的面向用户的 Kibana 前端。

因为自版本 2 我没有对 Web 应用程序或 SQL Server 音讯办理程序进行任何更改,以是在 Docker Compose 文件中,我仅为 Elasticsearch 和 Kibana 以及将文档写入 Elasticsearch 索引的新音讯办理程序增加新效劳:

index-prospect-handler: image: sixeyed/msdn-index-handler:v3 depends_on: - elasticsearch - message-queue works: - app-

Docker Compose 能够对应用程序进行增量晋级,不会更换其界说与 Docker Compose 文件中的效劳匹配的正在运转的容器。示例应用程序的版本 3 中新增了效劳,但没有对现有效劳进行更改。因而,当我运转 docker-pose up d 时,Docker 会为 Elasticsearch、Kibana 和索引音讯办理程序运转新容器,而别的效劳的容器则按原样运转,这就形成了十分平安的晋级步调,无需让应用程序脱机,即可增加功用。

此应用程序更偏向于约好,而不是配置。因而,依赖项(如 Elasticsearch)的主机名在应用程序中设置为默许名称,我只要包管容器名称在 Docker Compose 设置保持共鸣即可。

新容器启动后,我能够运转 docker inspect 获取 Kibana 容器的 IP 地点,而后转到此地点上的端口 5601。Kibana 有一个十分简单的接口,我能够在几分钟内就生成一个仪表板,用于显示利用具体信息登录的用户的要害指标,如图 3所示。

图 3:Kibana 仪表板

Power User 很快就能上手利用 Kibana,可以制造本人的可视化效果和仪表板,而无需触及 IT 层面。在没有任何以障工夫的状况下,我就向应用程序增加了自助式分析。此功用的核心源于我从 Docker Hub 拉取到解决方案中的企业级开放源代码软件。向文档存储提供数据的自界说组件是简单的 .NET 管束台应用程序,只要约 100 行代码即可完成。Docker 平台负责将组件联接在一块儿。

在 Azure 上运转通过 Docker 办理的解决方案

Docker 的另外一大上风是可移植性。打包到 Docker 映像中的应用程序的运转方式与在任何主机上的运转方式彻底同样。本文最终生成的应用程序利用 Microsoft 领有的 Windows Server 和 SQL Server 映像、Docker 治理的 NATS 映像和我本人的自界说映像。所有这些映像均在 Docker Hub 上颁布,因而任何 Windows 10 或 Windows Server 2016 核算机均可拉取映像,并经过这些映像运转容器。

目前,我的应用程序已可供测试,将其布置到 Aure 上的同享环境非常简单。我经过结合利用 Windows Server 2016 Datacenter 和 容器 选项,在 Azure 中创立了虚构机 (VM)。在 VM 映像中,已装配并配置 Docker,而且已下载 Windows Server Core 和 Nano Server 的根本 Docker 映像。VM 中未包括的一项是 Docker Compose,我已从 GitHub 颁布页进行下载。

我的 Docker Compose 文件中利用的映像均坐落 Docker Hub 上的公用存储库中。如果是私有软件堆栈,你可能其实不盼望所有映像都公然。仍能够利用 Docker Hub,并将这些映像保留在私有存储库中,也能够利用托管的注册表,如 Azure 容器注册表。在你本人的数据中间内,能够利用本地选项,如 Docker 信赖的注册表。

因为我的所有映像都是公然的,因而我只要将 Docker Compose 文件复制到 Azure VM,而后运转 docker-pose up d 即可。Docker 会从 Hub 拉取所有映像,并按正确的顺序经过这些映像运转容器。每一个组件均利用约好来拜访别的组件,这些约好已内置到 Docker Compose 文件中。因而,即便是在全新的环境中,解决方案也仍会按预期启动和运转。

如果利用的是企业软件版本,即设置新环境是有危险的轻慢手动步调,便能感遭到 Windows Server 2016 和 Docker 平台带来的高大上风。Docker 解决方案中的要害项目(Dockerfile 和 Docker Compose 文件)可间接明确代替手动布置文档。这两个要害项目倡导的是主动化操作,可方便你在任何一台核算机上共鸣地生成、传送和运转解决方案,整个过程十分简单。

后续步骤

如果你热衷于亲身尝试 Docker,最好从 Image2Docker PowerShell 模块下手;它能够为你生成 Dockerfile,让你疾速初步借鉴。上免费提供了一些自主掌控进度的优质课程,这些课程为你预配了环境。而后,若要持续深刻,请查看 GitHub 上的 Docker 试验室,其间提供了许多 Windows 容器演练。

世界各地都有 Docker 团聚,你能够倾听从业人员和专家议论 Docker 的各个方面。Docker 盛会 DockerCon 总是座无虚席。本年将于 4 月和 10 月别离在德克萨斯州和哥本哈根市举办。最后,请重视 Docker Captain(在 Docker 范畴同等于 Microsoft MVP)。他们常常在博客和 Twitter 上先容他们利用 Docker 所完成的炫酷功用,重视他们能够有用掌握技能脉搏。

Elton Stoneman接连七届荣获 Microsoft MVP,不只是 Pluralsight 作者,仍是 Docker 的开发大使。自 2000 年起,他就始终在利用 Microsoft 技能构造并交给成功的解决方案,最近的事件触及 API 和 Azure 项目,以及利用 Docker 的已分发应用程序。

衷心感激以下技能专家对本文的检阅: Mark Heath

Mark Heath 是专心于 Azure 的 .NET 开发者,不只是 NAudio 的创立者,仍是 Pluralsight 作者。能够在他的博客 () 和 Twitter () 上重视他。


2019-07-31 10:31:00 边沿核算 企业有必要进入云端吗?能够进入边沿核算 现今物联网的应用愈来愈遍及,但需要具有企业的视角。这意味着笔直行业应用程序、开产生态体系、产物设计、硬件、布置等。
2019-07-31 10:19:00 云资讯 谷歌牵手VMware将虚构化事件负载引入谷歌云 彭博社报导称,谷歌与VMware正在打开互助,协助企业更轻松地在Google Cloud Platform上运转VMware vSphere虚构化软件和网络东西。
2019-07-31 09:52:00 云资讯 谷歌与戴尔旗下云核算公司VMware成立新互助 试图追逐竞争对手 据外洋媒体报导,地方工夫周一,谷歌发表与戴尔旗下的云核算公司VMware成立新的互助同伴关系,协助更多企业迁移到云端,从而试图追逐其竞争对手。
2019-07-31 09:10:00 云技能 云核算年代,硬件为什么依然十分重要? 加利福尼亚大学圣迭戈分校采用了“云优先”的战略,他们筛选了三台大型机、将尽量多的核算事件负载转移到云端、尽量抛弃内部布置软件,转而利用软件即效劳。
Copyright © 2002-2020 h5在线制作免费_免费建站的网站 网页_免费制作网站_在线建站_网站制作价格 版权所有 (网站地图
地址:江苏省南京市玄武区玄武湖 电话:4008-888-888
邮箱:9490489@qq.com QQ:6777101068