大家好,我是等天黑。
.NET 又雙叒叕出新功能了, 就在前幾天,.NET 團隊釋出部落格,宣稱在 .NET SDK 中內建了對 .NET 應用容器化的支援。
在正式介紹它之前,先通過一個簡單的例子,看下它是如何使用的。
# 建立一個新專案, 然後進入到資料夾
dotnet new mvc -n my-awesome-container-app
cd my-awesome-container-app
# 新增下面的程式包
#(目前需要手動引入, 後續會直接整合到 .NET SDK)
dotnet add package Microsoft.NET.Build.Containers
# 釋出專案
dotnet publish --os linux --arch x64 -p:PublishProfile=DefaultContainer
# 在容器中執行應用
docker run -it --rm -p 5010:80 my-awesome-container-app:1.0.0
然後存取 http://localhost:5010, 就已經可以看到這個測試的 .NET MVC 應用了。
注意,這裡需要安裝 .NET 7 preview 7 或以上版本,並且本機安裝並執行了 Docker。
容器化 .NET 應用是不是變得更加簡單方便了。
可能你已經有了疑問, 這是什麼魔法?我們熟悉的 Dockerfile 去哪了? 基礎映象是怎麼定義的?映象標籤是什麼?
是的,之前我們更熟悉使用 Dockerfile 的形式構建映象。而現在,可以在 .NET 專案中,設定 MSBuild 屬性來做同樣的事情,指定基礎映象,標籤等等。
要對 .NET 應用進行容器化,只需要在 project.csproj 中設定屬性即可,如下
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>my_awesome_container_app</RootNamespace>
</PropertyGroup>
<PropertyGroup>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<PublishProfile>DefaultContainer</PublishProfile>
<ContainerImageName>my-super-awesome-app</ContainerImageName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Build.Containers" Version="0.1.8" />
</ItemGroup>
</Project>
下面是一些常見的自定義引數介紹
<ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:6.0</ContainerBaseImage>
預設情況下,會推播到原生的 Docker Daemon,當然也支援推播到遠端的映象庫。
<ContainerRegistry>registry.mycorp.com:1234</ContainerRegistry>
標籤可以給應用生成不同的版本,預設情況是讀取專案的 Version 屬性,你也可以指定 ContainerImageTag 屬性,如下
<ContainerImageTag>1.2.3-alpha2</ContainerImageTag>
多個標籤用分號隔開
<ContainerImageTags>1.2.3-alpha2;latest</ContainerImageTags>
目前來說,專案還是在初期階段,不過已經看到了 .NET 團隊在這方面的努力,對於其他的一些容器化功能,相信會很快在未來的版本中新增。
更多詳細的內容,可以參考下面的檔案:
https://github.com/dotnet/sdk-container-builds/blob/main/docs/ContainerCustomization.md
上面的容器化功能,主要是由 sdk-container-builds 這個庫實現的。工作原理並不複雜,程式碼也不多,裡面使用到了 .NET 7 新的 Tar API 處理檔案,並構建了標準的 OCI 映象檔案,然後通過 Docker Registry HTTP API 和 Docker Registry 進行互動以及上傳映象。
希望本文對您有用 !
https://github.com/dotnet/sdk-container-builds
https://docs.docker.com/registry/spec/api/
https://devblogs.microsoft.com/dotnet/announcing-builtin-container-support-for-the-dotnet-sdk