我们已经使用 Docker 成功地做到了这一点。例如,我们使用以下 docker 镜像作为基础:
mcr.microsoft.com/dotnet/framework/aspnet:4.8-windowsservercore-ltsc2019
请注意,Microsoft 不再在 docker hub 上托管这些图像。
这是一个相当复杂的例子。如您所见,我们从预编译的 ASP.NET 应用程序构建映像,安装一些 IIS 模块,甚至拉取压缩模块扩展的安装程序。
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8-windowsservercore-ltsc2019
COPY OurSite c:/OurSite
# Enable IIS's Static Content, Static Content Compression and App Init modules
# Download & Install IIS compression extension (providing Brotli)
# Setting "staticCompressionIgnoreHitFrequency" attribute on "HttpCompression" tag in applicationHost.config (that's the only place we can set that attr)
# Remove Default Web Site
# Register a new site
# Set following properties on the Application Pool:
# - "Start Mode" to "AlwaysRunning" to ensure w3wp process always starts
# - "Idle Timeout" to 0 ensuring w3wp process doesn't get terminated due to inactivity.
# Recycle Application Pool
RUN Enable-WindowsOptionalFeature -Online -FeatureName IIS-ApplicationInit ; \
Enable-WindowsOptionalFeature -Online -FeatureName IIS-StaticContent ; \
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HttpCompressionStatic ; \
Invoke-WebRequest -Uri https://download.microsoft.com/download/6/1/C/61CC0718-ED0E-4351-BC54-46495EBF5CC3/iiscompression_amd64.msi \
-OutFile c:\iiscompression_amd64.msi ; \
Start-Process msiexec.exe -ArgumentList '-i', 'c:\iiscompression_amd64.msi', '/quiet', '/passive' -NoNewWindow -Wait ; \
Remove-Item c:\iiscompression_amd64.msi -Force ; \
$ConfigSection = Get-IISConfigSection -SectionPath "system.webServer/httpCompression" ; \
Set-IISConfigAttributeValue -ConfigElement $ConfigSection -AttributeName "staticCompressionIgnoreHitFrequency" -AttributeValue True ; \
Remove-WebSite -Name 'Default Web Site' ; \
New-Website -Name 'OurSite' -Port 80 -PhysicalPath 'c:\OurSite' -ApplicationPool '.NET v4.5' ; \
Import-Module WebAdministration ; \
Set-ItemProperty -Path 'IIS:\AppPools\.NET v4.5' -Name 'startMode' -Value 'AlwaysRunning' ; \
Set-ItemProperty -Path 'IIS:\Sites\OurSite' -Name 'applicationDefaults.preloadEnabled' -Value 'true' ; \
Set-ItemProperty -Path 'IIS:\AppPools\.NET v4.5' -Name 'processModel.idleTimeout' -Value '00:00:00' ; \
Restart-WebAppPool '.NET v4.5'
VOLUME c:\\data
EXPOSE 80
然后,我们将这些映像托管在安全的容器注册表中,创建一个 Service Fabric 项目(在 Visual Studio 中),该项目为我们提供了所需清单的模板,我们将使用该模板部署所需数量的容器。在部署时,Service Fabric 会读取您的清单,提取并缓存 docker 映像并相应地创建容器。不用说,您的清单必须包含有关注册表和相关凭据的信息。
旁注:切勿在清单中使用图像的“最新”标签,因为如前所述,Service Fabric 会缓存图像。另外,请记住配置您的集群以清理旧图像。否则,根据您的应用程序,您可能会很快耗尽空间。
更新:将 docker 镜像存储在 Aure ACR 中,可以使用托管服务标识,避免将注册表的凭据存储在清单中。可以授予分配给集群底层 VM 规模集的标识访问 ACR 以在部署期间下载 docker 映像。这样可以确保任何有权访问 SF 浏览器仪表板的人都看不到凭据(并且不必担心对清单中的秘密进行加密)。