ローカルの Docker コンテナーでのアプリのデバッグ

Visual Studio を使用すると、一貫した方法で、Docker コンテナーの開発とアプリケーションの検証をローカルで行うことができます。 Docker がインストールされたローカルの Windows デスクトップ上で実行されている Linux または Windows コンテナーで、アプリの実行とデバッグを行えます。コードを変更するたびに、コンテナーを再起動する必要はありません。

この記事では、Visual Studio を使用してローカルの Docker コンテナーでアプリを起動し、変更を加えた後、ブラウザーを更新してその変更を確認する方法について説明します。 また、この記事では、コンテナー化されたアプリにデバッグ用のブレークポイントを設定する方法についても説明します。 サポートされているプロジェクト タイプには、Web アプリ、コンソール アプリ、.NET Framework と .NET Core を対象とする Azure 関数などがあります。 この記事で示す例は、種類が ASP.NET Core Web アプリであるプロジェクトと、種類がコンソール アプリ (.NET Framework) であるプロジェクトです。

サポートされている種類のプロジェクトが既にある場合は、Visual Studio を使用して Dockerfile を作成し、コンテナー内で実行するようにプロジェクトを構成することができます。 「Visual Studio のコンテナー ツール」をご覧ください。

前提条件

ローカルの Docker コンテナーでアプリをデバッグするには、次のツールをインストールする必要があります。

ローカルで Docker コンテナーを実行するには、ローカルの Docker クライアントを用意する必要があります。 Docker Desktop を使用できます。これには Windows 10 以降が必要です。

Web アプリを作成する

プロジェクトがあり、概要に関する記事で説明されているように Docker のサポートを追加済みである場合は、このセクションを省略してください。

  1. Visual Studio の [スタート] ウィンドウから [新しいプロジェクトの作成] を選択します。

  2. [ASP.NET Core Web アプリ] を選択してから、[次へ] を選択します。

  3. 新しいアプリケーションの名前を入力 (または既定の名前を使用) し、ディスク上の場所を指定した後、[次へ]を選択します。

  4. 対象にする .NET バージョンを選択します。 わからない場合は、LTS (長期サポート) リリースを選択してください。

    Web プロジェクトの作成 - [追加情報] 画面

  5. SSL サポートを使用する場合は [HTTPS 用の構成] チェックボックスをオンにし、使用しない場合はオフにします。

  6. [Docker サポートを有効にする] チェックボックスをオンにします。

  7. コンテナーの種類 (Windows または Linux) を選択し、[作成] を選択します。

  1. Visual Studio の [スタート] ウィンドウから [新しいプロジェクトの作成] を選択します。

  2. [ASP.NET Core Web アプリ] を選択してから、[次へ] を選択します。

  3. 新しいアプリケーションの名前を入力 (または既定の名前を使用) し、ディスク上の場所を指定した後、[次へ]を選択します。

  4. 対象にする .NET バージョンを選択します。 わからない場合は、LTS (長期サポート) リリースを選択してください。

    Web プロジェクトの作成 - [追加情報] 画面

  5. SSL サポートを使用する場合は [HTTPS 用の構成] チェックボックスをオンにし、使用しない場合はオフにします。

  6. [Docker を有効にする] チェックボックスをオンにします。

  7. [Docker OS] テキストボックスで、使用するコンテナーの種類 (Windows または Linux) を選択し、[作成] を選択します。

Razor ページを編集して更新する

Razor ページで変更をすばやく反復する目的で、コンテナーでアプリケーションを起動できます。 次に、変更を続け、IIS Express の場合と同じように変更を表示します。

  1. 使用しているコンテナーの種類 (Linux または Windows) が使用されるように Docker が設定されていることを確認します。 タスク バーの Docker アイコンを右クリックして、必要に応じて [Switch to Linux containers]\(Linux コンテナーに切り替える\) または [Switch to Windows containers]\(Windows コンテナーに切り替える\) を選択します。

  2. (.NET Core 3 以降のみ) このセクションで説明しているようにコードを編集して実行中のサイトを更新する処理は、.NET Core 3.0 以降の既定のテンプレートでは有効ではありません。 有効にするには、NuGet パッケージ Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation を追加します。 Startup.cs で、拡張メソッド IMvcBuilder.AddRazorRuntimeCompilation への呼び出しを ConfigureServices メソッドのコードに追加します。 これを有効にする必要があるのはデバッグ モードのみなので、コードは次のようになります。

    public IWebHostEnvironment Env { get; set; }
    
    public void ConfigureServices(IServiceCollection services)
    {
        IMvcBuilder builder = services.AddRazorPages();
    
    #if DEBUG
        if (Env.IsDevelopment())
        {
            builder.AddRazorRuntimeCompilation();
        }
    #endif
    
        // code omitted for brevity
    }
    

    次のように、Startup メソッドを変更します。

    public Startup(IConfiguration configuration, IWebHostEnvironment webHostEnvironment)
    {
        Configuration = configuration;
        Env = webHostEnvironment;
    }
    

    詳細については、「ASP.NET Core での Razor ファイルのコンパイル」を参照してください。

  3. [ソリューション構成][デバッグ] に設定します。 次に、Ctrl+F5 を押し、Docker イメージをビルドしてローカルで実行します。

    コンテナー イメージがビルドされ、Docker コンテナーで実行されると、Visual Studio では、既定のブラウザーでその Web アプリが起動します。

  4. インデックス ページに移動します。 このページで変更を行います。

  5. Visual Studio に戻り、Index.cshtml を開きます。

  6. ファイルの最後に次の HTML コンテンツを追加し、変更を保存します。

    <h1>Hello from a Docker container!</h1>
    
  7. 出力ウィンドウで、.NET ビルドが完了して次の行が表示されたら、お使いのブラウザーに戻り、ページを更新します。

    Now listening on: http://*:80
    Application started. Press Ctrl+C to shut down.
    

変更が適用されました。

ブレークポイントを使ってデバッグする

変更にはさらなる調査が必要になることがしばしばあります。 この作業には、Visual Studio のデバッグ機能を利用できます。

  1. Visual Studio で Index.cshtml.cs を開きます。

  2. OnGet メソッドの内容を次のコードに置き換えます。

        ViewData["Message"] = "Your application description page from within a container";
    
  3. コード行の左側にブレークポイントを設定します。

  4. デバッグを開始してブレークポイントまで進めるには、F5 キーを押します。

  5. Visual Studio に切り替えるとブレークポイントが表示されます。 値を調べます。

    Visual Studio の Index.cshtml.cs のコードの一部を示すスクリーンショット。黄色で強調表示されているコード行の左側にブレークポイントが設定されています。

    Visual Studio の Index.cshtml.cs のコードの一部を示すスクリーンショット。黄色で強調表示されているコード行の左側にブレークポイントが設定されています。

.NET Framework コンソール アプリを作成する

このセクションでは、まず Docker サポートをプロジェクトに追加する方法を示して、ローカルの Docker コンテナーで .NET Framework コンソール アプリ プロジェクトをデバッグする方法について説明します。 プロジェクトの種類によって、Docker サポートのレベルが異なることを認識することが重要です。 .NET Core (.NET 5 移行を含む) コンソール アプリ プロジェクトと .NET Framework コンソール アプリ プロジェクトでさえも、Docker サポートのレベルが異なります。

.NET Framework コンソール アプリ プロジェクトが作成されると、Docker サポートを有効にすることができません。 このようなプロジェクトを作成したら、明示的に Docker サポートをプロジェクトに追加する方法はありません。 .NET Framework コンソール アプリ プロジェクトの場合は、コンテナー オーケストレーションのサポートを追加できます。 .NET Framework コンソール アプリ プロジェクトにオーケストレーション サポートを追加すると、Docker サポートがプロジェクトに追加されるという副次的影響が生じます。

次の手順では、オーケストレーション サポートを .NET Framework コンソール アプリ プロジェクトに追加する方法のデモを行います。ここでは、その後、Docker サポートがプロジェクトに追加され、これにより、プロジェクトをローカルの Docker コンテナーにデバッグすることができます。

  1. .NET Framework コンソール アプリ プロジェクトを新規作成する
  2. ソリューション エクスプローラーでプロジェクト ノードを右クリックし、[追加][Container Orchestration Support]\(コンテナー オーケストレーションのサポート\) の順に選択します。 ダイアログ ボックスが表示されたら、[Docker Compose] を選択します。 Dockerfile がプロジェクトに追加され、Docker Compose プロジェクトと関連サポート ファイルが追加されます。

ブレークポイントを使ってデバッグする

  1. ソリューション エクスプローラーで、Program.cs を開きます。

  2. Main メソッドの内容を次のコードに置き換えます。

        System.Console.WriteLine("Hello, world!");
    
  3. ブレークポイントをコード行の左側に設定します。

  4. F5 キーを押すと、デバッグが開始され、ブレークポイントまで進みます。

  5. Visual Studio に切り替えてブレークポイントを表示し、値を調べます。

    Visual Studio の Program.cs のコード ウィンドウのスクリーンショット。黄色で強調表示されているコード行の左側にブレークポイントが設定されています。

トークン プロキシを使用した Azure サービスへの認証

コンテナーから Azure サービスを使っている場合は、DefaultAzureCredential を (VisualStudioCredential を有効にして) 使うことで、コンテナーで追加の構成を行わなくても、Microsoft Entra アカウントで Azure サービスに対する認証を行うことができます。 これを有効にするには、Visual Studio コンテナー ツールの構成方法に関する記事をご覧ください。 また、「Azure を使用して Visual Studio を認証する」の手順に従って、Visual Studio で Azure 認証を設定する必要もあります。 コンテナーでの VisualStudioCredential のサポートは、Visual Studio バージョン 17.6 以降で利用できます。

Azure Functions

統合された Azure Functions プロジェクトのデバッグで、コンテナー内のトークン プロキシを使って Azure サービスへの認証を処理している場合、トークン プロキシが機能するためには、.NET ランタイムをコンテナーにコピーする必要があります。 分離された Azure Functions プロジェクトのデバッグを行っている場合は、.NET ランタイムは既に存在するため、この追加手順は必要ありません。

トークン プロキシで .NET ランタイムを使用できるようにするには、.NET ランタイムをコンテナー イメージにコピーする Dockerfile の debug レイヤーを追加または変更します。 Linux コンテナーの場合、Dockerfile に次のコードを追加できます。

# This layer is to support debugging, VS's Token Proxy requires the runtime to be installed in the container
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS runtime
FROM base as debug
COPY --from=runtime /usr/share/dotnet /usr/share/dotnet
RUN ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet

また、Visual Studio プロジェクトでいくつかの変更を行って、高速モードでのデバッグ時に使うレイヤーとしてこれを指定する必要があります。 高速モードについては、「Visual Studio で Docker コンテナーをカスタマイズする」をご覧ください。 (Docker Compose ではなく) 単一コンテナーのシナリオでそのレイヤーをデバッグに使うには、MSBuild のプロパティ DockerfileFastModeStagedebug に設定します。 Docker Compose の場合は、docker-compose.vs.debug.yml を次のように変更します。

# Set the stage to debug to use an image with the .NET runtime in it
services:
  functionappintegrated:
    build:
      target: debug

Azure Functions での認証の、統合されたシナリオと分離されたシナリオ両方のコード サンプルについては、VisualStudioCredentialExample をご覧ください。

コンテナーの再利用

Visual Studio でデバッグ構成に通常使われる高速モードを使うと、ユーザーが Dockerfile を変更したときにだけ、Visual Studio によってコンテナー イメージとコンテナー自体がリビルドされます。 Dockerfile を変更しない場合、Visual Studio では、以前の実行からのコンテナーが再利用されます。

コンテナーを手動で修正した後、クリーンなコンテナー イメージで再開する場合、Visual Studio で [ビルド][クリーン] コマンドを使用し、その後、通常どおりビルドします。

リリース構成の場合は通常そうであるように、高速モードを使わないと、Visual Studio はプロジェクトがビルドされるたびにコンテナーをリビルドします。

いつ高速モードを使うかを構成できます。Visual Studio コンテナー ツールの構成方法に関する記事をご覧ください。

トラブルシューティング

Visual Studio Docker 開発で発生する問題を解決する方法について説明します。

Visual Studio でコンテナー化されたアプリをビルドする方法」を参照して、詳細を確認します。

Visual Studio、Windows、および Azure での Docker の詳細について