.NET 8 のコンテナーの新機能
この記事では、.NET 8 のコンテナーの新機能について説明します。
コンテナー イメージ
.NET 8 の .NET コンテナー イメージに対して、次の変更が行われました。
非ルート ユーザー
画像には、non-root
ユーザーが含まれます。 このユーザーが、イメージ non-root
を使用できるようにします。 non-root
として実行するには、Dockerfile の末尾に次の行を追加します (または、Kubernetes マニフェストの同様の命令)。
USER app
.NET 8 では、non-root
ユーザーの UID の環境変数 (1654) が追加されます。 この環境変数は Kubernetes runAsNonRoot
テストに役立ちます。このテストでは、名前ではなく UID を使用してコンテナー ユーザーを設定する必要があります。 この dockerfile は、使用例を示しています。
既定のポートもポート 80
から 8080
に変更されました。 この変更をサポートするために、新しい環境変数 ASPNETCORE_HTTP_PORTS
を使用して、ポートを簡単に変更できます。 変数はポートのリストを受け入れます。これは、ASPNETCORE_URLS
で必要な形式よりも簡単です。 これらの変数のいずれかを使用してポートをポート 80
に戻した場合、non-root
として実行することはできません。
詳細については、「既定の ASP.NET Core ポートが 80 から 8080 に変更」および「Linux イメージの新しい非ルート 'app' ユーザー」を参照してください。
Debian 12
コンテナーイメージは Debian 12 (Bookworm)を使用するようになりました。 Debian は、.NET コンテナー イメージの既定の Linux ディストリビューションです。
詳細については、Debian 12にアップグレードされた Debian コンテナー イメージの
洗練されたUbuntuイメージ
.NET 8 では Chiseled Ubuntu イメージを使用できます。 チゼル画像は、非常に小さく、パッケージマネージャーやシェルがなく、non-root
であるため、攻撃対象領域が減少します。 この種類のイメージは、アプライアンス スタイルのコンピューティングの利点を必要とする開発者向けです。
既定では、チゼルイメージはグローバリゼーションをサポートしていません。 extra
イメージが提供されます。これには、icu
パッケージと tzdata
パッケージが含まれます。
グローバリゼーションとコンテナーの詳細については、「グローバリゼーション テスト アプリの」を参照してください。
マルチプラットフォーム コンテナー イメージを構築する
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 イメージを使用できます。 この複合は、複数の CIL アセンブリを 1 つのすぐに実行できる (R2R) 出力バイナリにコンパイルすることによって構築されます。 これらのアセンブリは 1 つのイメージに埋め込まれているため、ジッティングにかかる時間が短縮され、アプリの起動パフォーマンスが向上します。 通常の ASP.NET イメージよりも複合のもう 1 つの大きな利点は、複合イメージのディスク上のサイズが小さいということです。
注意すべき注意事項があります。 複合には複数のアセンブリが 1 つに埋め込まれているので、より厳密なバージョンの結合が可能です。 アプリでは、カスタム バージョンのフレームワークや ASP.NET バイナリを使用できません。
複合イメージ は、Alpine Linux、Ubuntu ("jammy") Chiseled、および Mariner Distroless プラットフォームで mcr.microsoft.com/dotnet/aspnet
リポジトリから入手できます。 タグは、ASP.NET Docker ページの -composite
サフィックスと共に一覧表示されます。
コンテナーパブリッシング
生成画像のデフォルト設定
dotnet publish
コンテナー イメージを生成できます。 既定では、root
など、ContainerUser
プロパティを設定して、この既定値をいつでも変更します。
既定の出力コンテナー タグが latest
になりました。 この既定値は、コンテナー領域の他のツールに沿っており、コンテナーを内部開発ループで使いやすくします。
パフォーマンスと互換性
.NET 8 では、リモート レジストリ (特に Azure レジストリ) にコンテナーをプッシュするためのパフォーマンスが向上しました。 高速化は、1 回の操作でレイヤーをプッシュすることで発生します。アトミック アップロードをサポートしていないレジストリの場合は、より信頼性の高いチャンク メカニズムです。
これらの機能強化は、より多くのレジストリ (ハーバー、アーティファクト、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
フォルダー名または特定のファイル名を持つパスを指定できます。
関連項目
- .NET 8 の新機能
.NET