ASP.NET Core 向けの Docker イメージ

このチュートリアルでは、Docker コンテナー内で ASP.NET Core アプリを実行する方法を示します。

このチュートリアルでは、次の作業を行いました。

  • ASP.NET Core Docker イメージについて学習する
  • ASP.NET Core サンプル アプリをダウンロードする
  • サンプル アプリをローカルで実行する
  • Linux コンテナー内でサンプル アプリを実行する
  • Windows コンテナー内でサンプル アプリを実行する
  • 手動でビルドしてデプロイする

ASP.NET Core の Docker イメージ

このチュートリアルでは、ASP.NET Core サンプル アプリをダウンロードして、Docker コンテナー内で実行します。 このサンプルは Linux コンテナーと Windows コンテナーのどちらでも動作します。

さまざまなコンテナー内でビルドして実行するために、サンプルの Dockerfile では Docker のマルチステージ ビルド機能を使用しています。 ビルドと実行のコンテナーは、マイクロソフトが Docker Hub に提供しているイメージから作成されます。

  • dotnet/sdk

    サンプルでは、アプリをビルドするためにこのイメージを使用します。 イメージには、コマンド ライン ツール (CLI) が組み込まれた .NET SDK が含まれています。 イメージはローカル開発、デバッグ、および単体テスト用に最適化されています。 開発とコンパイルのためにツールがインストールされているため、比較的大きなイメージになっています。

  • dotnet/core/sdk

    サンプルでは、アプリをビルドするためにこのイメージを使用します。 イメージには、コマンド ライン ツール (CLI) が組み込まれた .NET Core SDK が含まれています。 イメージはローカル開発、デバッグ、および単体テスト用に最適化されています。 開発とコンパイルのためにツールがインストールされているため、比較的大きなイメージになっています。

  • dotnet/aspnet

    サンプルでは、アプリを実行するためにこのイメージを使用します。 イメージには ASP.NET Core ランタイムとライブラリが含まれており、実稼働環境でアプリを実行するために最適化されています。 デプロイとアプリ起動の速度に対応した設計になっており、Docker レジストリから Docker ホストへのネットワーク パフォーマンスが最適化されていることから、イメージは比較的小さいです。 アプリの実行に必要なバイナリとコンテンツのみが、コンテナーにコピーされます。 コンテンツは実行できる状態になっており、docker run からアプリの起動までを最速で行うことができます。 動的コード コンパイルは Docker モデルで必要ありません。

  • dotnet/core/aspnet

    サンプルでは、アプリを実行するためにこのイメージを使用します。 イメージには ASP.NET Core ランタイムとライブラリが含まれており、実稼働環境でアプリを実行するために最適化されています。 デプロイとアプリ起動の速度に対応した設計になっており、Docker レジストリから Docker ホストへのネットワーク パフォーマンスが最適化されていることから、イメージは比較的小さいです。 アプリの実行に必要なバイナリとコンテンツのみが、コンテナーにコピーされます。 コンテンツは実行できる状態になっており、docker run からアプリの起動までを最速で行うことができます。 動的コード コンパイルは Docker モデルで必要ありません。

必須コンポーネント

サンプル アプリ をダウンロードする

  • .NET Docker リポジトリを複製して、サンプルをダウンロードします。

    git clone https://github.com/dotnet/dotnet-docker
    

アプリをローカルで実行する

  • dotnet-docker/samples/aspnetapp/aspnetapp にあるプロジェクト フォルダーに移動します。

  • 次のコマンドを実行し、アプリをビルドしてローカルで実行します。

    dotnet run
    
  • アプリをテストするには、ブラウザーで http://localhost:5000 に移動します。

  • コマンド プロンプト上で Ctrl +C キーを押して、アプリを停止します。

Linux コンテナーまたは Windows コンテナーで実行する

  • Linux コンテナーで実行するには、システム トレイの Docker クライアント アイコンを右クリックし、[switch to Linux containers](Linux コンテナーへの切り替え) を選択します。

  • Windows コンテナーで実行するには、システム トレイの Docker クライアント アイコンを右クリックし、[switch to Windows containers](Windows コンテナーへの切り替え) を選択します。

  • dotnet-docker/samples/aspnetapp にある Dockerfile フォルダーに移動します。

  • 次のコマンドを実行して、Docker 内でサンプルをビルドして実行します。

    docker build -t aspnetapp .
    docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp
    

    build コマンドの引数:

    • イメージに aspnetapp という名前を付けます。
    • 現在のフォルダー内にある Dockerfile を探します (末尾にピリオド)。

    実行コマンドの引数:

    • 擬似端末を割り当てて、接続されていない場合でも開いた状態を保持します。 (--interactive --tty と効果は同じです。)
    • コンテナーが存在する場合は、自動的に削除します。
    • ローカル コンピューター上のポート 5000 をコンテナー内のポート 80 にマップします。
    • コンテナーに aspnetcore_sample という名前を付けます。
    • aspnetapp イメージを指定します。
  • アプリをテストするには、ブラウザーで http://localhost:5000 に移動します。

手動でビルドしてデプロイする

一部のシナリオでは、実行時に必要なアプリのアセットをコピーすることで、アプリをコンテナーにデプロイする方がよい場合があります。 このセクションでは、手動によるデプロイの方法を示します。

  • dotnet-docker/samples/aspnetapp/aspnetapp にあるプロジェクト フォルダーに移動します。

  • dotnet publish コマンドを実行します。

    dotnet publish -c Release -o published
    

    コマンドの引数:

    • リリース モードでアプリをビルドします (既定はデバッグ モードです)。
    • published フォルダーにアセットを作成します。
  • アプリを実行します。

    • Windows の場合:

      dotnet published\aspnetapp.dll
      
    • Linux の場合:

      dotnet published/aspnetapp.dll
      
  • http://localhost:5000 を参照してホーム ページを確認します。

Docker コンテナー内で手動で発行されたアプリを使用するには、新しい Dockerfile を作成し、docker build . コマンドを使用してイメージをビルドします。

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

新しいイメージを確認するには、docker images コマンドを使用します。

Dockerfile

ここに示すのは、先ほど実行した docker build コマンドで使用された Dockerfile です。 このセクションで実行したときと同じ方法で dotnet publish を使用して、ビルドとデプロイを行います。

# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /source

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app --no-restore

# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

新しいイメージを確認するには、docker images コマンドを使用します。

Dockerfile

ここに示すのは、先ほど実行した docker build コマンドで使用された Dockerfile です。 このセクションで実行したときと同じ方法で dotnet publish を使用して、ビルドとデプロイを行います。

# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /source

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app --no-restore

# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

前の Dockerfile では、*.csproj ファイルは別個の "レイヤー" としてコピーおよび復元されます。 docker build コマンドを使用してイメージをビルドすると、組み込みのキャッシュが使用されます。 docker build コマンドが最後に実行されてから *.csproj ファイルが変更されていない場合、dotnet restore コマンドを再度実行する必要はありません。 代わりに、対応する dotnet restore レイヤーの組み込みキャッシュが再利用されます。 詳細については、「Dockerfile を記述するためのベスト プラクティス」を参照してください。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

Dockerfile

ここに示すのは、先ほど実行した docker build コマンドで使用された Dockerfile です。 このセクションで実行したときと同じ方法で dotnet publish を使用して、ビルドとデプロイを行います。

FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /app/aspnetapp
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
WORKDIR /app
COPY --from=build /app/aspnetapp/out ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

前の Dockerfile で示されているように、*.csproj ファイルは別個の "レイヤー" としてコピーおよび復元されます。 docker build コマンドを使用してイメージをビルドすると、組み込みのキャッシュが使用されます。 docker build コマンドが最後に実行されてから *.csproj ファイルが変更されていない場合、dotnet restore コマンドを再度実行する必要はありません。 代わりに、対応する dotnet restore レイヤーの組み込みキャッシュが再利用されます。 詳細については、「Dockerfile を記述するためのベスト プラクティス」を参照してください。

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

Dockerfile

ここに示すのは、先ほど実行した docker build コマンドで使用された Dockerfile です。 このセクションで実行したときと同じ方法で dotnet publish を使用して、ビルドとデプロイを行います。

FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /app/aspnetapp
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
WORKDIR /app
COPY --from=build /app/aspnetapp/out ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

その他の技術情報

次の手順

同じアプリを格納している Git リポジトリにも、ドキュメントが用意されています。 リポジトリ内にある利用可能なリソースの概要については、README ファイルをご覧ください。 特に、HTTPS を実装する方法について確認してください。