次の方法で共有


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 アプリ をコンテナー イメージとして発行 場合、ローカル コンテナー ランタイムにプッシュされます。 または、イメージを tarball として保存したり、コンテナー ランタイムをまったく使用せずに コンテナー レジストリ に直接プッシュしたりできます。

これらの前提条件に加えて、サンプル プロジェクトが worker であるため、.NET の Worker Services について理解しておくことをお勧めします。

.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

コマンドは、worker という名前 新しいフォルダーを作成し、実行すると 1 秒ごとにメッセージをログに記録するワーカー サービスを生成します。 ターミナル セッションからディレクトリを変更し、Worker フォルダーに移動します。 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

次の手順