.NET Core アプリケーションの Docker イメージのビルドBuilding Docker Images for .NET Core Applications

このチュートリアルでは、Docker で .NET Core を使用する方法を紹介します。In this tutorial, We focus on how to use .NET Core on Docker. 最初に、Microsoft が提供し、保守管理しているさまざま Docker イメージと使用例について考察します。First, we explore the different Docker images offered and maintained by Microsoft, and use cases. 次に、ASP.NET Core アプリをビルドし、Docker で動作させる方法について学習します。We then learn how to build and dockerize an ASP.NET Core app.

このチュートリアルを通して、以下のことを学びます。During the course of this tutorial, you learn:

  • Microsoft .NET Core Docker イメージについて学習するLearn about Microsoft .NET Core Docker images
  • Docker で動作させる ASP.NET Core サンプル アプリを取得するGet an ASP.NET Core sample app to Dockerize
  • ASP.NET サンプル アプリをローカルで実行するRun the ASP.NET sample app locally
  • サンプルをビルドし、Docker for Linux コンテナーで実行するBuild and run the sample with Docker for Linux containers
  • サンプルをビルドし、Docker for Windows コンテナーで実行するBuild and run the sample with Docker for Windows containers

Docker イメージの最適化Docker Image Optimizations

開発者向けの Docker イメージをビルドするにあたり、次の主な 3 つのシナリオに重点を置きました。When building Docker images for developers, we focused on three main scenarios:

  • .NET Core アプリの開発に使用されるイメージImages used to develop .NET Core apps
  • .NET Core アプリのビルドに使用されるイメージImages used to build .NET Core apps
  • .NET Core アプリの実行に使用されるイメージImages used to run .NET Core apps

3 つのイメージである理由は、Why three images? コンテナー化されたアプリケーションを開発、ビルドおよび実行する場合、優先順位がそれぞれ異なるためです。When developing, building, and running containerized applications, we have different priorities.

  • 開発: 変更をどれだけ速く繰り返せるかと変更のデバッグ機能が優先されます。Development: The priority focuses on quickly iterate changes, and the ability to debug the changes. イメージのサイズはそれほど重要ではなく、むしろ、コードを変更し、それをすばやく確認できるかが重要になります。The size of the image isn't as important, rather can you make changes to your code and see them quickly?

  • ビルド: このイメージには、コンパイラやバイナリを最適化するその他の依存関係など、アプリのコンパイルに必要なすべてが含まれます。Build: This image contains everything needed to compile your app, which includes the compiler and any other dependencies to optimize the binaries. ビルド イメージを使用し、実稼働イメージに置くアセットを作成します。You use the build image to create the assets you place into a production image. ビルド イメージは継続的インテグレーション、またはビルド環境で使用されます。The build image would be used for continuous integration, or in a build environment. この手法では、ビルド エージェントがビルド イメージ インスタンスで (必要なすべての依存関係と共に) アプリケーションをコンパイルし、ビルドできます。This approach allows a build agent to compile and build the application (with all the required dependencies) in a build image instance. この Docker イメージの実行方法を理解する必要があるのはビルド エージェントのみです。Your build agent only needs to know how to run this Docker image.

  • 実稼働: イメージをどれだけ速く配置し、開始できるか。Production: How fast you can deploy and start your image? このイメージは小さく、Docker レジストリから Docker ホストまでのネットワーク パフォーマンスが最適化されます。This image is small so network performance from your Docker Registry to your Docker hosts is optimized. コンテンツは実行できる状態であるため、Docker の実行から結果の処理までを最速で行うことができます。The contents are ready to run enabling the fastest time from Docker run to processing results. 動的コード コンパイルは Docker モデルで必要ありません。Dynamic code compilation isn't needed in the Docker model. このイメージに配置するコンテンツは、アプリケーションの実行に必要なバイナリとコンテンツに制限されます。The content you place in this image would be limited to the binaries and content needed to run the application.

    たとえば、dotnet publish 出力には次が含まれています。For example, the dotnet publish output contains:

    • コンパイルされたバイナリthe compiled binaries
    • .js ファイルと .css ファイル.js and .css files

実稼働イメージに dotnet publish コマンド出力を含める理由は、そのサイズを最小限に抑えることにあります。The reason to include the dotnet publish command output in your production image is to keep its size to a minimum.

一部の .NET Core イメージは異なるタグの間で層を共有します。そのため、最新のタグをダウンロードするプロセスが比較的軽くなります。Some .NET Core images share layers between different tags so downloading the latest tag is a relatively lightweight process. コンピューターに以前のバージョンがインストールされている場合、このアーキテクチャで必要なディスク領域が減ります。If you already have an older version on your machine, this architecture decreases the needed disk space.

複数のアプリケーションが同じコンピューターで共通のイメージを使用するとき、共通のイメージ間でメモリが共有されます。When multiple applications use common images on the same machine, memory is shared between the common images. 共有するイメージは同じものにする必要があります。The images must be the same to be shared.

Docker イメージのバリエーションDocker image variations

上記の目標を達成するために、microsoft/dotnet にはイメージ バリアントが用意されています。To achieve the goals above, we provide image variants under microsoft/dotnet.

  • microsoft/dotnet:<version>-sdk(microsoft/dotnet:2.1-sdk) このイメージには、.NET Core とコマンド ライン ツール (CLI) を含む .NET Core SDK が含まれています。microsoft/dotnet:<version>-sdk(microsoft/dotnet:2.1-sdk) This image contains the .NET Core SDK, which includes the .NET Core and Command Line Tools (CLI). このイメージは 開発シナリオ にマップされます。This image maps to the development scenario. このイメージは、ローカル開発、デバッグおよび単体テストに使用します。You use this image for local development, debugging, and unit testing. このイメージは、ビルド シナリオでも使用できます。This image can also be used for your build scenarios. microsoft/dotnet:sdk を使用すると、常に最新版が取得されます。Using microsoft/dotnet:sdk always gives you the latest version.

ヒント

要件が確定していない場合、microsoft/dotnet:<version>-sdk イメージの使用をお勧めします。If you are unsure about your needs, you want to use the microsoft/dotnet:<version>-sdk image. これは "事実上標準の" イメージであり、使い捨てのコンテナーとして使用されます (ソース コードをマウントし、コンテナーを起動してアプリを開始します)。また、基礎イメージとして使用し、これに基づいて他のイメージをビルドします。As the "de facto" image, it's designed to be used as a throw away container (mount your source code and start the container to start your app), and as the base image to build other images from.

  • microsoft/dotnet:<version>-runtime: このイメージには .NET Core が含まれ (ランタイムとライブラリ)、実稼働で .NET Core アプリを実行するために最適化されています。microsoft/dotnet:<version>-runtime: This image contains the .NET Core (runtime and libraries) and is optimized for running .NET Core apps in production.

その他のイメージAlternative images

開発、ビルドおよび実稼働の最適化されたシナリオに加え、次の追加イメージが提供されます。In addition to the optimized scenarios of development, build and production, we provide additional images:

  • microsoft/dotnet:<version>-runtime-deps: runtime-deps イメージには、オペレーティング システムと .NET Core で必要とされるすべてのネイティブ依存関係が含まれます。microsoft/dotnet:<version>-runtime-deps: The runtime-deps image contains the operating system with all of the native dependencies needed by .NET Core. このイメージは自己完結型アプリケーション用です。This image is for self-contained applications.

各バリアントの最新バージョン:Latest versions of each variant:

  • microsoft/dotnet または microsoft/dotnet:latest (SDK イメージのエイリアス)microsoft/dotnet or microsoft/dotnet:latest (alias for the SDK image)
  • microsoft/dotnet:sdk
  • microsoft/dotnet:runtime
  • microsoft/dotnet:runtime-deps

お試しいただきたいサンプルSamples to explore

初めての ASP.NET Core Docker アプリYour first ASP.NET Core Docker app

このチュートリアルでは、Docker で動作させるアプリに ASP.NET Core Docker サンプル アプリケーションを使用しましょう。For this tutorial, lets use an ASP.NET Core Docker sample application for the app we want to dockerize. この ASP.NET Core Docker サンプル アプリケーションでは、運用環境向け ASP.NET Core アプリの Docker イメージをビルドする場合のベスト プラクティス パターンを確認できます。This ASP.NET Core Docker sample application demonstrates a best practice pattern for building Docker images for ASP.NET Core apps for production. このサンプルは Linux コンテナーと Windows コンテナーのどちらでも動作します。The sample works with both Linux and Windows containers.

このサンプル Dockerfile は、ASP.NET Core Runtime Docker ベース イメージに基づき、ASP.NET Core アプリケーション Docker イメージを作成します。The sample Dockerfile creates an ASP.NET Core application Docker image based off of the ASP.NET Core Runtime Docker base image.

Docker のマルチステージ ビルド機能を利用し、次のことを行います。It uses the Docker multi-stage build feature to:

  • より大きな ASP.NET Core Build Docker ベース イメージに基づき、コンテナーでサンプルをビルドするbuild the sample in a container based on the larger ASP.NET Core Build Docker base image
  • より小さい ASP.NET Core Docker Runtime ベース イメージに基づき、最終的なビルド結果を Docker イメージにコピーするcopies the final build result into a Docker image based on the smaller ASP.NET Core Docker Runtime base image

注意

このビルド イメージには、アプリケーションのビルドに必要なツールが含まれています。ランタイム イメージにはそれが含まれていません。The build image contains required tools to build applications while the runtime image does not.

必須コンポーネントPrerequisites

ビルドし、実行するには、次のアイテムをインストールします。To build and run, install the following items:

.NET Core 2.1 SDK.NET Core 2.1 SDK

  • .NET Core SDK 2.1 をインストールします。Install .NET Core SDK 2.1.

  • コード エディターをまだインストールしていなければ、お気に入りのエディターをインストールしてください。Install your favorite code editor, if you haven't already.

ヒント

コード エディターをインストールする必要がありますか。Need to install a code editor? Visual Studio をお試しください。Try Visual Studio!

Docker クライアントをインストールするInstalling Docker Client

Docker 18.03 以降の Docker クライアントをインストールします。Install Docker 18.03 or later of the Docker client.

Docker クライアントがインストール可能な OS:The Docker client can be installed in:

サンプル リポジトリとして Git をインストールするInstalling Git for sample repository

  • リポジトリを複製する場合、git をインストールします。Install git if you wish to clone the repository.

サンプル アプリケーションを入手するGetting the sample application

サンプルを用意する最も簡単な方法は、git で.NET Core Docker リポジトリを複製することです。次の指示に従ってください。The easiest way to get the sample is by cloning the .NET Core Docker repository with git, using the following instructions:

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

.NET Core Docker リポジトリから zip ファイルとしてリポジトリ (小さい) をダウンロードすることもできます。You can also download the repository (it is small) as a zip from the .NET Core Docker repository.

ASP.NET アプリをローカルで実行するRun the ASP.NET app locally

参照ポイントとして、アプリケーションをコンテナー化する前に、まず、アプリケーションをローカルで実行します。For a reference point, before we containerize the application, first run the application locally.

.NET Core 2.1 SDK を利用してアプリケーションをビルドし、ローカルで実行できます。次のコマンドを利用します (この指示では、リポジトリのルートを想定しています)。You can build and run the application locally with the .NET Core 2.1 SDK using the following commands (The instructions assume the root of the repository):

cd dotnet-docker
cd samples
cd aspnetapp // solution scope where the dockerfile is located
cd aspnetapp // project scope

dotnet run

アプリケーションが起動したら、お使いの Web ブラウザーで http://localhost:5000 にアクセスします。After the application starts, visit http://localhost:5000 in your web browser.

サンプルをビルドし、Docker for Linux コンテナーで実行するBuild and run the sample with Docker for Linux containers

Linux コンテナーを利用し、Docker でサンプルをビルドし、実行できます。次のコマンドを利用します (この指示では、リポジトリのルートを想定しています)。You can build and run the sample in Docker using Linux containers using the following commands (The instructions assume the root of the repository):

cd dotnet-docker
cd samples
cd aspnetapp // solution scope where the dockerfile is located

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

注意

docker run '-p' 引数は、コンピューターのポート 5000 をコンテナーのポート 80 にマッピングします (ポート マッピングの形式は host:container です)。The docker run '-p' argument maps port 5000 on your local machine to port 80 in the container (the port mapping form is host:container). 詳細については、コマンドライン パラメーターの docker run 参照をご覧ください。For more information, see the docker run reference on command-line parameters.

アプリケーションが起動したら、お使いの Web ブラウザーで http://localhost:5000 にアクセスします。After the application starts, visit http://localhost:5000 in your web browser.

サンプルをビルドし、Docker for Windows コンテナーで実行するBuild and run the sample with Docker for Windows containers

Window コンテナーを利用し、Docker でサンプルをビルドし、実行できます。次のコマンドを利用します (この指示では、リポジトリのルートを想定しています)。You can build and run the sample in Docker using Windows containers using the following commands (The instructions assume the root of the repository):

cd dotnet-docker
cd samples
cd aspnetapp // solution scope where the dockerfile is located

docker build -t aspnetapp .
docker run -it --rm --name aspnetcore_sample aspnetapp

重要

Windows コンテナーの利用時、お使いのブラウザーで (http://localhost) ではなく) コンテナー IP アドレスに移動する必要があります。You must navigate to the container IP address (as opposed to http://localhost) in your browser directly when using Windows containers. 次の手順でコンテナーの IP アドレスを取得できます。You can get the IP address of your container with the following steps:

  • 別のコマンド プロンプトを開きます。Open up another command prompt.
  • docker ps を実行し、実行中のコンテナーを確認します。Run docker ps to see your running containers. "aspnetcore_sample" コンテナーを確認できるはずです。The "aspnetcore_sample" container should be there.
  • docker exec aspnetcore_sample ipconfig を実行します。Run docker exec aspnetcore_sample ipconfig.
  • コンテナー IP アドレスをコピーし、ブラウザーに貼り付けます (たとえば、172.29.245.43)。Copy the container IP address and paste into your browser (for example, 172.29.245.43).

注意

Docker exec は、名前やハッシュでコンテナーを識別できます。Docker exec supports identifying containers with name or hash. 今回のサンプルでは名前 (aspnetcore_sample) が使用されています。The name (aspnetcore_sample) is used in our example.

次の例では、実行中の Windows コンテナーの IP アドレスを取得する方法を確認できます。See the following example of how to get the IP address of a running Windows container.

docker exec aspnetcore_sample ipconfig

Windows IP Configuration

Ethernet adapter Ethernet:

   Connection-specific DNS Suffix  . : contoso.com
   Link-local IPv6 Address . . . . . : fe80::1967:6598:124:cfa3%4
   IPv4 Address. . . . . . . . . . . : 172.29.245.43
   Subnet Mask . . . . . . . . . . . : 255.255.240.0
   Default Gateway . . . . . . . . . : 172.29.240.1

注意

Docker exec は、実行中のコンテナーで新しいコマンドを実行します。Docker exec runs a new command in a running container. 詳細については、コマンドライン パラメーターの docker exec 参照をご覧ください。For more information, see the docker exec reference on command-line parameters.

dotnet publish コマンドを利用し、運用環境にローカル展開できるアプリケーションを生成できます。You can produce an application that is ready to deploy to production locally using the dotnet publish command.

dotnet publish -c Release -o published

注意

-c リリース引数はリリース モードでアプリケーションをビルドします (既定はデバッグ モードです)。The -c Release argument builds the application in release mode (the default is debug mode). 詳細については、コマンドライン パラメーターの dotnet run 参照をご覧ください。For more information, see the dotnet run reference on command-line parameters.

次のコマンドを利用し、Windows でアプリケーションを実行できます。You can run the application on Windows using the following command.

dotnet published\aspnetapp.dll

次のコマンドを利用し、Linux または macOS でアプリケーションを実行できます。You can run the application on Linux or macOS using the following command.

dotnet published/aspnetapp.dll

このサンプルで使用されている Docker イメージDocker Images used in this sample

次の Docker イメージはこのサンプルの dockerfile で使用されています。The following Docker images are used in this sample's dockerfile.

  • microsoft/dotnet:2.1-sdk
  • microsoft/dotnet:2.1-aspnetcore-runtime

おめでとうございます! Congratulations! 今回の成果:you have just:

  • Microsoft .NET Core Docker イメージについて学習しましたLearned about Microsoft .NET Core Docker images
  • Docker で動作させる ASP.NET Core サンプル アプリを取得しましたGot an ASP.NET Core sample app to Dockerize
  • ASP.NET サンプル アプリをローカルで実行しましたRan the ASP.NET sample app locally
  • サンプルをビルドし、Docker for Linux コンテナーで実行しましたBuilt and ran the sample with Docker for Linux containers
  • サンプルをビルドし、Docker for Windows コンテナーで実行しましたBuilt and ran the sample with Docker for Windows containers

次の手順Next Steps

次の手順としては以下のものを用意しています。Here are some next steps you can take:

注意

Azure サブスクリプションをお持ちでない場合は、今すぐサインアップして 30 日間の無料アカウントと 200 ドル分の Azure クレジットを取得し、お好きな Azure サービスの組み合わせを試しましょう。If you do not have an Azure subscription, sign up today for a free 30-day account and get $200 in Azure Credits to try out any combination of Azure services.