.NET 和 Docker 簡介

容器是部署和裝載雲端應用程式的最熱門方式之一,使用包含 DockerKubernetesPodman 等工具。 許多開發人員都會選擇容器,因為它直接將具有其相依性的應用程式一起封裝,並讓該應用程式可靠地在任何容器主機上執行。 搭配容器使用 .NET 有受到廣泛支援。

Docker 提供容器的絕佳概觀Docker Desktop: Community Edition 是在開發人員桌上型電腦上使用容器的可利用好工具。

.NET 映像

官方 .NET 容器映像會發佈至 Microsoft 成品登錄,而且可在 Docker Hub 上對其進行搜尋。 有生產用的執行階段映像以及建置程式碼用的 SDK 映像,都適用於 Linux (Alpine、Debian、Ubuntu、Mariner) 和 Windows。 如需詳細資訊,請參閱 .NET 容器映像

每當發佈新的 .NET 修補程式或更新作業系統基礎映像時,都會定期更新 .NET 映像。

Chiseled 容器映像是 Ubuntu 容器映像,其中包含 .NET 執行階段所需的最小元件集。 這些映像比一般 Ubuntu 映像小約 100 MB,而且因為其元件較少,所以有較少的 CVE。 特別的是它們不包含殼層或套件管理員,這可大幅改善其安全性設定檔。 它們也包含非根使用者,且會以已啟用該使用者進行設定。

建置容器映像

您可以使用 Dockerfile 建置容器映像,或依賴 .NET SDK 來產生映像。 如需建置映像的範例,請參閱 dotnet/dotnet-docker 以及 dotnet/sdk-container-builds (英文)。

下列範例說明透過幾個快速步驟建置和執行容器映像 (.NET 8 and .NET 7.0.300 支援)。

$ dotnet new webapp -o webapp
$ cd webapp/
$ dotnet publish -t:PublishContainer
MSBuild version 17.8.3+195e7f5a3 for .NET
  Determining projects to restore...
  All projects are up-to-date for restore.
  webapp -> /home/rich/webapp/bin/Release/net8.0/webapp.dll
  webapp -> /home/rich/webapp/bin/Release/net8.0/publish/
  Building image 'webapp' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'.
  Pushed image 'webapp:latest' to local registry via 'docker'.
$ docker run --rm -d -p 8000:8080 webapp
7c7ad33409e52ddd3a9d330902acdd49845ca4575e39a6494952b642e584016e
$ curl -s http://localhost:8000 | grep ASP.NET
    <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
$ docker ps
CONTAINER ID   IMAGE     COMMAND               CREATED              STATUS              PORTS                                       NAMES
7c7ad33409e5   webapp    "dotnet webapp.dll"   About a minute ago   Up About a minute   0.0.0.0:8000->8080/tcp, :::8000->8080/tcp   jovial_shtern
$ docker kill 7c7ad33409e5

docker init 是想要使用 Dockerfiles 之開發人員的新選項。

連接埠

連接埠對應是使用容器的重要部分。 連接埠必須在容器外部發佈,才能回應外部 Web 要求。 ASP.NET Core 容器映像根據預設會在 .NET 8 中變更以在連接埠 8080 上接聽。 .NET 6 和 7 在連接埠 80 上接聽。

在先前 docker run 的範例中,主機連接埠 8000 會對應至容器連接埠 8080。 Kubernetes 以類似的的方式運作。

您可以使用 ASPNETCORE_HTTP_PORTSASPNETCORE_HTTPS_PORTSASPNETCORE_URLS 環境變數來設定此行為。

使用者

自 .NET 8 開始,所有映像都包含稱為 app 的非根使用者。 根據預設,Chiseled 映像會以已啟用本使用者進行設定。 將應用程式發佈為 .NET 容器功能 (如建置容器映像一節所示) 也會預設以已啟用本使用者進行設定映像。 在所有其他案例中,您可以手動設定 app 使用者,例如使用 USERDockerfile 指示。 如果已使用 app 設定映像,且命令需要作為 root 執行,則可使用 USER 指示來將使用者設為 root

隨時掌握狀況

容器相關新聞會張貼至 dotnet/dotnet-docker 討論.NET 部落格「容器」類別

Azure 服務

各種 Azure 服務支援容器。 您可以為應用程式建立 Docker 映像,並將它部署到下列其中一個服務:

下一步