.NET および Docker の概要

コンテナーは、DockerKubernetesPodman などのツールを使用してクラウド アプリケーションをデプロイおよびホストするための最も一般的な方法の 1 つです。 コンテナーを使用すると、簡単にアプリをその依存関係と共にパッケージ化し、そのアプリを任意のコンテナー ホスト上で確実に実行できるため、多くの開発者がコンテナーを選択します。 コンテナーで .NET を使用するための広範なサポートがあります。

Docker には、コンテナーの優れた概要が用意されています。 Docker Desktop: Community Edition は、開発者のデスクトップ コンピューターでコンテナーを使用するために使用するのに適したツールです。

.NET イメージ

公式の .NET コンテナー イメージは、Microsoft アーティファクト レジストリに公開されており、Docker Hub で検出できます。 Linux (Alpine、Debian、Ubuntu、Mariner) および Windows 用には、運用用のランタイム イメージと、コードをビルドするための SDK イメージがあります。 詳しくは、「.NET コンテナー イメージ」を参照してください。

.NET イメージは、新しい .NET パッチが発行されるたびに、またはオペレーティング システムの基本イメージが更新されるたびに、定期的に更新されます。

Chiseled コンテナー イメージは、.NET ランタイムで必要とされる最小限のコンポーネント セットを備えた Ubuntu コンテナー イメージです。 これらのイメージは通常の Ubuntu イメージよりも約 100 MB 小さく、コンポーネントが少ないため CVE も少なくなります。 特に、シェルやパッケージ マネージャーが含まれていないため、セキュリティ プロファイルが大幅に向上します。 非ルート ユーザーも含まれており、そのユーザーを有効にして構成されます。

コンテナイメージを構築する

Dockerfile を使用してコンテナー イメージをビルドすることも、.NET SDK に依存してイメージを生成することもできます。 イメージのビルドに関するサンプルについては、dotnet/dotnet-docker および dotnet/sdk-container-builds を参照してください。

次の例は、いくつかの簡単な手順でコンテナー イメージを構築して実行する方法を示しています (.NET 8 および .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 は、Dockerfile を使用したい開発者のための新しいオプションです。

Port

ポート マッピングは、コンテナーを使用する上で重要な部分です。 外部の Web リクエストに応答するには、ポートをコンテナーの外部で発行する必要があります。 ASP.NET Core コンテナー イメージは .NET 8 で変更され、既定でポート 8080 でリッスンします。 .NET 6 および 7 では、ポート 80 でリッスンします。

docker run を使用した前の例では、ホスト ポート 8000 がコンテナー ポート 8080 にマップされています。 Kubernetes も同様に動作します。

この動作は、環境変数 ASPNETCORE_HTTP_PORTSASPNETCORE_HTTPS_PORTSASPNETCORE_URLS を使用して構成できます。

Users

.NET 8 以降では、すべてのイメージに、app という名前の非ルート ユーザーが含まれます。 既定では、Chiseled イメージは、このユーザーを有効にして構成されます。 アプリを .NET コンテナーとして発行する機能 (「コンテナー イメージのビルド」セクションで示されています) も、このユーザーを既定で有効にしてイメージを構成します。 他のすべてのシナリオでは、app ユーザーを手動で (たとえば、Dockerfile 命令 USER を使用して) 設定できます。 イメージが app で構成されており、コマンドを root として実行する必要がある場合は、USER 命令を使用してユーザーを root に設定できます。

最新情報を把握する

コンテナー関連のニュースは、dotnet/dotnet-docker ディスカッションおよび .NET ブログの "コンテナー" カテゴリに投稿されます。

Azure サービス

さまざまな Azure サービスがコンテナーに対応しています。 アプリケーションの Docker イメージを作成して、次のサービスのいずれかにデプロイできます。

  • Azure Kubernetes Service (AKS)
    Kubernetes を使用して Windows および Linux コンテナーのスケールと調整を行います。

  • Azure App Service
    PaaS 環境でコンテナーを使用して Web アプリまたは API をデプロイします。

  • Azure Container Apps
    サーバー、オーケストレーション、またはインフラストラクチャの管理を行うことなくコンテナー ワークロードを実行し、監視とゼロへのスケーリングについては Dapr および KEDA のネイティブ サポートを活用します。

  • Azure Container Instances
    クラウドで個々のコンテナーを作成しますが、高度な管理サービスは何もありません。

  • Azure Batch
    コンテナーを使用して反復的なコンピューティング ジョブを実行します。

  • Azure Service Fabric
    Windows および Linux コンテナーを使用して、.NET アプリケーションをマイクロサービスにリフト、シフト、最新化します。

  • Azure Container Registry
    すべての種類の Azure デプロイでコンテナー イメージを格納し、管理します。

次の手順