应用 Docker 让传统式 .NET 运用程序流程当代化

2021-02-25 10:56 jianzhan

应用 Docker 让传统式 .NET 运用程序流程当代化


应用 Docker 让传统式 .NET 运用程序流程当代化 我将先把全部运用程序流程原样挪动到 Docker 中,而不实行任何编码变更,随后在轻型器皿中运作网站和数据信息库。接下来,我将详细介绍1种作用驱动器型方式,用于拓展运用程序流程、提高特性并为客户出示自助式剖析。 作者:微软我国MSDN

15 年来,Microsoft .NET Framework 1直全是取得成功的运用程序流程服务平台,在旧版 Framework 和旧版 Windows Server 上运作的业务流程重要运用程序流程数不胜数。这些传统式运用程序流程仍具备很大的业务流程使用价值,但其维护保养、升級、拓展和管理方法难度将会很大。

一样,沒有任何理由能证实项目投资彻底重新写过这些运用程序流程是有效的。依靠在轻型器皿中运作运用程序流程的服务平台 Docker 和 Windows Server 2016,可以授予传统式运用程序流程全新升级的性命,不但能够完成更智能,还提高了安全性性和特性,更是朝着不断布署这个方位迈出了关键的1步,而不用建立耗时长且成本费高的再次转化成新项目。

在本文中,我将以联接 SQL Server 数据信息库的全部 ASP.NET WebForms 运用程序流程为例,运用 Docker 服务平台让其当代化。我将先把全部运用程序流程原样挪动到 Docker 中,而不实行任何编码变更,随后在轻型器皿中运作网站和数据信息库。接下来,我将详细介绍1种作用驱动器型方式,用于拓展运用程序流程、提高特性并为客户出示自助式剖析。依靠 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 上的任1 Microsoft 基础映像撰写你自身的 Dockerfile。

下面展现了详细的 Dockerfile,用于撰写脚本制作将 ASP.NET WebForms 运用程序流程装包到 Docker 映像中:

FROM microsoft/asp:windowsservercore⑴0.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

9行脚本制作我统统必须,其其实不涉及到运用程序流程变更。假定有1个 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,另外删掉默认设置网站并为运用程序流程新建1个部位已知的网站。

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 包括互联网堆栈。这样1来,器皿既能够根据虚似互联网互相浏览,还可以浏览在物理学互联网上运作的外界主机。假如 SQL Server 案例是在互联网中的1台测算机上运作,那末器皿中的 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个简易的商品公布微站)。图 1展现了在 Docker 中运作的网站的数据信息捕捉网页页面。

图 1:在 Docker 中运作的网站的申请注册页

运作 docker ps 将列出全部正在运作的器皿。1个是数据信息库,另外一个是 Web 运用程序流程,但能够同样方法对二者开展管理方法:运作 docker top 能够查询在器皿中运作的过程;运作 docker logs 能够查询运用程序流程的系统日志輸出;运作 docker inspect 能够查询公布的端口号和相关器皿的别的很多信息内容。1致性是 Docker 服务平台的关键优点。能够同样方法装包、派发和管理方法运用程序流程,不管其应用甚么技术性。

拆分全部运用程序流程的作用

至此,运用程序流程已在新型服务平台上运作,我能够刚开始让运用程序流程自身当代化了。尽管将全部运用程序流程细分为较小服务的工作中量十分浩大,但能够采用更有对于性的方式,将关键放在重要作用(如按时转变的作用)上,这样便可以布署有转变的作用的升级,而不用对全部运用程序流程实行重归检测。具备非作用性规定的作用能够获益于另外一种设计方案(即不用对运用程序流程开展彻底的管理体系构造复建),也是适合之选。

我将从修补特性难题下手。在现有编码中,运用程序流程同歩联接数据信息库来储存客户数据信息。这类方式的拓展性不佳。也便是说,假如有很多高并发客户,就会导致 SQL Server 短板。与信息序列开展多线程通讯是更具拓展性的设计方案。针对此作用,我能够将 Web 运用程序流程中的恶性事件公布到信息序列,随后将数据信息暂留编码移到用于解决此恶性事件信息的新组件中。

此设计方案的确也具备很好的拓展性。假如出現网站总流量高峰期,我能够在更多主机上运作更多器皿,以解决传入的恳求。在信息解决程序流程解决恶性事件信息前,它们会1直保存在序列中。针对沒有特殊 SLA 的作用,能够在1个器皿中运作1个信息解决程序流程,并依靠信息序列的确保,即全部恶性事件最后都会获得解决。针对 SLA 驱动器型作用,能够根据运作更多的信息解决程序流程器皿来拓展暂留层。

本文随附的源码包括运用程序流程版本号 1、2 和 3 的文档夹。在版本号 2 中,SignUp.aspx 网页页面在客户递交详尽信息内容表单时公布恶性事件:

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

另外,在版本号 2 中,有1个共享资源的信息传输新项目,用于提撤销息序列的详尽信息内容;也有1个操纵台运用程序流程,用于侦听 Web 运用程序流程公布的恶性事件,并将客户数据信息储存到数据信息库。操纵台运用程序流程中的暂留编码立即取自 Web 运用程序流程中的版本号 1 编码,因此完成编码是1样的,不一样的地方在于作用设计方案早已过当代化。

运用程序流程的新版本号是包括很多工作中构件的已派发处理计划方案,如图 2所示。

图 2:历经当代化的运用程序流程包括很多工作中构件

组件之间有依靠项,务必以正确的次序起动,这样处理计划方案才可以一切正常运作。这是分配跨很多器皿运作的运用程序流程的业务流程步骤时遭遇的难题之1,而以便处理此难题,Docker 服务平台将已派发的运用程序流程看作 1等中国公民 。

应用 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 器皿务必坐落于同1虚似 Docker 互联网中,才可以浏览这些器皿。因而,Docker Compose 文档中的全部器皿都会连接到同1虚似互联网 app- 中。

在 Docker Compose 文档中的别的部位,我应用 Docker Hub 上的 Microsoft 映像界定 SQL Server 服务,并应用 NATS 信息传输系统软件界定信息序列服务(这是特性非凡的对外开放源码信息序列)。NATS 是 Docker Hub 上的官方映像。最后界定的是信息解决程序流程服务,这是应用简易的 Dockerfile 装包成 Docker 映像的 .NET 操纵台运用程序流程。

如今,我可使用下列 Docker Compose 指令行运作运用程序流程:

docker-pose up -d

Docker Compose 会按正确的次序起动每一个组件的器皿,只需1个指令便可认为我出示合理的处理计划方案。有权浏览 Docker 映像和 Docker Compose 文档的任何人都可以以运作运用程序流程,且个人行为方法是同样的,不管是在 Windows 10 笔记本电脑上上,還是在或 Azure 中运作的 Windows Server 2016 测算机上。

针对版本号 2,我略微变更了1下运用程序流程编码,将作用完成编码从1个组件移到另外一个组件。尽管最后客户个人行为方法是同样的,但如今处理计划方案易于拓展,由于 Web 层与数据信息层分离出来,信息序列负责解决任何总流量峰值。新设计方案也易于拓展,由于我引进了恶性事件驱动器型管理体系构造,从而能够根据连接现有恶性事件信息来开启新个人行为。

加上自助式剖析

针对我的示例运用程序流程,我将再变更1下编码,以表明应用 Docker 服务平台只需非常少的工作中便可完成许多作用。运用程序流程当今应用 SQL Server 做为事务管理数据信息库,我将加上第2个数据信息储存做为表格数据信息库。这样1来,我能够独立解决表格和事务管理难题,并能随意挑选技术性堆栈。

在示例编码的版本号 3 中,我加上了新的 .NET 操纵台运用程序流程,用于侦听 Web 运用程序流程公布的同1恶性事件信息。当两个操纵台运用程序流程另外运作时,NATS 信息序列会保证两个运用程序流程都能得到全部恶性事件的副本。新的操纵台运用程序流程会接受恶性事件,并在 Elasticsearch(能够在 Windows Docker 器皿中运作的对外开放源码文本文档储存)中储存客户数据信息。此时,Elasticsearch 是理想化之选,既由于它具备优良的拓展性,便于我可以出于冗余考虑到跨好几个器皿对它开展汇聚,也由于它出示了10分有效的朝向客户的 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 设定维持1致便可。

新器皿起动后,我能够运作 docker inspect 获得 Kibana 器皿的 IP 详细地址,随后转到此详细地址上的端口号 5601。Kibana 有1个十分简易的插口,我能够在几分钟内就转化成1个仪表盘板,用于显示信息应用详尽信息内容登陆的客户的重要指标值,如图 3所示。

图 3:Kibana 仪表盘板

Power User 很快便可以上手应用 Kibana,可以制做自身的可视性化实际效果和仪表盘板,而不用涉及到 IT 层面。在沒有任何因障時间的状况下,我就向运用程序流程加上了自助式剖析。此作用的关键源于我从 Docker Hub 拉取到处理计划方案中的公司级对外开放源码手机软件。向文本文档储存出示数据信息的自定组件是简易的 .NET 操纵台运用程序流程,只需约 100 行编码便可完成。Docker 服务平台负责将组件连接在1起。

在 Azure 上运作历经 Docker 解决的处理计划方案

Docker 的另外一大优点是可移殖性。装包到 Docker 映像中的运用程序流程的运作方法与在任何主机上的运作方法彻底同样。本文最后转化成的运用程序流程应用 Microsoft 有着的 Windows Server 和 SQL Server 映像、Docker 管理方法的 NATS 映像和我自身的自定映像。全部这些映像均在 Docker Hub 上公布,因而任何 Windows 10 或 Windows Server 2016 测算机都可拉取映像,并根据这些映像运作器皿。

如今,我的运用程序流程已可供检测,将其布署到 Aure 上的共享资源自然环境10分简易。我根据融合应用 Windows Server 2016 Datacenter 和 器皿 选项,在 Azure 中建立了虚似机 (VM)。在 VM 映像中,已安裝并配备 Docker,而且已免费下载 Windows Server Core 和 Nano Server 的基础 Docker 映像。VM 中未包括的1项是 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 文档)可立即确立取代手动式布署文本文档。这两个重要新项目提倡的是全自动化实际操作,可便捷你在任何1台测算机上1致地转化成、传输和运作处理计划方案,全部全过程十分简易。

后续流程

假如你热衷于于亲身尝试 Docker,最好是从 Image2Docker PowerShell 控制模块下手;它能够为你转化成 Dockerfile,让你迅速刚开始学习培训。上完全免费出示了1些独立操控进度的优良课程,这些课程为你预配了自然环境。随后,若要再次深层次,请查询 GitHub 上的 Docker 试验室,在其中出示了很多 Windows 器皿演习。

全球全国各地都有 Docker 聚会活动,你能够倾听从事人员和权威专家讨论 Docker 的各个方面。Docker 盛会 DockerCon 一直人头攒动。2020年将于 4 月和 10 月各自在德克萨斯州和哥本哈根市举办。最终,请关心 Docker Captain(在 Docker 行业等同于于 Microsoft MVP)。她们常常在blog和 Twitter 上详细介绍她们应用 Docker 所完成的酷炫作用,关心她们能够合理掌握技术性脉搏。

Elton Stoneman持续7届荣获 Microsoft MVP,不但是 Pluralsight 作者,還是 Docker 的开发设计大使。自 2000 年起,他就1直在应用 Microsoft 技术性结构并交货取得成功的处理计划方案,近期的工作中涉及到 API 和 Azure 新项目,和应用 Docker 的已派发运用程序流程。

衷心谢谢下列技术性权威专家对本文的审查: Mark Heath

Mark Heath 是潜心于 Azure 的 .NET 开发设计者,不但是 NAudio 的建立者,還是 Pluralsight 作者。能够在他的blog () 和 Twitter () 上关心他。


2019-07⑶1 10:31:00 边沿测算 公司务必进到云端吗?能够进到边沿测算 现如今物连接网络的运用愈来愈普遍,但必须具备公司的视角。这代表着竖直制造行业运用程序流程、开发设计绿色生态系统软件、商品设计方案、硬件配置、布署等。
2019-07⑶1 10:19:00 云资讯 谷歌牵手VMware将虚似化工厂作负载引进谷歌云 彭博社报导称,谷歌与VMware正在进行协作,协助公司更轻轻松松地在Google Cloud Platform上运作VMware vSphere虚似化手机软件和互联网专用工具。
2019-07⑶1 09:52:00 云资讯 谷歌与戴尔旗下云计算技术企业VMware创建新协作 尝试追逐市场竞争对手 据海外新闻媒体报导,本地時间周1,谷歌公布与戴尔旗下的云计算技术企业VMware创建新的协作小伙伴关联,协助更多公司转移到云端,从而尝试追逐其市场竞争对手。
2019-07⑶1 09:10:00 云计算技术 云计算技术时期,硬件配置为何依然十分关键? 加利福尼亚大学圣迭戈分校选用了“云优先选择”的发展战略,她们取代了3台大中型机、将尽量多的测算工作中负载迁移到云端、尽量舍弃內部布署手机软件,转而应用手机软件即服务。