次の方法で共有


.NET 8 のコンテナーの新機能

この記事では、.NET 8 のコンテナーの新機能について説明します。

コンテナー イメージ

.NET 8 の .NET コンテナー イメージに対して、次の変更が行われました。

非ルート ユーザー

イメージには non-root ユーザーが含まれます。 このユーザーが、イメージ non-root を使用できるようにします。 non-root として実行するには、Dockerfile の末尾に次の行 (または Kubernetes マニフェストで同様の命令) を追加します。

USER app

.NET 8 では、non-root ユーザーの UID の環境変数が追加されています。これは 64198 です。 この環境変数は、コンテナー ユーザーを名前ではなく UID で設定する必要がある Kubernetes runAsNonRoot テストに役立ちます。 この dockerfile は、使用例を示しています。

既定のポートもポート 80 から 8080 に変更されました。 この変更をサポートするために、ポートの変更を容易にするための新しい環境変数 ASPNETCORE_HTTP_PORTS を使用できます。 この変数は、ポートの一覧を受け入れます。これは、ASPNETCORE_URLS で必要な書式よりも簡単です。 これらの変数のいずれかを使用してポートをポート 80 に戻した場合は、non-root として実行できません。

詳細については、「既定の ASP.NET Core ポートが 80 から 8080 に変更されました」および「Linux イメージの新しい非 root "app" ユーザー」を参照してください。

Debian 12

コンテナー イメージで Debian 12 (Bookworm) が使用されるようになりました。 Debian は、.NET コンテナー イメージの既定の Linux ディストリビューションです。

詳細については、「Debian コンテナー イメージが Debian 12 にアップグレードされました」を参照してください。

Chiseled Ubuntu イメージ

.NET 8 では Chiseled Ubuntu イメージを使用できます。 Chiseled イメージは、非常に小さく、パッケージ マネージャーやシェルがなく、non-root であるため、攻撃対象領域が減少します。 この種類のイメージは、アプライアンススタイルのコンピューティングの利点を必要とする開発者向けです。

既定では、Chiseled イメージではグローバリゼーションがサポートされていません。 extra イメージが提供されます。これには、icu および tzdata パッケージが含まれます。

グローバリゼーションとコンテナーの詳細については、「Globalization Test App」を参照してください。

マルチプラットフォーム コンテナー イメージをビルドする

Docker では、複数の環境間で動作するマルチプラットフォーム イメージの使用とビルドがサポートされています。 .NET 8 では、アーキテクチャを組み合わせて、ビルドする .NET イメージと一致させることができる新しいパターンが導入されています。 たとえば、macOS を使用しており、Azure で x64 クラウド サービスをターゲットにする場合、次のように --platform スイッチを使用してイメージをビルドできます。

docker build --pull -t app --platform linux/amd64

.NET SDK では、復元時に$TARGETARCH 値と -a 引数がサポートされるようになりました。 次のコード スニペットは、例を示しています。

RUN dotnet restore -a $TARGETARCH

# Copy everything else and build app.
COPY aspnetapp/. .
RUN dotnet publish -a $TARGETARCH --self-contained false --no-restore -o /app

詳細については、ブログ記事「マルチプラットフォーム コンテナーのサポートの改善」を参照してください。

ASP.NET 複合イメージ

コンテナー化のパフォーマンスを向上させる取り組みの一環として、ランタイムの複合バージョンを含む新しい ASP.NET Docker イメージが利用可能です。 この複合は、複数の MSIL アセンブリを 1 つのすぐに実行できる (R2R) 出力バイナリにコンパイルすることによってビルドされます。 これらのアセンブリは 1 つのイメージに埋め込まれているため、JIT 処理にかかる時間が短縮され、アプリの起動パフォーマンスが向上します。 通常の ASP.NET イメージと比較した複合イメージのもう 1 つの大きな利点は、ディスク上のサイズが小さいことです。

注意すべき点があります。 複合では複数のアセンブリが 1 つに埋め込まれているので、バージョンがより緊密に結合しています。 アプリでは、カスタム バージョンのフレームワークまたは ASP.NET バイナリを使用できません。

Alpine Linux、Ubuntu ("jammy") Chiseled、Mariner Distroless の各プラットフォーム用の Composite イメージは、mcr.microsoft.com/dotnet/aspnet リポジトリから入手できます。 タグは、ASP.NET Docker ページ-composite サフィックスと共に一覧表示されます。

コンテナーの発行

生成されたイメージの既定値

dotnet publish はコンテナー イメージを生成できます。 既定では、non-root イメージが生成されるため、アプリは既定でセキュリティで保護された状態を維持できます。 この既定値は、root などで ContainerUser プロパティを設定して、いつでも変更できます。

既定の出力コンテナー タグは latest になりました。 この既定値は、コンテナー領域の他のツールと一致するもので、コンテナーを内部開発ループ内で使用することを容易にします。

パフォーマンスと互換性

.NET 8 では、リモート レジストリ (特に Azure レジストリ) にコンテナーをプッシュするためのパフォーマンスが向上しました。 高速化の理由は、1 つの操作における複数レイヤーのプッシュと、アトミック アップロードをサポートしていないレジストリ向けのより信頼性の高いチャンク メカニズムです。

これらの改善は、より多くのレジストリ (Harbor、Artifactory、Quay.io、Podman) がサポートされることも意味しています。

認証

.NET 8 では、コンテナーをレジストリにプッシュするときに、OAuth トークン交換認証 (Azure マネージド ID) のサポートが追加されます。 このサポートは、認証エラーなしで Azure Container Registry などのレジストリにプッシュできるようになったことを意味します。 次のコマンドは、発行フローの例を示しています。

> az acr login -n <your registry name>
> dotnet publish -r linux-x64 -p PublishProfile=DefaultContainer

.NET アプリのコンテナー化の詳細については、「dotnet publish を使用して .NET アプリをコンテナー化する」を参照してください。

tar.gz アーカイブに発行する

.NET 8 以降では、tar.gz アーカイブとしてコンテナーを直接作成できます。 この機能は、たとえば画像をプッシュする前にスキャン ツールを実行する必要がある場合などワークフローが複雑な場合に便利です。 アーカイブが作成されたら、アーカイブの移動、スキャン、またはローカル Docker ツールチェーンへの読み込みを行うことができます。

アーカイブに発行するには、次に例を示す ContainerArchiveOutputPath プロパティを dotnet publish コマンドに追加します。

dotnet publish \
  -p PublishProfile=DefaultContainer \
  -p ContainerArchiveOutputPath=./images/sdk-container-demo.tar.gz

フォルダー名または特定のファイル名を持つパスを指定できます。

関連項目