社会焦点

使用 Docker 让传统 .NET 应用程序现代化

字号+ 作者: 来源: 2017-05-05

使用 Docker 让传统 .NET 应用程序现代化

  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/aspnet: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/aspnet 指示 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

    转载请注明出处。


    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • 在Apache Spark 2.0中使用DataFrames和SQL

      在Apache Spark 2.0中使用DataFrames和SQL

    • 京东宣布启动618 变革玩法并开放使用618标识

      京东宣布启动618 变革玩法并开放使用618标识

    • HTC Link 是一台与 U11 配套使用的 VR 眼镜

      HTC Link 是一台与 U11 配套使用的 VR 眼镜

    • OPPO R11使用全新人像优化功能,比你更懂自己的美

      OPPO R11使用全新人像优化功能,比你更懂自己的美