Visual Studio Tools for Docker と ASP.NET CoreVisual Studio Tools for Docker with ASP.NET Core

Visual Studio 2017 以降のバージョンでは、.NET Core をターゲットとするコンテナー化された ASP.NET Core アプリのビルド、デバッグ、実行がサポートされています。Visual Studio 2017 and later versions support building, debugging, and running containerized ASP.NET Core apps targeting .NET Core. Windows と Linux の両方のコンテナーがサポートされます。Both Windows and Linux containers are supported.

サンプル コードを表示またはダウンロードします (ダウンロード方法)。View or download sample code (how to download)

必須コンポーネントPrerequisites

インストールとセットアップInstallation and setup

Docker をインストールするには、まず、「Docker for Windows:What to know before you install」 (Docker Desktop for Windows: インストール前に知っておくべきこと) の情報を確認します。For Docker installation, first review the information at Docker for Windows: What to know before you install. 次に、Docker for Windows をインストールします。Next, install Docker For Windows.

ボリュームのマッピングとデバッグをサポートするように、Docker for Windows で 共有ドライブ を構成する必要があります。Shared Drives in Docker for Windows must be configured to support volume mapping and debugging. システム トレイの Docker アイコンを右クリックし、 [設定][Shared Drives](共有ドライブ) の順に選択します。Right-click the System Tray's Docker icon, select Settings, and select Shared Drives. Docker がファイルを保存するドライブを選択します。Select the drive where Docker stores files. [適用] をクリックします。Click Apply.

コンテナーで共有するローカル C ドライブを選択するためのダイアログ

ヒント

Visual Studio 2017 バージョン 15.6 以降では、共有ドライブが構成されていない場合にプロンプトが表示されます。Visual Studio 2017 versions 15.6 and later prompt when Shared Drives aren't configured.

Docker コンテナーにプロジェクトを追加するAdd a project to a Docker container

ASP.NET Core プロジェクトをコンテナー化するには、プロジェクトで .NET Core をターゲットにする必要があります。To containerize an ASP.NET Core project, the project must target .NET Core. Linux と Windows の両方のコンテナーがサポートされています。Both Linux and Windows containers are supported.

プロジェクトに Docker サポートを追加する場合は、Windows または Linux のいずれかのコンテナーを選択します。When adding Docker support to a project, choose either a Windows or a Linux container. Docker ホストが同じコンテナーの種類を実行している必要があります。The Docker host must be running the same container type. 実行中の Docker インスタンスでコンテナーの種類を変更するには、システム トレイの Docker アイコンを右クリックして、 [Switch to Windows containers...](Windows コンテナーに切り替える...) または [Switch to Linux containers...](Linux コンテナーに切り替える...) を選択します。To change the container type in the running Docker instance, right-click the System Tray's Docker icon and choose Switch to Windows containers... or Switch to Linux containers....

新しいアプリNew app

ASP.NET Core Web アプリケーション プロジェクト テンプレートを使用して新しいアプリを作成する場合は、次のように [Enable Docker Support](Docker サポートを有効にする) チェック ボックスをオンにします。When creating a new app with the ASP.NET Core Web Application project templates, select the Enable Docker Support check box:

[Enable Docker Support](Docker サポートを有効にする) チェック ボックス

ターゲット フレームワークが .NET Core の場合、 [OS] ドロップダウンでコンテナーの種類を選択できます。If the target framework is .NET Core, the OS drop-down allows for the selection of a container type.

既存のアプリExisting app

.NET Core をターゲットとする ASP.NET Core プロジェクトの場合、ツールを使用して Docker サポートを追加するための 2 つのオプションがあります。For ASP.NET Core projects targeting .NET Core, there are two options for adding Docker support via the tooling. Visual Studio でプロジェクトを開き、次のオプションのいずれかを選択します。Open the project in Visual Studio, and choose one of the following options:

  • [プロジェクト] メニューから [Docker サポート] を選択します。Select Docker Support from the Project menu.
  • ソリューション エクスプローラーでプロジェクトを右クリックして、 [追加] > [Docker サポート] の順に選択します。Right-click the project in Solution Explorer and select Add > Docker Support.

Visual Studio Tools for Docker では、.NET Framework をターゲットとする既存の ASP.NET Core プロジェクトへの Docker の追加はサポートされません。The Visual Studio Tools for Docker don't support adding Docker to an existing ASP.NET Core project targeting .NET Framework.

Dockerfile の概要Dockerfile overview

Dockerfile (Docker の最終イメージを作成するためのレシピ) は、プロジェクトのルートに追加されます。A Dockerfile, the recipe for creating a final Docker image, is added to the project root. その中に含まれるコマンドの詳細については、「Dockerfile reference」 (Dockerfile リファレンス) を参照してください。Refer to Dockerfile reference for an understanding of the commands within it. この特定の Dockerfile では、次のような、4 つの異なる名前付きのビルド ステージを含む、multi-stage build を使用します。This particular Dockerfile uses a multi-stage build with four distinct, named build stages:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 AS base
WORKDIR /app
EXPOSE 59518
EXPOSE 44364

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build
WORKDIR /src
COPY HelloDockerTools/HelloDockerTools.csproj HelloDockerTools/
RUN dotnet restore HelloDockerTools/HelloDockerTools.csproj
COPY . .
WORKDIR /src/HelloDockerTools
RUN dotnet build HelloDockerTools.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish HelloDockerTools.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "HelloDockerTools.dll"]

上記の Dockerfile は、microsoft/dotnet イメージに基づいています。The preceding Dockerfile is based on the microsoft/dotnet image. この基本イメージには、ASP.NET Core ランタイムと NuGet パッケージが含まれます。This base image includes the ASP.NET Core runtime and NuGet packages. パッケージは、起動時のパフォーマンスを向上させるために JIT (Just-In-Time) コンパイルされます。The packages are just-in-time (JIT) compiled to improve startup performance.

新しいプロジェクト ダイアログの [Configure for HTTPS](HTTPS 用に構成する) チェック ボックスがオンになっている場合、Dockerfile は 2 つのポートを公開します。When the new project dialog's Configure for HTTPS check box is checked, the Dockerfile exposes two ports. 1 つのポートは HTTP トラフィック用、もう 1 つのポートは HTTPS 用に使用されます。One port is used for HTTP traffic; the other port is used for HTTPS. チェック ボックスがオンになっていない場合は、HTTP トラフィック用に単一のポート (80) が公開されます。If the check box isn't checked, a single port (80) is exposed for HTTP traffic.

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY HelloDockerTools/HelloDockerTools.csproj HelloDockerTools/
RUN dotnet restore HelloDockerTools/HelloDockerTools.csproj
COPY . .
WORKDIR /src/HelloDockerTools
RUN dotnet build HelloDockerTools.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish HelloDockerTools.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "HelloDockerTools.dll"]

上記の Dockerfile は、microsoft/aspnetcore イメージに基づいています。The preceding Dockerfile is based on the microsoft/aspnetcore image. この基本イメージには、起動時のパフォーマンスを向上させるために JIT (Just-In-Time) コンパイルされる、ASP.NET Core NuGet パッケージが含まれます。This base image includes the ASP.NET Core NuGet packages, which are just-in-time (JIT) compiled to improve startup performance.

アプリにコンテナー オーケストレーター サポートを追加するAdd container orchestrator support to an app

Visual Studio 2017 バージョン 15.7 以前では、唯一のコンテナー オーケストレーション ソリューションとして、Docker Compose がサポートされています。Visual Studio 2017 versions 15.7 or earlier support Docker Compose as the sole container orchestration solution. Docker Compose の成果物は、 [追加] > [Docker サポート] を使用して追加されます。The Docker Compose artifacts are added via Add > Docker Support.

Visual Studio 2017 バージョン 15.8 以降では、指示された場合にのみ、オーケストレーション ソリューションが追加されます。Visual Studio 2017 versions 15.8 or later add an orchestration solution only when instructed. ソリューション エクスプローラーでプロジェクトを右クリックして、 [追加] > [Container Orchestrator Support](コンテナー オーケストレーター サポート) の順に選択します。Right-click the project in Solution Explorer and select Add > Container Orchestrator Support. 2 つの異なる選択肢が提示されます。Docker ComposeService Fabric です。Two different choices are offered: Docker Compose and Service Fabric.

Docker ComposeDocker Compose

Visual Studio Tools for Docker では、ソリューションに docker-compose プロジェクトを追加します。これには以下のファイルが含まれます。The Visual Studio Tools for Docker add a docker-compose project to the solution with the following files:

  • docker-compose.dcproj –プロジェクトを表すファイル。docker-compose.dcproj – The file representing the project. 使用する OS を指定する <DockerTargetOS> 要素が含まれます。Includes a <DockerTargetOS> element specifying the OS to be used.
  • .dockerignore – ビルド コンテキストを生成するときに除外するファイルとディレクトリのパターンが一覧表示されます。.dockerignore – Lists the file and directory patterns to exclude when generating a build context.
  • docker-compose.ymldocker-compose build および docker-compose run を使用して、それぞれビルドおよび実行されるイメージのコレクションを定義するために使用される、基本の Docker Compose ファイル。docker-compose.yml – The base Docker Compose file used to define the collection of images built and run with docker-compose build and docker-compose run, respectively.
  • docker-compose.override.yml – サービスの構成オーバーライドを含む、Docker Compose によって読み取られるオプション ファイル。docker-compose.override.yml – An optional file, read by Docker Compose, with configuration overrides for services. Visual Studio は docker-compose -f "docker-compose.yml" -f "docker-compose.override.yml" を実行してこれらのファイルをマージします。Visual Studio executes docker-compose -f "docker-compose.yml" -f "docker-compose.override.yml" to merge these files.

docker-compose.yml ファイルでは、プロジェクトの実行時に作成されたイメージの名前を参照します。The docker-compose.yml file references the name of the image that's created when the project runs:

version: '3.4'

services:
  hellodockertools:
    image: ${DOCKER_REGISTRY}hellodockertools
    build:
      context: .
      dockerfile: HelloDockerTools/Dockerfile

上の例では、image: hellodockertools によって、アプリがデバッグ モードで実行されるときに、イメージ hellodockertools:dev が生成されます。In the preceding example, image: hellodockertools generates the image hellodockertools:dev when the app runs in Debug mode. hellodockertools:latest イメージは、アプリがリリース モードで実行されるときに生成されます。The hellodockertools:latest image is generated when the app runs in Release mode.

イメージがレジストリにプッシュされる場合は、イメージ名の前に Docker Hub のユーザー名を付けます (例: dockerhubusername/hellodockertools)。Prefix the image name with the Docker Hub username (for example, dockerhubusername/hellodockertools) if the image is pushed to the registry. または、構成に応じて、プライベート レジストリ URL を含めるようにイメージ名を変更します (例: privateregistry.domain.com/hellodockertools)。Alternatively, change the image name to include the private registry URL (for example, privateregistry.domain.com/hellodockertools) depending on the configuration.

ビルド構成に基づいて動作を別にしたい場合 (デバッグやリリースなど)、構成固有のdocker-compose ファイルを追加します。If you want different behavior based on the build configuration (for example, Debug or Release), add configuration-specific docker-compose files. ビルド構成に基づいて (たとえば、docker-compose.vs.debug.yml および docker-compose.vs.release.yml) ファイル名を指定して、docker-compose-override.yml ファイルと同じ場所にそのファイルを配置する必要があります。The files should be named according to the build configuration (for example, docker-compose.vs.debug.yml and docker-compose.vs.release.yml) and placed in the same location as the docker-compose-override.yml file.

構成固有の上書きファイルを使用して、デバッグおよびリリース ビルド構成に対して、さまざまな構成設定 (環境変数やエンドポイントなど) を指定できます。Using the configuration-specific override files, you can specify different configuration settings (such as environment variables or entry points) for Debug and Release build configurations.

Service FabricService Fabric

基本的な前提条件に加え、Service Fabric オーケストレーション ソリューションでは次の前提条件が求められます。In addition to the base Prerequisites, the Service Fabric orchestration solution demands the following prerequisites:

Service Fabric では、Windows 上のローカル開発クラスターでの Linux コンテナーの実行はサポートされません。Service Fabric doesn't support running Linux containers in the local development cluster on Windows. プロジェクトで既に Linux コンテナーが使用されている場合は、Visual Studio で Windows コンテナーに切り替えるよう求められます。If the project is already using a Linux container, Visual Studio prompts to switch to Windows containers.

Visual Studio Tools for Docker では、次のタスクを行います。The Visual Studio Tools for Docker do the following tasks:

  • <プロジェクト名>アプリケーション Service Fabric アプリケーション プロジェクトをソリューションに追加します。Adds a <project_name>Application Service Fabric Application project to the solution.

  • Dockerfile.dockerignore ファイルを ASP.NET Core プロジェクトに追加します。Adds a Dockerfile and a .dockerignore file to the ASP.NET Core project. Dockerfile が既に ASP.NET Core プロジェクトに存在する場合は、名前が Dockerfile.original に変更されます。If a Dockerfile already exists in the ASP.NET Core project, it's renamed to Dockerfile.original. 次のような、新しい Dockerfile が作成されます。A new Dockerfile, similar to the following, is created:

    # See https://aka.ms/containerimagehelp for information on how to use Windows Server 1709 containers with Service Fabric.
    # FROM microsoft/aspnetcore:2.0-nanoserver-1709
    FROM microsoft/aspnetcore:2.0-nanoserver-sac2016
    ARG source
    WORKDIR /app
    COPY ${source:-obj/Docker/publish} .
    ENTRYPOINT ["dotnet", "HelloDockerTools.dll"]
    
  • <IsServiceFabricServiceProject> 要素を ASP.NET Core プロジェクトの .csproj ファイルに追加します。Adds an <IsServiceFabricServiceProject> element to the ASP.NET Core project's .csproj file:

    <IsServiceFabricServiceProject>True</IsServiceFabricServiceProject>
    
  • PackageRoot フォルダーを ASP.NET Core プロジェクトに追加します。Adds a PackageRoot folder to the ASP.NET Core project. フォルダーには、新しいサービスのサービス マニフェストと設定が含まれます。The folder includes the service manifest and settings for the new service.

詳細については、「Windows コンテナー内の .NET アプリケーションを Azure Service Fabric にデプロイする」を参照してください。For more information, see Deploy a .NET app in a Windows container to Azure Service Fabric.

デバッグDebug

ツールバーのデバッグ ドロップダウンから [Docker] を選択し、アプリのデバッグを開始します。Select Docker from the debug drop-down in the toolbar, and start debugging the app. [出力] ウィンドウの [Docker] ビューには、行われている次のアクションが表示されます。The Docker view of the Output window shows the following actions taking place:

  • microsoft/dotnet ランタイム イメージの 2.1-aspnetcore-runtime タグが取得されます (キャッシュにまだ存在しない場合)。The 2.1-aspnetcore-runtime tag of the microsoft/dotnet runtime image is acquired (if not already in the cache). イメージでは、ASP.NET Core と .NET Core ランタイムおよび関連付けられているライブラリがインストールされます。The image installs the ASP.NET Core and .NET Core runtimes and associated libraries. 運用環境で ASP.NET Core アプリを実行するために最適化されます。It's optimized for running ASP.NET Core apps in production.
  • ASPNETCORE_ENVIRONMENT 環境変数は、コンテナー内で Development に設定されます。The ASPNETCORE_ENVIRONMENT environment variable is set to Development within the container.
  • HTTP と HTTPS 用に 1 つずつ、2 つの動的に割り当てられたポートが公開されます。Two dynamically assigned ports are exposed: one for HTTP and one for HTTPS. localhost に割り当てられたポートは、docker ps コマンドを使用してクエリを実行できます。The port assigned to localhost can be queried with the docker ps command.
  • アプリがコンテナーにコピーされます。The app is copied to the container.
  • 動的に割り当てられたポートを使用して、デバッガーがコンテナーにアタッチされ、既定のブラウザーが起動します。The default browser is launched with the debugger attached to the container using the dynamically assigned port.

アプリの結果の Docker イメージは、dev としてタグ付けされます。The resulting Docker image of the app is tagged as dev. イメージは、microsoft/dotnet 基本イメージの 2.1-aspnetcore-runtime タグに基づいています。The image is based on the 2.1-aspnetcore-runtime tag of the microsoft/dotnet base image. パッケージ マネージャー コンソール (PMC) ウィンドウで docker images コマンドを実行します。Run the docker images command in the Package Manager Console (PMC) window. コンピューター上のイメージが表示されます。The images on the machine are displayed:

REPOSITORY        TAG                     IMAGE ID      CREATED         SIZE
hellodockertools  dev                     d72ce0f1dfe7  30 seconds ago  255MB
microsoft/dotnet  2.1-aspnetcore-runtime  fcc3887985bb  6 days ago      255MB
  • microsoft/aspnetcore ランタイム イメージが取得されます (まだキャッシュにない場合)。The microsoft/aspnetcore runtime image is acquired (if not already in the cache).
  • ASPNETCORE_ENVIRONMENT 環境変数は、コンテナー内で Development に設定されます。The ASPNETCORE_ENVIRONMENT environment variable is set to Development within the container.
  • ポート 80 が公開され、localhost 用に動的に割り当てられているポートにマップされます。Port 80 is exposed and mapped to a dynamically assigned port for localhost. このポートは、Docker ホストによって決定され、docker ps コマンドでクエリを実行することができます。The port is determined by the Docker host and can be queried with the docker ps command.
  • アプリがコンテナーにコピーされます。The app is copied to the container.
  • 動的に割り当てられたポートを使用して、デバッガーがコンテナーにアタッチされ、既定のブラウザーが起動します。The default browser is launched with the debugger attached to the container using the dynamically assigned port.

アプリの結果の Docker イメージは、dev としてタグ付けされます。The resulting Docker image of the app is tagged as dev. イメージは、microsoft/aspnetcore 基本イメージに基づいています。The image is based on the microsoft/aspnetcore base image. パッケージ マネージャー コンソール (PMC) ウィンドウで docker images コマンドを実行します。Run the docker images command in the Package Manager Console (PMC) window. コンピューター上のイメージが表示されます。The images on the machine are displayed:

REPOSITORY            TAG  IMAGE ID      CREATED        SIZE
hellodockertools      dev  5fafe5d1ad5b  4 minutes ago  347MB
microsoft/aspnetcore  2.0  c69d39472da9  13 days ago    347MB

注意

デバッグ構成では、反復にボリューム マウントを使用するため、devイメージにはアプリのコンテンツはありません。The dev image lacks the app contents, as Debug configurations use volume mounting to provide the iterative experience. イメージをプッシュするには、リリース構成を使用します。To push an image, use the Release configuration.

PMC で docker ps コマンドを実行します。Run the docker ps command in PMC. アプリがコンテナーを使用して実行されていることがわかります。Notice the app is running using the container:

CONTAINER ID        IMAGE                  COMMAND                   CREATED             STATUS              PORTS                   NAMES
baf9a678c88d        hellodockertools:dev   "C:\\remote_debugge..."   21 seconds ago      Up 19 seconds       0.0.0.0:37630->80/tcp   dockercompose4642749010770307127_hellodockertools_1

エディット コンティニュEdit and continue

静的なファイルや Razor ビューに対する変更は、コンパイルを行う必要はなく、自動的に更新されます。Changes to static files and Razor views are automatically updated without the need for a compilation step. 変更を行って保存し、ブラウザーを更新し、更新を確認します。Make the change, save, and refresh the browser to view the update.

コード ファイルを変更する場合、コンテナー内で Kestrel をコンパイルして再起動する必要があります。Code file modifications require compilation and a restart of Kestrel within the container. 変更したら、CTRL+F5 キーを使用して、コンテナー内でプロセスを実行し、アプリを起動します。After making the change, use CTRL+F5 to perform the process and start the app within the container. Docker コンテナーが再構築されたり、停止されたりすることはありません。The Docker container isn't rebuilt or stopped. PMC で docker ps コマンドを実行します。Run the docker ps command in PMC. 元のコンテナーが 10 分前と同じ状態で実行されていることを確認できます。Notice the original container is still running as of 10 minutes ago:

CONTAINER ID        IMAGE                  COMMAND                   CREATED             STATUS              PORTS                   NAMES
baf9a678c88d        hellodockertools:dev   "C:\\remote_debugge..."   10 minutes ago      Up 10 minutes       0.0.0.0:37630->80/tcp   dockercompose4642749010770307127_hellodockertools_1

Docker イメージの発行Publish Docker images

アプリの開発とデバッグのサイクルが完了したら、Visual Studio Tools for Docker でアプリの実稼働イメージを作成できます。Once the develop and debug cycle of the app is completed, the Visual Studio Tools for Docker assist in creating the production image of the app. 構成ドロップダウンを [リリース] に変更し、アプリを構築します。Change the configuration drop-down to Release and build the app. ツールは、Docker Hub からコンパイル/発行イメージを取得します (まだキャッシュに存在しない場合)。The tooling acquires the compile/publish image from Docker Hub (if not already in the cache). イメージは、プライベート レジストリまたは Docker Hub にプッシュできる latest タグ付きで生成されます。An image is produced with the latest tag, which can be pushed to the private registry or Docker Hub.

PMC で docker images コマンドを実行して、イメージの一覧を表示します。Run the docker images command in PMC to see the list of images. 次のような出力が表示されます。Output similar to the following is displayed:

REPOSITORY        TAG                     IMAGE ID      CREATED             SIZE
hellodockertools  latest                  e3984a64230c  About a minute ago  258MB
hellodockertools  dev                     d72ce0f1dfe7  4 minutes ago       255MB
microsoft/dotnet  2.1-sdk                 9e243db15f91  6 days ago          1.7GB
microsoft/dotnet  2.1-aspnetcore-runtime  fcc3887985bb  6 days ago          255MB
REPOSITORY                  TAG     IMAGE ID      CREATED         SIZE
hellodockertools            latest  cd28f0d4abbd  12 seconds ago  349MB
hellodockertools            dev     5fafe5d1ad5b  23 minutes ago  347MB
microsoft/aspnetcore-build  2.0     7fed40fbb647  13 days ago     2.02GB
microsoft/aspnetcore        2.0     c69d39472da9  13 days ago     347MB

上記の出力に一覧表示されている microsoft/aspnetcore-build および microsoft/aspnetcore イメージは、.NET Core 2.1 の時点で microsoft/dotnet イメージに置き換えられます。The microsoft/aspnetcore-build and microsoft/aspnetcore images listed in the preceding output are replaced with microsoft/dotnet images as of .NET Core 2.1. 詳細については、Docker リポジトリの移行に関するお知らせを参照してください。For more information, see the Docker repositories migration announcement.

注意

docker images コマンドは、 <none> として識別されるリポジトリ名とタグを持つ中間イメージを返します (上にはリストされていません)。The docker images command returns intermediary images with repository names and tags identified as <none> (not listed above). これらの名前のないイメージは、multi-stage build Dockerfile によって生成されます。These unnamed images are produced by the multi-stage build Dockerfile. これにより、最終イメージの構築効率が向上します—変更時には必要なレイヤーのみが再構築されます。They improve the efficiency of building the final image—only the necessary layers are rebuilt when changes occur. 中間イメージが不要になった場合は、docker rmi コマンドを使用して削除します。When the intermediary images are no longer needed, delete them using the docker rmi command.

dev イメージと比較した場合、実稼働またはリリース イメージはサイズが小さいと思うかもしれません。There may be an expectation for the production or release image to be smaller in size by comparison to the dev image. ボリューム マッピングにより、デバッガーとアプリは、コンテナー内ではなく、ローカル コンピューターから実行されています。Because of the volume mapping, the debugger and app were running from the local machine and not within the container. latest イメージには、ホスト コンピューターでアプリを実行するために必要なアプリ コードがパッケージ化されています。The latest image has packaged the necessary app code to run the app on a host machine. そのため、デルタはアプリ コードのサイズです。Therefore, the delta is the size of the app code.

その他の技術情報Additional resources