eShopModernizing - 使用Windows容器和Azure现代化ASP.NET Web应用(MVC和WebForms)和N层应用(WCF + WinForms)
本仓库提供了三个假设的传统eShop Web应用示例(基于.NET Framework的传统ASP.NET WebForms和MVC,以及基于WCF服务和WinForms桌面客户端应用的N层应用),并展示了如何使用Windows容器和Azure云将它们现代化(提升和转移场景),部署选项包括:
- 在开发PC上使用Visual Studio和Docker for Windows进行本地构建和部署
- Azure容器实例(ACI)
- 普通Windows Server 2016虚拟机(VM)
- AKS Kubernetes编排集群
- 用于容器的Azure Web应用(Windows容器)
所有这些环境都可以部署到Azure云(如Wiki中所述),但您也可以将它们部署到本地服务器甚至其他公共云中。
相关指南/电子书
您可以下载相关的免费指南/电子书(第2版):
PDF下载:https://aka.ms/liftandshiftwithcontainersebook
使用Windows容器进行现代化显著改善了DevOps部署,无需更改应用程序的架构或C#代码。
示例应用是用于eShop内部后台的简单Web应用,供员工更新产品目录。 这两个应用都是简单的CRUD Web应用,用于更新SQL Server数据库中的数据。
请参见下面两个应用的截图。
现有ASP.NET Web应用的初始版本
开发环境中的容器化版本
UI和业务功能
WebForms和MVC应用在UI和业务功能方面非常相似。我们创建了两个版本,以便您可以根据现有应用使用的技术(ASP.NET MVC或Web Forms)进行比较。
Winforms + WCF应用
Winforms应用是一个目录管理工具,使用WCF作为后端。在这里阅读更多关于Winforms + WCF示例的信息。
部署到AZURE容器实例
部署到AZURE WINDOWS SERVER 2016虚拟机
部署到AKS(Azure Kubernetes服务)的KUBERNETES集群
部署到用于容器的AZURE WEB应用
快速入门:在本地Windows 10 PC上使用"Docker for Windows"运行所有应用
Wiki中有更详细的流程,但最快的入门方式是使用Docker for Windows在本地运行所有示例。打开"VS 2017(或2019)的开发人员命令提示符"(确保PATH中有正确的msbuild
),进入eShopModernizing根文件夹并运行build.cmd
脚本。
注意:当前版本使用netcoreapp3.0。您需要安装预览版SDK并将Visual Studio设置为"使用.NET Core SDK的预览版"(在选项 - 项目和解决方案 - .NET Core下)。
此脚本将:
- 构建MVC项目
- 构建Webforms项目
- 构建WCF后端项目
- 创建三个Docker镜像(Windows容器镜像):
eshop/modernizedwebforms
eshop/modernizedmvc
eshop/wcfservice
您可以通过在命令行运行docker images
来检查刚刚创建的Docker镜像:
最后,只需在仓库根目录运行docker-compose up
即可启动所有三个项目和一个SQL Server容器。容器启动后:
- MVC Web应用监听:
- Docker主机(PC)网卡IP的5115端口
- 容器内部IP的80端口
- Webforms Web应用监听:
- Docker主机(PC)网卡IP的5114端口
- 容器内部IP的80端口
- WCF服务监听:
- Docker主机(PC)网卡IP的5113端口
- 容器内部IP的80端口
注意 您应该能够使用
http://localhost:<端口>
访问所需的应用程序。
要从Docker主机本身(开发Windows PC)测试应用/容器,您需要使用内部IP(容器的IP)来访问应用程序。要查找内部IP,只需输入docker ps
即可找到容器ID:
然后使用命令docker inspect <容器ID> -f {{.NetworkSettings.Networks.nat.IPAddress}}
查找容器的IP,并使用该IP和80端口访问容器:
Windows容器Docker主机中的localhost回环限制
由于当前Windows版本中的默认NAT限制(参见https://blog.sixeyed.com/published-ports-on-windows-containers-dont-do-loopback/),您无法使用主机计算机上的localhost
访问容器。
这里也有更多信息:https://blogs.technet.microsoft.com/virtualization/2016/05/25/windows-nat-winnat-capabilities-and-limitations/
尽管从Build 17025开始已移除此限制(截至2018年初,仍仅适用于Windows Insider,非公开/稳定版本)。使用该版本(Windows 10 Build 17025或更高版本),应可通过"localhost"/127.0.0.1访问已发布的容器端口。
查看Wiki以获取如何设置和部署到多个环境的详细说明
Wiki:https://github.com/dotnet-architecture/eShopModernizing/wiki
选择内存中模拟数据或与SQL Server数据库的真实连接
MVC和WebForms Web应用允许连接到真实数据库以获取/更新产品目录,或者在数据库由于某种原因尚不可用而您需要测试/演示应用时使用模拟数据。
对于每个应用,可以在使用Windows容器时在docker-compose.override.yml文件中配置选择一种或另一种模式的选项,或者在尚未使用容器(原始版本)时在Web.config
文件中配置。