dotnet 発行を使用して .NET アプリをコンテナー化する
コンテナーには、不変のインフラストラクチャであること、移植可能なアーキテクチャを提供すること、スケーラビリティを実現するなど、多くの機能と利点があります。 イメージを使用して、ローカル開発環境、プライベート クラウド、またはパブリック クラウド用のコンテナーを作成できます。 このチュートリアルでは、Dockerfile を使用せずに、dotnet publish コマンドを使用して .NET アプリケーションをコンテナー化する方法について説明します。 さらに、コンテナー イメージの と実行を構成する方法と、リソースをクリーンアップする方法について説明します。
ヒント
Dockerfile を使用して .NET アプリをコンテナー化することに関心がある場合は、「チュートリアル: .NET アプリをコンテナー化する」を参照してください。
前提 条件
次の前提条件をインストールします。
- .NET 8+ SDK
.NET がインストールされている場合は、dotnet --info
コマンドを使用して、使用している SDK を特定します。
コンテナーをローカルで実行する場合は、次のような Open Container Initiative (OCI) と互換性のあるコンテナー ランタイムが必要です。
- Docker Desktop: 最も一般的なコンテナー ランタイム。
- Podman: Docker に代わるオープンソースのデーモンレス。
重要
.NET SDK は、Docker なしでコンテナー イメージを作成します。 Docker または Podman は、イメージをローカルで実行する場合にのみ必要です。 既定では、.NET アプリ をコンテナー イメージとして発行
これらの前提条件に加えて、サンプル プロジェクトが worker であるため、.NET の
.NET アプリを作成する
コンテナー化するには .NET アプリが必要なので、まずテンプレートから新しいアプリを作成します。 ターミナルを開き、作業フォルダー (sample-directory) をまだ作成していない場合は作成し、ディレクトリを変更してフォルダー内に移動します。 作業フォルダーで、次のコマンドを実行して、workerという名前のサブディレクトリ
dotnet new worker -o Worker -n DotNet.ContainerImage
フォルダー ツリーは次のディレクトリのようになります。
📁 sample-directory
└──📂 Worker
├──appsettings.Development.json
├──appsettings.json
├──DotNet.ContainerImage.csproj
├──Program.cs
├──Worker.cs
├──📂 Properties
│ └─── launchSettings.json
└──📂 obj
├── DotNet.ContainerImage.csproj.nuget.dgspec.json
├── DotNet.ContainerImage.csproj.nuget.g.props
├── DotNet.ContainerImage.csproj.nuget.g.targets
├── project.assets.json
└── project.nuget.cache
dotnet run
コマンドを使用してアプリを起動します。
dotnet run
Using launch settings from ./Worker/Properties/launchSettings.json...
Building...
info: DotNet.ContainerImage.Worker[0]
Worker running at: 01/06/2025 13:37:28 -06:00
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: .\Worker
info: DotNet.ContainerImage.Worker[0]
Worker running at: 01/06/2025 13:37:29 -06:00
info: DotNet.ContainerImage.Worker[0]
Worker running at: 01/06/2025 13:37:30 -06:00
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
ワーカー テンプレートは無期限にループします。 ctrl + C
コンテナー イメージ名を設定する
アプリをコンテナーとして発行するときに使用できるさまざまな構成オプションがあります。 既定では、コンテナー イメージ名はプロジェクトの AssemblyName
です。 その名前がコンテナー イメージ名として無効な場合は、次のプロジェクト ファイルに示すように ContainerRepository
を指定してオーバーライドできます。
<Project Sdk="Microsoft.NET.Sdk.Worker">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UserSecretsId>dotnet-DotNet.ContainerImage-2e40c179-a00b-4cc9-9785-54266210b7eb</UserSecretsId>
<ContainerRepository>dotnet-worker-image</ContainerRepository>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.0" />
</ItemGroup>
</Project>
詳細については、ContainerRepository
を参照してください。
.NET アプリを発行する
.NET アプリをコンテナーとして発行するには、次の dotnet publish コマンドを使用します。
dotnet publish --os linux --arch x64 /t:PublishContainer
上記の .NET CLI コマンドは、アプリをコンテナーとして発行します。
- OS としての Linux のターゲット (
--os linux
)。 - x64 アーキテクチャ (
--arch x64
) を指定します。
重要
コンテナーをローカルに発行するには、アクティブな OCI 準拠デーモンが実行されている必要があります。 アプリをコンテナーとして発行しようとしたときに実行されていない場合は、次のようなエラーが発生します。
..\build\Microsoft.NET.Build.Containers.targets(66,9): error MSB4018:
The "CreateNewImage" task failed unexpectedly. [..\Worker\DotNet.ContainerImage.csproj]
dotnet publish
コマンドは、出力例のような出力を生成します。
Restore complete (0.2s)
DotNet.ContainerImage succeeded (2.6s) → bin\Release\net9.0\linux-x64\publish\
このコマンドは、ワーカー アプリを publish フォルダーにコンパイルし、既定でコンテナー イメージをローカル Docker デーモンにプッシュします。 Podman を使用している場合は、エイリアス
.NET アプリを tarball に発行する
tarball (または tar ファイル) は、他のファイルを含むファイルです。 通常は、圧縮されたアーカイブであることを示すために、*.tar.gz 複合ファイル拡張子で終わります。 これらのファイルの種類は、ソフトウェアの配布またはバックアップの作成に使用されます。 この場合、作成された tarball はコンテナー イメージの配布に使用されます。
.NET アプリをコンテナーとして tarball に発行するには、次のコマンドを使用します。
dotnet publish --os linux --arch x64 \
/t:PublishContainer \
-p ContainerArchiveOutputPath=./images/container-image.tar.gz
上記のコマンドは、アプリをコンテナーとして tarball に発行します。
- OS としての Linux のターゲット (
--os linux
)。 - x64 アーキテクチャ (
--arch x64
) を指定します。 ContainerArchiveOutputPath
プロパティを./images/container-image.tar.gz
に設定します。
このコマンドでは、実行中の OCI 準拠デーモンは必要ありません。 詳細については、ContainerArchiveOutputPath
を参照してください。
tarball を読み込む
tarball にエクスポートする一般的なユース ケースは、セキュリティに重点を置いた組織向けです。 コンテナーを作成し、tarball としてエクスポートした後、tarball 上でセキュリティ スキャン ツールを実行します。 このアプローチでは、ライブ システムのスキャンの複雑さを回避するため、コンプライアンスが簡素化されます。
tarball にはコンテナー全体が含まれており、適切なツールを使用して読み込むことができます。
- Docker:
docker load -i ./images/container-image.tar.gz
- Podman:
podman load -i ./images/container-image.tar.gz
.NET アプリをコンテナー レジストリに発行する
コンテナー レジストリは、コンテナー イメージを格納および管理するサービスです。 これらは、複数の環境にコンテナー イメージを格納して配布するために使用されます。 .NET アプリをコンテナー としてコンテナー レジストリに発行するには、次のコマンドを使用します。
dotnet publish --os linux --arch x64 \
/t:PublishContainer \
-p ContainerRegistry=ghcr.io
上記のコードは、コンテナー レジストリにアプリをコンテナーとして発行します。
- OS としての Linux のターゲット (
--os linux
)。 - x64 アーキテクチャ (
--arch x64
) を指定します。 ContainerRegistry
プロパティをghcr.io
に設定します。
詳細については、ContainerRegistryを参照してください。
リソースのクリーンアップ
この記事では、.NET worker をコンテナー イメージとして発行しました。 必要な場合は、このリソースを削除します。 docker images
コマンドを使用して、インストールされているイメージの一覧を表示します。
docker images
次の出力例を考えてみましょう。
REPOSITORY TAG IMAGE ID CREATED SIZE
dotnet-worker-image 1.0.0 25aeb97a2e21 12 seconds ago 191MB
ヒント
イメージ ファイルは大きくなる場合があります。 通常は、アプリのテストと開発中に作成した一時コンテナーを削除します。 通常、そのランタイムに基づいて他のイメージをビルドする予定の場合は、ランタイムがインストールされた状態で基本イメージを保持します。
イメージを削除するには、イメージ ID をコピーし、docker image rm
コマンドを実行します。
docker image rm 25aeb97a2e21
次の手順
- .NET SDK の組み込みコンテナーサポートの発表
- チュートリアル: .NET アプリの をコンテナー化する
- .NET コンテナー イメージ
- コンテナー をサポートする Azure サービスを確認する
- Dockerfile コマンドについて読む
- Visual Studio でコンテナー ツールを調べる
.NET