.NET Core アプリをコンテナー化する
適用対象: Windows Server 2025、Windows Server 2022、Windows Server 2019、Windows Server 2016
このトピックでは、「コンテナのためにWindowsを準備する」で説明されているように環境をセットアップした後、「最初のWindowsコンテナを実行する」で説明されているように最初のコンテナを実行した後、既存のサンプル .NET アプリをWindowsコンテナとしてデプロイするためにパッケージする方法について説明します。
コンピューターに Git ソース管理システムがインストールされている必要もあります。 インストールするには、Git 参照してください。
GitHub からサンプル コードを複製する
すべてのコンテナー サンプル ソース コードは、Virtualization-Documentation git リポジトリの下に、windows-container-samples
という名前のフォルダーに保持されます。
PowerShell セッションを開き、このリポジトリを格納するフォルダーにディレクトリを変更します。 (その他のコマンド プロンプト ウィンドウの種類も機能しますが、このコマンドの例では PowerShell を使用します)。
リポジトリを現在の作業ディレクトリに複製します。
git clone https://github.com/MicrosoftDocs/Virtualization-Documentation.git
Virtualization-Documentation\windows-container-samples\asp-net-getting-started
にあるサンプル ディレクトリに移動し、次のコマンドを使用して Dockerfile を作成します。Dockerfile はメイクファイルのようなものです。これは、コンテナー エンジンにコンテナー イメージのビルド方法を指示する手順の一覧です。
# Navigate into the sample directory Set-Location -Path Virtualization-Documentation\windows-container-samples\asp-net-getting-started # Create the Dockerfile for our project New-Item -Name Dockerfile -ItemType file
Dockerfile を書き込む
作成した Dockerfile を任意のテキスト エディターで開き、次の内容を追加します。
FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env
WORKDIR /app
COPY *.csproj ./
RUN dotnet restore
COPY . ./
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "asp-net-getting-started.dll"]
これを 1 行ずつ分割し、各命令が何を行うかを説明しましょう。
FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env
WORKDIR /app
最初の行グループは、コンテナーの構築に使用する基本イメージを指定します。 ローカルシステムにこのイメージがまだない場合、docker が自動的にそのイメージを取得しようとします。 mcr.microsoft.com/dotnet/core/sdk:2.1
は.NET Core 2.1 SDK がインストールされた状態でパッケージ化されているため、バージョン 2.1 を対象とする ASP .NET Core プロジェクトをビルドする作業に任されます。 次の命令では、コンテナー内の作業ディレクトリが /app
に変更されるため、この操作に続くすべてのコマンドがこのコンテキストで実行されます。
COPY *.csproj ./
RUN dotnet restore
次に、次の手順では、.csproj ファイルを build-env
コンテナーの /app
ディレクトリにコピーします。 このファイルをコピーすると、.NET はそのファイルを読み取り、その後、プロジェクトに必要なすべての依存関係とツールを取得します。
COPY . ./
RUN dotnet publish -c Release -o out
.NET によってすべての依存関係が build-env
コンテナーにプルされると、次の命令はすべてのプロジェクト ソース ファイルをコンテナーにコピーします。 次に、リリース構成でアプリケーションを発行し、出力パスを指定するように .NET に指示します。
コンパイルは成功するはずです。 最後のイメージをビルドする必要があります。
ヒント
このクイック スタートでは、ソースから .NET Core プロジェクトをビルドします。 コンテナー イメージをビルドするときは、運用ペイロードとその依存関係 のみをコンテナー イメージに含めるのが良い方法です。 .NET Core ランタイムのみが必要であるため、.NET Core SDK を最終的なイメージに含める必要はありません。そのため、dockerfile は、build-env
という SDK と共にパッケージ化された一時コンテナーを使用してアプリをビルドするように記述されます。
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "asp-net-getting-started.dll"]
アプリケーションは ASP.NET されているため、このランタイムを含むイメージを指定します。 その後、一時コンテナーの出力ディレクトリから最終的なコンテナーにすべてのファイルをコピーします。 コンテナーの起動時に新しいアプリをエントリ ポイントとして実行するようにコンテナーを構成します
マルチステージ ビルドを実行する dockerfile を記述しました。 dockerfile を実行すると、.NET core 2.1 SDK と共に build-env
一時コンテナーを使用してサンプル アプリをビルドし、出力されたバイナリを .NET Core 2.1 ランタイムのみを含む別のコンテナーにコピーして、最終的なコンテナーのサイズを最小限に抑えます。
アプリをビルドして実行する
Dockerfile が記述されたら、Docker を Dockerfile でポイントし、イメージをビルドして実行するように指示できます。
コマンド プロンプト ウィンドウで、dockerfile が存在するディレクトリに移動し、docker build コマンドを実行して、Dockerfile からコンテナーをビルドします。
docker build -t my-asp-app .
新しくビルドされたコンテナーを実行するには、docker run コマンドを実行します。
docker run -d -p 5000:80 --name myapp my-asp-app
このコマンドを解剖しましょう。
-d
は、コンテナーを "デタッチ済み" で実行するように Docker に指示します。つまり、コンテナー内のコンソールにコンソールがフックされません。 コンテナーはバックグラウンドで実行されます。-p 5000:80
は、ホスト上のポート 5000 をコンテナー内のポート 80 にマップするように Docker に指示します。 各コンテナーは、独自の IP アドレスを取得します。 ASP .NET は、ポート 80 で既定でリッスンします。 ポート マッピングを使用すると、マップされたポートでホストの IP アドレスに移動でき、Docker はすべてのトラフィックをコンテナー内の宛先ポートに転送します。--name myapp
は、(Docker によって実行時に割り当てられたコンテナー ID を検索する代わりに) このコンテナーにクエリを実行するための便利な名前を Docker に与えることを指示します。my-asp-app
は、Docker が実行するイメージです。 これは、docker build
プロセスの集大成として生成されるコンテナー イメージです。
Web ブラウザーを開き、
http://localhost:5000
に移動して、コンテナー化されたアプリケーションを表示します。ローカルホストのコンテナー内で実行されているASP.NET Core Webページ
次の手順
次の手順では、Azure Container Registry を使用して、コンテナー化された ASP.NET Web アプリをプライベート レジストリに発行します。 これにより、組織にデプロイできます。
プライベート コンテナー レジストリ を作成する
コンテナー イメージをレジストリ にプッシュセクションにアクセスしたら、パッケージ化した ASP.NET アプリの名前 (
my-asp-app
) とコンテナー レジストリ (例:contoso-container-registry
) を指定します。docker tag my-asp-app contoso-container-registry.azurecr.io/my-asp-app:v1
その他のアプリ サンプルとその関連する dockerfile については、追加のコンテナー サンプルを参照してください。
コンテナー レジストリにアプリを発行したら、次の手順は、Azure Kubernetes Service で作成した Kubernetes クラスターにアプリをデプロイすることです。
Kubernetes クラスター を作成する