.NET 5已經發布多時了,眾所周知,其對容器的支援又上了一個臺階。那麼主要有哪些變化呢,接下來我們一起來了解吧。
.NET 5 簡介
在開始之前,我們先來了解一下.NET 5。
.NET 5.0是.NET Core 3.1之後的.NET Core的下一個主要版本。微軟將此新版本命名為.NET 5.0而不是.NET Core 4.0的原因有兩個:
- 跳過版本號4.x,以避免與.NET Framework 4.x混淆。
- 從名稱中刪除了「 Core」,以強調這是.NET未來的主要實現。與.NET Core或.NET Framework相比,.NET 5.0支援更多型別的應用程式和平臺。
ASP.NET Core 5.0基於.NET 5.0,但保留名稱「 Core」以避免將其與ASP.NET MVC 5混淆。同樣,Entity Framework Core 5.0保留名稱「 Core」以避免將其與Entity Framework 5和6混淆。
值得注意的是,.NET 5並沒有計劃支援ASP.NET Web Form和Windows工作流(WF),因此.NET 5並不能完全代替.NET Framework。.NET 5的新增功能已經有很多朋友介紹過了,這裡我們這裡就不介紹了,有興趣的也可以直接檢視官方檔案。
.NET 5針對容器的支援和優化
本篇內容側重說明.NET 5 對容器的支援和優化。這裡我們先來看官方的態度:
- 持續投入大量資金支援
我們認為容器是最重要的雲趨勢,並在這方面投入了大量資金。我們正在以多種方式投資容器,在.NET軟體堆疊的多個級別上。首先是我們對基本面的投資,這越來越多地受到容器場景和部署容器應用的開發者的影響。
- 優化體驗
我們正在讓.NET與容器的共同作業變得更容易。我們已經新增了OpenTelemeter支援,這樣您就可以從您的應用程式中捕獲分散式跟蹤和指標。DotNet-monitor是一種新工具,旨在作為從.NET程序存取診斷資訊的主要方式。特別是,我們已經開始構建dotnet-monitor的容器變體,您可以將其用作應用程式側車。最後,我們正在構建DotNet/Tye,以此來提高微服務開發人員的工作效率,包括開發和部署到Kubernetes環境。
注意:Tye是一微軟開發的一個開發人員工具,可簡化開發,測試和部署微服務以及分散式應用程式。Tye包括一個本地協調器,以使開發微服務變得更加容易,並且能夠以最少的設定將微服務部署到Kubernetes。
Type是完全開源的,專案地址:https://github.com/dotnet/tye
官方部落格介紹:https://devblogs.microsoft.com/aspnet/introducing-project-tye/
- 支援cgroup v2
NET執行時現在支援cgroup v2,我們預計它將在2020年後成為與容器相關的重要API。Docker目前使用的是cgroup v1(已經被.NET支援)。相比之下,cgroup v2比cgroup v1更簡單、更高效、更安全。您可以通過我們2019年Docker更新瞭解更多關於cgroup和Docker資源限制的資訊。Linux發行版和容器執行時正在新增對cgroup v2的支援。一旦cgroup v2環境變得更加普遍,.Net 5.0將在cgroup v2環境中正常工作。這歸功於Omair Majid,他在Red Hat支援.NET。
- 提供Windows Server Core的映象
除了Nano Server,我們現在還發布Windows Server Core映象。我們新增了Server Core,是因為我們收到了客戶的反饋,他們想要一個與Windows Server完全相容的.NET映象。我們還進行了其他更改,以減小Windows伺服器核心映象的大小。這些改進帶來了很大的不同,但都是在Windows Server 2019釋出之後做出的。然而,它們將使下一個Windows Server LTSC版本受益。
- 更改倉庫名稱
作為使用「.NET」作為產品名稱的一部分,我們現在將.NET Core 2.1、3.1和.NET5.0映象釋出到mcr.microsoft.com/dotnet系列的Repos中,而不是釋出到mcr.microsoft.com/dotnet/core。我們將繼續將.NET Core 2.1和3.1雙重發布到以前的位置,同時支援這些版本。.Net 5.0影象將僅釋出到新位置。請相應地更新您的From語句和指令碼。
之前的名稱:
- dotnet/core: .NET Core
- dotnet/core/sdk: .NET Core SDK
- dotnet/core/aspnet: ASP.NET Core Runtime
- dotnet/core/runtime: .NET Core Runtime
- dotnet/core/runtime-deps: .NET Core Runtime Dependencies
- dotnet/core/samples: .NET Core Samples
- dotnet/core-nightly: .NET Core (Preview)
- dotnet/core-nightly/sdk: .NET Core SDK (Preview)
- dotnet/core-nightly/aspnet: ASP.NET Core Runtime (Preview)
- dotnet/core-nightly/runtime: .NET Core Runtime (Preview)
- dotnet/core-nightly/runtime-deps: .NET Core Runtime Dependencies (Preview)
新的名稱:
-
dotnet/samples -> available once .NET 5.0 releases as GA
- 減小映象大小,尤其是顯著的減少在多階段構建時執行時映象的大小
作為.NET5.0的一部分,微軟將SDK映象重新建立在ASP.NET映象之上,而不是構建包-dep,以顯著減小在多階段構建場景中拉取的聚合映象的大小。
此更改對於多階段構建有以下好處,其中包含一個範例Dockerfile:
Ubuntu 20.04 Focus的多階段構建成本:
Pull Image | Before | After |
---|---|---|
sdk:5.0-focal | 268 MB | 232 MB |
aspnet:5.0-focal | 64 MB | 10 KB (manifest only) |
減少了約: 100 MB (-30%)
Debian 10 Buster的多階段構建成本:
Pull Image | Before | After |
---|---|---|
sdk:5.0 | 280 MB | 218 MB |
aspnet:5.0 | 84 MB | 4 KB (manifest only) |
減少了約: 146 MB (-40%)
有關更多詳細資訊,請參見Dotnet/Dotnet-docker#1814。
此更改有助於多階段構建,其中SDK和您的目標aspnet或執行時映象的版本相同(我們預計這是常見的情況)。在進行此更改時,(例如)aspnet拉入將是不可行的,因為您將通過最初的SDK拉入拉出aspnet層。
圍繞對Alpine和Windows Nano Server做了類似的更改。Alpine和Nano Server都沒有Buildpack-dep映象。但是,Alpine和Nano Server的SDK映象之前並不是在ASP.NET映象之上構建的。
最後
從.NET Core開始到.NET 5,我們看到了微軟緊跟前沿技術踏實前進之心,我們也相信.NET尤其是隨著.NET 5的到來會讓.NET重鑄輝煌——積極擁抱前沿技術,完全開源,積極創新和改變,生產力爆棚,效能爆表,沒有理由不會越來越好。當然在我們使用的過程中,多少可能會遇到一些問題,但是容器方面的問題筆者很多都已經講過了,比如《如何讓Docker映象飛起來》和 《自動構建自己的ASP.NET Core基礎映象》。如果對容器完全沒有基礎,可以閱讀本人書籍: 《Docker+Kubernetes應用開發與快速上雲》以及【麥扣聊技術】公眾號的系列Docker教學文章。
最後,附上本人已構建好的騰訊雲.NET 5公共映象,以方便各位直接享用:
- ccr.ccs.tencentyun.com/magicodes/aspnetcore-runtime:5.0
- ccr.ccs.tencentyun.com/magicodes/aspnetcore-sdk:5.0
- ccr.ccs.tencentyun.com/magicodes/netcore-sdk:5.0
- ccr.ccs.tencentyun.com/magicodes/netcore-runtime:5.0
構建指令碼見本人的開源庫:https://github.com/xin-lai/aspnetcore-docker