15 年來,Microsoft .NET Framework 一直都是樂成的應(yīng)用措施平臺,在舊版 Framework 和舊版 Windows Server 上運(yùn)行的業(yè)務(wù)要害應(yīng)用措施不行勝數(shù)。這些傳統(tǒng)應(yīng)用措施仍具有很大的業(yè)務(wù)代價(jià),但其維護(hù)、進(jìn)級、擴(kuò)展和打點(diǎn)難度大概很大。
同樣,沒有任何來由能證明投資完全重寫這些應(yīng)用措施是公道的。借助在輕型容器中運(yùn)行應(yīng)用措施的平臺 Docker 和 Windows Server 2016,可以或許賦予傳統(tǒng)應(yīng)用措施全新的生命,不只可以實(shí)現(xiàn)更多成果,還晉升了安詳性和機(jī)能,更是朝著一連陳設(shè)這個(gè)偏向邁出了重要的一步,而無需建設(shè)耗時(shí)長且本錢高的從頭生成項(xiàng)目。
在本文中,我將以毗連 SQL Server 數(shù)據(jù)庫的整個(gè) ASP.NET WebForms 應(yīng)用措施為例,操作 Docker 平臺讓其現(xiàn)代化。我將先把整個(gè)應(yīng)用措施原樣移動(dòng)到 Docker 中,而不執(zhí)行任何代碼變動(dòng),然后在輕型容器中運(yùn)行網(wǎng)站和數(shù)據(jù)庫。接下來,我將先容一種成果驅(qū)動(dòng)型要領(lǐng),用于擴(kuò)展應(yīng)用措施、晉升機(jī)能并為用戶提供自助式闡明。借助 Docker 平臺,你將相識如何迭代應(yīng)用措施的新版本、安詳快速地進(jìn)級組件,以及如何向 Microsoft Azure 陳設(shè)完整的辦理方案。
Docker 如安在 .NET 辦理方案中大展拳腳
Docker 合用于處事器應(yīng)用措施,包羅網(wǎng)站、API、動(dòng)靜傳送辦理方案以及在靠山運(yùn)行的其他組件。不能在 Docker 中運(yùn)行桌面應(yīng)用措施,因?yàn)?Docker 平臺和 Windows 主機(jī)之間沒有 UI 集成。因此,無法在容器中運(yùn)行 Windows 窗體或 Windows Presentation Foundation (WPF) 應(yīng)用措施(盡量可以利用 Docker 打包和分發(fā)這些桌面應(yīng)用措施),但 Windows Communication Foundation (WCF)、.NET 節(jié)制臺應(yīng)用措施和所有種類的 ASP.NET 應(yīng)用措施都是符合之選。
若要打包應(yīng)用措施以供在 Docker 中運(yùn)行,需要編寫小型劇本文件 Dockerfile,用于自動(dòng)執(zhí)行所有應(yīng)用措施陳設(shè)步調(diào)。這凡是包羅 Windows PowerShell 設(shè)置呼吁,以及用于復(fù)制應(yīng)用措施內(nèi)容和配置所有依賴項(xiàng)的指令。也可以解壓縮已壓縮的存檔或安裝 MSI,但打包歷程全都是自動(dòng)執(zhí)行的,因此不能運(yùn)行利用 Windows UI 并需要用戶輸入的安裝歷程。
通過查察辦理方案體系布局來確定哪些部門可以在 Docker 容器中運(yùn)行時(shí),請留意,不利用 Windows UI 即可舉辦安裝和運(yùn)行的任何組件都是符合之選。本文將重點(diǎn)放在 .NET Framework 應(yīng)用措施上,但你可以在 Windows 容器中運(yùn)行 Windows Server 上運(yùn)行的任何應(yīng)用措施,包羅 .NET Core、Java、Node.js 和 Go 應(yīng)用措施。
將 .NET 應(yīng)用措施遷移到容器中
如何遷移到 Docker 取決于應(yīng)用措施的當(dāng)前運(yùn)行方法。假如是在 Hyper-V VM 中運(yùn)行的完全設(shè)置應(yīng)用措施,開放源代碼 Image2Docker 東西可以從 VM 的磁盤自動(dòng)生成 Dockerfile。假如有用于宣布 MSI 或 WebDeploy 包的生成歷程,可以利用 Docker Hub 上的任一 Microsoft 根基映像編寫你本身的 Dockerfile。
下面展示了完整的 Dockerfile,用于編寫劇本將 ASP.NET WebForms 應(yīng)用措施打包到 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
九行劇本我全都需要,其并不涉及應(yīng)用措施變動(dòng)。假設(shè)有一個(gè) ASP.NET 2.0 應(yīng)用措施,當(dāng)前在 Windows Server 2003 上運(yùn)行。利用上面的 Dockerfile,我可以在映像中生成此應(yīng)用措施,該映像可當(dāng)即將此應(yīng)用措施進(jìn)級到 Windows Server 2016 和 .NET Framework 4.5。我將逐個(gè)先容下面這些指令:
FROM microsoft/aspnet 指示 Docker 從哪個(gè)映像入手。在此示例中,從在 Windows Server Core 特定版本基本之上安裝 IIS 和 ASP.NET 的 Microsoft 映像入手。
SHELL ["powershell"] 針對 Dockerfile 的剩余部門變?yōu)椴町惖?shell,以便我可以運(yùn)行 PowerShell cmdlet。
RUN Remove-Website 利用 PowerShell 配置 IIS,同時(shí)刪除默認(rèn)網(wǎng)站并為應(yīng)用措施新建一個(gè)位置已知的網(wǎng)站。
EXPOSE 80 顯式公初步口 80,以答允網(wǎng)絡(luò)流量在 Docker 容器默認(rèn)被鎖按時(shí)流入容器。
RUN Set-ItemProperty 禁用映像內(nèi)的 Windows DNS 緩存,以便 Docker 可以或許響應(yīng)所有 DNS 請求。
COPY ProductLaunch.Web 將主機(jī)上 ProductLaunch.Web 目次中已宣布的網(wǎng)站項(xiàng)目復(fù)制到映像中。
Dockerfile 雷同于 Web 應(yīng)用措施的陳設(shè)指南,但它不是寄義恍惚的用戶文檔,而是寄義準(zhǔn)確的可操縱劇本。為了生成打包的應(yīng)用措施,我從包括 Dockerfile 和已宣布的網(wǎng)站的目次運(yùn)行 Docker 生成呼吁:
docker build --tag sixeyed/msdn-web-app:v1 .