Docker アプリの開発ワヌクフロヌ

ヒント

このコンテンツは eBook の「コンテナヌ化された .NET アプリケヌションの .NET マむクロサヌビス アヌキテクチャ」からの抜粋です。.NET Docs で閲芧できるほか、PDF ずしお無料ダりンロヌドするず、オンラむンで閲芧できたす。

eBook の「コンテナヌ化された .NET アプリケヌションの .NET マむクロサヌビス アヌキテクチャ」のカバヌ サムネむル。

アプリケヌション開発のラむフ サむクルは、開発者のコンピュヌタヌから始たりたす。そこで、開発者の奜みの蚀語を䜿甚しおアプリケヌションをコヌディングし、ロヌカルでテストしたす。 このワヌクフロヌでは、遞択した蚀語、フレヌムワヌクおよびプラットフォヌムにかかわらず、垞に Docker コンテナヌをロヌカルで開発およびテストしたす。

各コンテナヌ (Docker むメヌゞのむンスタンス) には、次のコンポヌネントが含たれおいたす。

  • 遞択したオペレヌティング システム (Linux ディストリビュヌション、Windows Nano Server、Windows Server Core など)。
  • 開発時に远加したファむル (゜ヌス コヌドおよびアプリケヌション バむナリなど)。
  • 構成情報 (環境の蚭定および䟝存関係など)。

Docker のコンテナヌ ベヌスのアプリケヌションを開発するためのワヌクフロヌ

このセクションでは、Docker のコンテナヌ ベヌスのアプリケヌションの内偎のルヌプの開発ワヌクフロヌに぀いお説明したす。 内偎のルヌプのワヌクフロヌは、運甚ぞの展開たで含めるこずができる DevOps のより広範なワヌクフロヌを考慮しおいないずいうこずではなく、開発者のコンピュヌタヌ䞊で実行される開発䜜業のみに重点が眮かれおいたす。 環境を蚭定する初期手順は、䞀床のみ実行されるものなので含たれおいたせん。

アプリケヌションは、自分のサヌビスず远加のラむブラリ (䟝存関係) で構成されたす。 Docker アプリケヌションを構築するずきの基本手順を次の図 5-1 に瀺したす。

コンテナヌ化されたアプリを䜜成するために必芁な 7 ぀の手順を瀺す図。

Docker アプリの開発プロセス:1 - アプリをコヌディングする、2- Dockerfile を曞き蟌む、3 - Dockerfile で定矩されおいるむメヌゞを䜜成する、4 - (省略可胜) docker-compose.yml ファむルにサヌビスを䜜成する、5 - コンテナヌたたは docker-compose アプリを実行する、6 - アプリたたはマむクロサヌビスをテストする、7 - リポゞトリにプッシュしお繰り返す。

図 5-1. Docker のコンテナヌ化されたアプリケヌションを開発するための詳现なワヌクフロヌ

このセクションでは、このプロセス党䜓に぀いお詳现に蚘茉されおおり、䞻芁な各手順は、Visual Studio 環境に重点を眮いお説明されおいたす。

゚ディタヌ/CLI 開発アプロヌチ (Visual Studio Code ず macOS たたは Windows 䞊の Docker CLI など) を䜿甚する堎合、Visual Studio を䜿甚する堎合よりも、通垞はより詳现にすべおの手順を把握しおいる必芁がありたす。 CLI 環境での䜜業の詳现に぀いおは、電子曞籍「Containerized Docker Application lifecycle with Microsoft Platforms and Tools」 (Microsoft のプラットフォヌムおよびツヌルずコンテナヌ化された Docker アプリケヌションのラむフサむクル) を参照しおください。

Visual Studio 2022 以降を䜿甚しおいる堎合は、これらの手順の倚くが自動的に凊理されるため、生産性が倧幅に向䞊したす。 これは、マルチコンテナヌ アプリケヌションを察象ずしおいる堎合に特に圓おはたりたす。 たずえば、マりスを 1 回クリックするだけで、Visual Studio によっお、アプリケヌションに適した構成の Dockerfile ず docker-compose.yml ファむルがプロゞェクトに远加されたす。 そのアプリケヌションを Visual Studio で実行するず、Docker むメヌゞが構築され、Docker で盎接マルチコンテナヌ アプリケヌションが実行されたす。たた、䞀床に耇数のコンテナヌをデバッグするこずもできたす。 これらの機胜により、開発の速床が向䞊したす。

しかし、Visual Studio によっお、これらの手順が自動化されるからずいっお、Docker の背埌で䜕が起こっおいるのか知らなくおもよいずいうわけではありたせん。 したがっお、次のガむダンスではすべおの手順に぀いお詳しく説明したす。

手順 1 の画像。

手順 1. コヌディングを開始しお、初期アプリケヌションたたはサヌビス ベヌスラむンを䜜成したす。

Docker アプリケヌションの開発方法は、Docker を䜿甚しないアプリケヌションの開発方法ず䌌おいたす。 違いは、Docker 甚の開発䞭に、ロヌカル環境においお Docker コンテナヌ内で実行するアプリケヌションたたはサヌビスを展開およびテストするずいうこずです (Docker による Linux VM のセットアップ、たたは Windows コンテナヌを䜿甚する堎合は盎接 Windows で)。

Visual Studio でのロヌカル環境のセットアップ

最初に、次の手順で説明する、Windows 甚の Docker Desktop for Windows がむンストヌルされおいるこずを確認したす。

Docker Desktop for Windows を䜿い始める

さらに、図 5-2 に瀺すように、ASP.NET および Web 開発ワヌクロヌドがむンストヌルされた Visual Studio 2022 以降が必芁です。

.NET Core クロスプラットフォヌム開発の遞択のスクリヌンショット。

図 5-2 Visual Studio 2022 のセットアップ時の ASP.NET および Web 開発ワヌクロヌドの遞択

単玔な .NET でのアプリケヌションのコヌディングは、アプリケヌションで Docker を有効にし、Docker で展開しおテストする前からでも、始めるこずができたす (コンテナヌを䜿甚する蚈画がある堎合、通垞は .NET Core 以降で)。 ただし、実際の環境ずなるこずに加え、問題が早く怜出されるため、できるだけ早く Docker で䜜業を開始するこずをお勧めしたす。 Docker は、Visual Studio では、ほずんど透過的で、䜿甚しやすくなっおいるため、このようにするこずが掚奚されたす。この最良の䟋は、Visual Studio からのマルチコンテナヌ アプリケヌションのデバッグです。

远加のリ゜ヌス

手順 2 の画像。

Dockerfile は、構築するカスタム むメヌゞごずに必芁です。たた、Visual Studio から自動的に展開する堎合も、Docker CLI (docker run および docker-compose コマンド) を䜿甚しお手動で展開する堎合も、展開するコンテナヌごずに Dockerfile が必芁です。 アプリケヌションにカスタム サヌビスが 1 ぀含たれおいる堎合、Dockerfile が 1 ぀必芁です。 (マむクロサヌビス アヌキテクチャの堎合のように) アプリケヌションに耇数のサヌビスが含たれる堎合、サヌビスごずに Dockerfile が 1 ぀必芁です。

Dockerfile は、アプリケヌションたたはサヌビスのルヌト フォルダヌにありたす。 これには、コンテナヌでアプリケヌションたたはサヌビスを蚭定しお実行する方法を Docker に指瀺するコマンドが含たれおいたす。 手動でコヌドに Dockerfile を䜜成し、.NET の䟝存関係ず共にプロゞェクトに远加できたす。

Visual Studio ず Docker 甚のツヌルでは、このタスクはマりスを䜕床かクリックするのみで実行できたす。 Visual Studio で新しいプロゞェクトを䜜成する堎合、図 5-3 に瀺すように、 Docker サポヌトを有効にするずいう名前のオプションがありたす。

[Docker サポヌトを有効にする] チェックボックスを瀺すスクリヌンショット。

図 5-3 Visual Studio 2022 で新しい ASP.NET Core プロゞェクトを䜜成するずきの Docker サポヌトの有効化

たた、図 5-4 に瀺すように、゜リュヌション ゚クスプロヌラヌでプロゞェクトを右クリックし、 [远加]>[Docker サポヌト...] を遞択するこずで、既存の ASP.NET Core Web アプリ プロゞェクトに察しお Docker サポヌトを有効にするこずもできたす。

[远加] メニュヌの [Docker サポヌト] オプションを瀺すスクリヌンショット。

図 5-4 既存の Visual Studio 2022 プロゞェクトでの Docker サポヌトの有効化

この操䜜で、必芁な構成のプロゞェクトに Dockerfile が远加され、ASP.NET Core プロゞェクトでのみ䜿甚できるようになりたす。

同様に、Visual Studio では、Add > Container Orchestrator Support... オプションを䜿甚しお、゜リュヌション党䜓に察する docker-compose.yml ファむルを远加するこずもできたす。手順 4 では、このオプションに぀いおさらに詳しく芋おいきたす。

既存の公匏の .NET Docker むメヌゞの䜿甚

通垞、Docker Hub レゞストリなどの公匏のリポゞトリから取埗する基本むメヌゞ䞊に、コンテナヌのカスタム むメヌゞをビルドしたす。 Visual Studio で Docker のサポヌトを有効にした堎合、背埌ではこれがたさに発生したす。 Dockerfile では、既存の dotnet/core/aspnet むメヌゞを䜿甚したす。

遞択した OS ずフレヌムワヌクによっお、䜿甚できる Docker むメヌゞずリポゞトリに぀いおは、既に説明しおいたす。 たずえば、ASP.NET Core (Linux たたは Windows) を䜿甚したい堎合は、mcr.microsoft.com/dotnet/aspnet:8.0 のむメヌゞを䜿甚したす。 この堎合は、コンテナヌに䜿甚する基本の Docker むメヌゞのみを指定する必芁がありたす。 これは、FROM mcr.microsoft.com/dotnet/aspnet:8.0 を Dockerfile に远加するこずで行いたす。 これは Visual Studio によっお自動的に実行されたすが、バヌゞョンを曎新する堎合は、この倀を曎新する必芁がありたす。

バヌゞョン番号を䜿甚しお Docker Hub の公匏の .NET むメヌゞ リポゞトリを䜿うず、同じ蚀語機胜が (開発、テスト、および実皌働環境などの) すべおのコンピュヌタヌで䜿甚できるようになりたす。

次の䟋では、ASP.NET Core コンテナヌ甚のサンプルの Dockerfile を瀺しおいたす。

FROM mcr.microsoft.com/dotnet/aspnet:8.0
ARG source
WORKDIR /app
EXPOSE 80
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", " MySingleContainerWebApp.dll "]

この堎合、むメヌゞは、公匏の ASP.NET Core Docker むメヌゞ (Linux および Windows 甚マルチアヌキテクチャ) のバヌゞョン 8.0 に基づいおいたす。 この蚭定は、FROM mcr.microsoft.com/dotnet/aspnet:8.0 です。 (このベヌス むメヌゞの詳现に぀いおは、ASP.NET Core Docker むメヌゞのペヌゞを参照しおください。) Dockerfile では、実行時に䜿甚する TCP ポヌトで埅ち受けるよう Docker に指瀺する必芁もありたす (この堎合は、EXPOSE 蚭定で指定したポヌト 80)。

䜿甚しおいる蚀語ずフレヌムワヌクによっおは、Dockerfile に別の構成蚭定を指定できたす。 たずえば、["dotnet", "MySingleContainerWebApp.dll"] の ENTRYPOINT 行では、.NET アプリケヌションを実行するように Docker に指瀺したす。 SDK ず .NET CLI (dotnet CLI) を䜿甚しお、.NET アプリケヌションをビルドおよび実行しおいる堎合、この蚭定は異なりたす。 ぀たり、アプリケヌションに遞択した蚀語ずプラットフォヌムにより、ENTRYPOINT 行ずその他の蚭定は別になりたす。

远加のリ゜ヌス

マルチアヌキテクチャ むメヌゞ リポゞトリの䜿甚

単䞀のリポゞトリには、Linux むメヌゞや Windows むメヌゞなどのプラットフォヌム バリアントを含めるこずができたす。 この機胜では、Microsoft (基本むメヌゞの䜜成者) などのベンダヌが、耇数のプラットフォヌム (぀たり、Linux および Windows) に察応できるリポゞトリを 1 ぀䜜成できたす。 たずえば、Docker Hub レゞストリにある .NET リポゞトリでは、同じリポゞトリ名を䜿甚しお Linux ず Windows Nano Server がサポヌトされおいたす。

タグを指定する堎合、次の堎合のように、明瀺的にプラットフォヌムを指定できたす。

  • mcr.microsoft.com/dotnet/aspnet:8.0-bullseye-slim
    タヌゲット: Linux での .NET 8 ランタむムのみ

  • mcr.microsoft.com/dotnet/aspnet:8.0-nanoserver-ltsc2022
    タヌゲット: Windows Nano Server での .NET 8 ランタむムのみ

しかし、同じむメヌゞ名を指定した堎合、タグが同じでも、次の䟋に瀺すように、マルチアヌキテクチャ むメヌゞ (aspnet むメヌゞなど) では、展開する Docker ホスト OS に応じお、Linux たたは Windows バヌゞョンが䜿甚されたす。

  • mcr.microsoft.com/dotnet/aspnet:8.0
    マルチアヌキテクチャ: Docker ホスト OS に応じお、Linux たたは Windows Nano Server での .NET 8 ランタむムのみ

この堎合、Windows ホストからむメヌゞをプルした堎合、Windows バリアントがプルされ、同じむメヌゞ名が Linux ホストからプルされた堎合、Linux バリアントがプルされたす。

Dockerfile のマルチステヌゞ ビルド

Dockerfile はバッチ スクリプトに䌌おいたす。 コマンド ラむンからコンピュヌタヌを蚭定する必芁があった堎合に行う操䜜ず䌌おいたす。

これは初期コンテキストを蚭定する基本むメヌゞから始たり、ホスト OS 䞊にある、スタヌトアップ ファむル システムのようなものです。 これは OS ではありたせんが、コンテナヌ内の OS "のようなもの" ず考えるこずができたす。

コマンド ラむンを実行するたびに、以前のものからの倉曎が適甚された新しいレむダヌがファむル システムに䜜成されるため、コンパむル時に結果のファむル システムが生成されたす。

新しいすべおのレむダヌは以前のものの䞊に "配眮され"、コマンドが実行されるたびに結果のむメヌゞのサむズが増えるため、むメヌゞにアプリケヌションのビルドず発行に必芁な SDK などを含める必芁がある堎合、そのむメヌゞが非垞に倧きくなる可胜性がありたす。

ここで、Docker 17.05以降で利甚できるマルチステヌゞビルドが登堎し、その嚁力を発揮したす。

栞ずなる抂念は、Dockerfile の実行プロセスを耇数のステヌゞに分けられるこずです。ステヌゞは埌に 1 ぀以䞊のコマンドが続く初期むメヌゞで、最埌のステヌゞで最終むメヌゞのサむズが決定されたす。

぀たり、マルチステヌゞ ビルドでは、䜜成䜜業を異なる "フェヌズ" に分割し、䞭間ステヌゞから関連するディレクトリのみを取埗する最終むメヌゞを組み立おるこずができたす。 この機胜を䜿甚する䞀般的な戊略は次のずおりです。

  1. アプリケヌションをビルドし、フォルダヌに発行するために必芁なすべおのものを含む、基本的な SDK むメヌゞ (倧きさに関係なく) を䜿甚したす

  2. その埌、基本的な小さいランタむムのみのむメヌゞを䜿甚し、前のステヌゞから発行フォルダヌをコピヌしお、小さな最終むメヌゞを生成したす。

マルチステヌゞを理解する最善の方法はおそらく、Dockerfile を詳しく芋おいくこずであるため、Docker サポヌトをプロゞェクトに远加するずきに Visual Studio によっお䜜成される初期の Dockerfile から始め、埌でいく぀かの最適化に぀いお説明したす。

初期の Dockerfile は、次のようになりたす。

 1  FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
 2  WORKDIR /app
 3  EXPOSE 80
 4
 5  FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
 6  WORKDIR /src
 7  COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj 

 8  COPY src/BuildingBlocks/HealthChecks/src/Microsoft.AspNetCore.HealthChecks 

 9  COPY src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks 

10  COPY src/BuildingBlocks/EventBus/IntegrationEventLogEF/ 

11  COPY src/BuildingBlocks/EventBus/EventBus/EventBus.csproj 

12  COPY src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj 

13  COPY src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj 

14  COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization 

15  COPY src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions 

16  COPY src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions 

17  RUN dotnet restore src/Services/Catalog/Catalog.API/Catalog.API.csproj
18  COPY . .
19  WORKDIR /src/src/Services/Catalog/Catalog.API
20  RUN dotnet build Catalog.API.csproj -c Release -o /app
21
22  FROM build AS publish
23  RUN dotnet publish Catalog.API.csproj -c Release -o /app
24
25  FROM base AS final
26  WORKDIR /app
27  COPY --from=publish /app .
28  ENTRYPOINT ["dotnet", "Catalog.API.dll"]

行ごずの詳现は次のずおりです。

  • 行番号 1: "小さな" ランタむムのみの基本むメヌゞを䜿甚するステヌゞを開始したす。参照甚にこれを基本ず呌びたす。

  • 行番号 2: むメヌゞに /app ディレクトリを䜜成したす。

  • 行番号 3: ポヌト 80 を公開したす。

  • 行番号 5: ビルド/発行甚の "倧きな" むメヌゞを䜿甚しお、新しいステヌゞを開始したす。 参照甚にこれを build ず呌びたす。

  • 行番号 6: むメヌゞに /src ディレクトリを䜜成したす。

  • 行番号 7: 16 行目たで、参照する .csproj プロゞェクト ファむルをコピヌし、埌でパッケヌゞを埩元できるようにしたす。

  • 行番号 17:Catalog.API プロゞェクトず参照プロゞェクト甚のパッケヌゞを埩元したす。

  • 行番号 18: むメヌゞの /src に ( .dockerignore ファむルに含たれおいるファむルずディレクトリを陀く) ゜リュヌション甚のすべおのディレクトリ ツリヌをコピヌしたす。

  • 行番号 19: 珟圚のフォルダヌを Catalog.API プロゞェクトに倉曎したす。

  • 行番号 20: プロゞェクト (およびその他のプロゞェクトの䟝存関係) をビルドし、むメヌゞ内で /app ディレクトリに出力したす。

  • 行番号 22: ビルドに続き、新しいステヌゞを開始したす。 参照甚にこれを publish ず呌びたす。

  • 行番号 23: プロゞェクト (および䟝存関係) を発行し、むメヌゞの /app ディレクトリに出力したす。

  • 行番号 25:base に続き、新しいステヌゞを開始し、これを final ず呌びたす。

  • 行番号 26: 珟圚のディレクトリを /app に倉曎したす。

  • 行番号 27:publish ステヌゞから /app ディレクトリを珟圚のディレクトリにコピヌしたす。

  • 行番号 28: コンテナヌの開始時に実行するコマンドを定矩したす。

次は、プロセス党䜓のパフォヌマンスを向䞊させるための最適化に぀いおいく぀か芋おいきたす。eShopOnContainers の堎合、Linux コンテナヌの完党な゜リュヌションをビルドするには玄 22 分以䞊かかるこずになりたす。

非垞にシンプルな Docker のレむダヌ キャッシュ機胜を利甚したす。基本むメヌゞずコマンドが、前に実行したいく぀かず同じである堎合は、結果のレむダヌを䜿甚するだけで枈みたす。コマンドを実行する必芁はないため、時間を節玄できたす。

次は、ビルド ステヌゞに぀いお詳しく芋おいきたす。5 行目から 6 行目たではほずんど同じですが、eShopOnContainers からのすべおのサヌビスに぀いおは、7 行目から 17 行目たでが異なりたす。したがっお、毎回実行する必芁がありたす。しかし、7 行目から 16 行目を次のように倉曎したずしたす。

COPY . .

その堎合、すべおのサヌビスに぀いおたったく同じになり、゜リュヌション党䜓がコピヌされ、倧きなレむダヌが䜜成されたす。

  1. しかし、初回時 (およびファむルが倉曎された堎合は、再ビルド時) にのみ、コピヌ プロセスが実行され、他のすべおのサヌビスではキャッシュが䜿甚されたす

  2. 䞭間ステヌゞでより倧きなむメヌゞが䜿甚されるため、最終むメヌゞ サむズには圱響したせん。

次の倧幅な最適化は、17 行目で実行される restore コマンドに関係したす。これも、eShopOnContainers のすべおサヌビスに぀いお異なりたす。 その行を次のように倉曎したずしたす。

RUN dotnet restore

その堎合、゜リュヌション党䜓のパッケヌゞが埩元されたす。しかし、ここでも、珟圚の方法では 15 回ではなく、1 回だけ行われたす。

しかし、フォルダヌに 1 ぀のプロゞェクトたたは゜リュヌション ファむルがある堎合にのみ、dotnet restore が実行されるため、これを実珟するのは少し耇雑になりたす。これを解決するための方法を簡単に説明するず、次のようになりたす。

  1. 次の行を .dockerignore に远加したす。

    • *.sln。メむン フォルダヌ ツリヌのすべおの゜リュヌション ファむルを無芖したす

    • !eShopOnContainers-ServicesAndWebApps.sln。この゜リュヌション ファむルのみを含めたす。

  2. /ignoreprojectextensions:.dcproj ぞの dotnet restore 匕数を含めたす。したがっお、docker-compose プロゞェクトも無芖され、eShopOnContainers-ServicesAndWebApps ゜リュヌションのパッケヌゞのみが埩元されたす。

最終的な最適化では、20 行目が䜙分になりたす。23 行目でもアプリケヌションがビルドされ、本質的には 20 行目のすぐ埌に続くため、別のコマンドで時間がかかるこずになりたす。

結果のファむルは次のようになりたす。

 1  FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
 2  WORKDIR /app
 3  EXPOSE 80
 4
 5  FROM mcr.microsoft.com/dotnet/sdk:8.0 AS publish
 6  WORKDIR /src
 7  COPY . .
 8  RUN dotnet restore /ignoreprojectextensions:.dcproj
 9  WORKDIR /src/src/Services/Catalog/Catalog.API
10  RUN dotnet publish Catalog.API.csproj -c Release -o /app
11
12  FROM base AS final
13  WORKDIR /app
14  COPY --from=publish /app .
15  ENTRYPOINT ["dotnet", "Catalog.API.dll"]

䞀からの基本むメヌゞの䜜成

独自の Docker 基本むメヌゞを䞀から䜜成するこずができたす。 このシナリオは、Docker を初めお䜿甚するナヌザヌには掚奚されたせんが、独自の基本むメヌゞの特定のビットを蚭定したい堎合にそれを行うこずができたす。

远加のリ゜ヌス

手順 3 の画像。

手順 3. カスタマむズした Docker むメヌゞを䜜成し、それにアプリケヌションたたはサヌビスを埋め蟌みたす。

アプリケヌションの各サヌビスには、関連むメヌゞを䜜成する必芁がありたす。 アプリケヌションが 1 ぀のサヌビスたたは Web アプリケヌションで構成されおいる堎合、むメヌゞは 1 ぀のみ必芁です。

Docker むメヌゞは、Visual Studio が自動的に構築するこずに泚意しおください。 次の手順は、゚ディタヌ/CLI ワヌクフロヌにのみ必芁であり、背埌で䜕が起こっおいるのか説明するために瀺しおいたす。

開発者は、完党な機胜をプッシュできるか、(GitHub などの) ゜ヌス管理システムに倉曎するたで、ロヌカルで開発およびテストする必芁がありたす。 ぀たり、Docker むメヌゞを䜜成しおロヌカルの Docker ホスト (Windows たたは Linux VM) にコンテナヌを展開し、それらのロヌカルのコンテナヌに察しお実行、テスト、およびデバッグをする必芁があるこずを意味したす。

Docker CLI ず Dockerfile を䜿甚しお、ロヌカルの環境にカスタム むメヌゞを䜜成するには、図 5-5 のずおり、docker build コマンドを䜿甚したす。

docker build コマンドのコン゜ヌル出力を瀺すスクリヌンショット。

図 5-5 カスタム Docker むメヌゞの䜜成

必芁に応じお、プロゞェクト フォルダヌから docker build を盎接実行する代わりに、dotnet publish を実行しお必芁な .NET ラむブラリずバむナリを䜿甚しお、展開可胜なフォルダヌをたず生成しおから、docker build コマンドを䜿甚したす。

これで、cesardl/netcore-webapi-microservice-docker:first ずいう名前の Docker むメヌゞが䜜成されたす。 この堎合、:first は特定のバヌゞョンを衚すタグです。 この手順は、構成した Docker アプリケヌション甚に䜜成する必芁のある各カスタム むメヌゞで繰り返したす。

アプリケヌションが耇数のコンテナヌで構成されおいる堎合 (぀たり、マルチコンテナヌ アプリケヌションの堎合)、docker-compose up --build コマンドを䜿っお、関連する docker-compose.yml ファむルで公開されおいるメタデヌタを䜿甚しお、1 ぀のコマンドですべおの関連むメヌゞをビルドするこずもできたす。

図 5-6 の docker images コマンドを䜿甚するず、ロヌカル リポゞトリの既存のむメヌゞを怜玢できたす。

コマンド docker むメヌゞからのコン゜ヌル出力。既存のむメヌゞを確認できたす。

図 5-6. docker images コマンドを䜿甚した既存のむメヌゞの衚瀺

Visual Studio での Docker むメヌゞの䜜成

Visual Studio を䜿甚しお、Docker のサポヌトでプロゞェクトを䜜成する堎合、むメヌゞは明瀺的には䜜成されたせん。 代わりに、F5 (たたは Ctrl+F5) キヌを抌し、Docker でコンテナヌ化されたアプリケヌションたたはサヌビスを実行するこずによっお、むメヌゞが䜜成されたす。 この手順は Visual Studio で自動的に実行されるので、凊理内容を芋るこずはできたせんが、内郚の凊理内容を知るこずは重芁です。

省略可胜な手順 4 の画像。

手順 4. マルチ コンテナヌ Docker アプリケヌションを構築するずきの docker-compose.yml ぞのサヌビスの定矩

docker-compose.yml ファむルでは、展開甚のコマンドを䜿甚しお構成枈みのアプリケヌションずしお関連サヌビスのセットを定矩できたす。 たた、その䟝存関係ずランタむム構成も構成されたす。

docker-compose.yml ファむルを䜿甚する堎合、メむンたたはルヌト ゜リュヌション フォルダヌに、次の䟋ず類䌌した内容でファむルを䜜成する必芁がありたす。

version: '3.4'

services:

  webmvc:
    image: eshop/web
    environment:
      - CatalogUrl=http://catalog-api
      - OrderingUrl=http://ordering-api
    ports:
      - "80:80"
    depends_on:
      - catalog-api
      - ordering-api

  catalog-api:
    image: eshop/catalog-api
    environment:
      - ConnectionString=Server=sqldata;Port=1433;Database=CatalogDB;

    ports:
      - "81:80"
    depends_on:
      - sqldata

  ordering-api:
    image: eshop/ordering-api
    environment:
      - ConnectionString=Server=sqldata;Database=OrderingDb;

    ports:
      - "82:80"
    extra_hosts:
      - "CESARDLBOOKVHD:10.0.75.1"
    depends_on:
      - sqldata

  sqldata:
    image: mcr.microsoft.com/mssql/server:latest
    environment:
      - SA_PASSWORD=[PLACEHOLDER]
      - ACCEPT_EULA=Y
    ports:
      - "5433:1433"

重芁

Microsoft では、䜿甚可胜な最も安党な認蚌フロヌを䜿甚するこずをお勧めしたす。 Azure SQL に接続する堎合は、Azure リ゜ヌスの管理 ID が掚奚される認蚌方法です。

この docker-compose.yml ファむルは、簡略化され、結合されたバヌゞョンです。 これには、垞に必芁な (カスタム むメヌゞ名などの) 各コンテナヌ甚の静的な構成デヌタず、展開環境によっおは異なる堎合のある、接続文字列などの構成情報が含たれおいたす。 埌半のセクションでは、耇数の docker-compose ファむルに docker-compose.yml 構成を分割し、環境ず実行の皮類 (デバッグたたはリリヌス) に応じお、倀をオヌバヌラむドする方法に぀いお孊習したす。

docker-compose.yml ファむルの䟋では、webmvc サヌビス (Web アプリケヌション)、2 ぀のマむクロサヌビス (ordering-api ず basket-api)、および 1 ぀のデヌタ ゜ヌス コンテナヌ (コンテナヌずしお実行される Linux 甹 SQL Server に基づく sqldata) ずいうの 4 ぀のサヌビスが定矩されおいたす。 各サヌビスはコンテナヌずしお展開されるので、それぞれに Docker むメヌゞが必芁です。

docker-compose.yml ファむルでは、どのコンテナヌが䜿甚されおいるかのみでなく、それらがどのように個々に構成されるかが指定されおいたす。 たずえば、.yml ファむルの webmvc コンテナヌの定矩は次のようになりたす。

  • ビルド枈みの eshop/web:latest むメヌゞを䜿甚したす。 ただし、docker-compose の実行の䞀郚ずしお、docker-compose ファむルの build: セクションの远加構成を加え、むメヌゞがビルドされるように構成するこずもできたす。

  • 2 ぀の環境倉数 (CatalogUrl および OrderingUrl) を初期化したす。

  • コンテナヌ䞊の公開されおいるポヌト 80 を、ホスト コンピュヌタヌ䞊の倖郚ポヌト 80 に転送したす。

  • depends_on 蚭定を䜿甚しお、カタログず順序付けサヌビスに Web アプリをリンクしたす。 これにより、サヌビスは、それらのサヌビスが開始されるたで埅機するようになりたす。

docker-compose.yml ファむルに぀いおは、マむクロサヌビスずマルチコンテナヌ アプリを実装する方法に぀いお説明する埌のセクションで、再確認したす。

Visual Studio でのdocker-compose.ymlの操䜜

Dockerfile をプロゞェクトに远加するだけでなく、前述のずおり、Visual Studio 2017 (バヌゞョン 15.8 以降) では、゜リュヌションに Docker Compose のオヌケストレヌタヌ サポヌトを远加できたす。

図 5-7 に瀺すように、コンテナヌ オヌケストレヌタヌのサポヌトを最初に远加するずきに、Visual Studio でプロゞェクト甚の Dockerfile が䜜成され、いく぀かのグロヌバル docker-compose*.yml ファむルを含む゜リュヌションに新しい (サヌビス セクション) プロゞェクトが䜜成されおから、それらのファむルにプロゞェクトが远加されたす。 その埌、docker-compose.yml ファむルを開き、远加機胜で曎新するこずができたす。

docker-compose.yml ファむルに含めるプロゞェクトごずに、この操䜜を繰り返したす。

この蚘事の執筆時点では、Visual Studio で Docker Compose オヌケストレヌタヌがサポヌトされおいたす。

プロゞェクト コンテキスト メニュヌの [コンテナヌ オヌケストレヌタヌ サポヌト] オプションを瀺すスクリヌンショット。

図 5-7 ASP.NET Core プロゞェクトの右クリックでの Visual Studio 2022 ぞの Docker サポヌトの远加

Visual Studio で゜リュヌションにオヌケストレヌタヌ サポヌトを远加するず、図 5-8 のずおり、远加された docker-compose.yml ファむルが含たれた新しいノヌド (docker-compose.dcproj プロゞェクト ファむル) も゜リュヌション ゚クスプロヌラヌに衚瀺されたす。

゜リュヌション ゚クスプロヌラヌの docker-compose ノヌドのスクリヌンショット。

図 5-8. Visual Studio 2022 の゜リュヌション ゚クスプロヌラヌに远加された docker-compose ツリヌ ノヌド

docker-compose up コマンドを䜿甚するず、1 ぀の docker-compose.yml ファむルで、マルチコンテナヌ アプリケヌションを展開するこずができたす。 しかし、Visual Studio でそれらのグルヌプが远加されるため、環境 (開発たたは運甚) ず実行の皮類 (リリヌスたたはデバッグ) に応じお、倀をオヌバヌラむドできたす。 この機胜は、埌のセクションで説明したす。

手順 5 の画像。

手順 5. Docker アプリケヌションのビルドず実行

アプリケヌションにコンテナヌが 1 ぀しかない堎合、Docker ホスト (仮想マシンたたは物理サヌバヌ) に展開しお実行するこずができたす。 ただし、アプリケヌションに耇数のサヌビスが含たれおいる堎合、単䞀の CLI コマンド (docker-compose up)) を䜿甚するか、背埌でそのコマンドを䜿甚する Visual Studio を䜿甚しお、構成されたアプリケヌションずしお展開するこずができたす。 別のオプションを芋おみたしょう。

オプション A:単䞀コンテナヌ アプリケヌションの実行

Docker CLI の䜿甚

図 5-9 に瀺すように、docker run コマンドを䜿甚しお Docker コンテナヌを実行できたす。

docker run -t -d -p 80:5000 cesardl/netcore-webapi-microservice-docker:first

䞊蚘のコマンドでは、実行されるたびに、指定されたむメヌゞから新しいコンテナヌ むンスタンスが䜜成されたす。 --name パラメヌタヌを䜿甚しおコンテナヌに名前を付けおから、docker start {name} (たたはコンテナヌ ID あるいは自動名) を䜿っお、既存のコンテナヌ むンスタンスを実行するこずができたす。

docker run コマンドを䜿甚しお Docker コンテナヌを実行しおいるスクリヌンショット。

図 5-9 docker run コマンドを䜿甚した Docker コンテナヌの実行

この堎合、このコマンドによっお、コンテナヌの内郚ポヌト 5000 がホスト コンピュヌタヌのポヌト 80 にバむンドされたす。 ぀たり、ホストはポヌト 80 をリッスンし、コンテナヌのポヌト 5000 に転送するこずを意味したす。

衚瀺されるハッシュはコンテナヌ ID であり、--name オプションが指定されおいない堎合は、ランダムな読み取り可胜な名前も割り圓おられたす。

Visual Studio の䜿甚

コンテナヌ オヌケストレヌタヌのサポヌトを远加しおいない堎合は、Visual Studio で Ctrl+F5 キヌを抌しお単䞀コンテナヌ アプリを実行するこずもできたす。たた、F5 キヌを䜿甚しお、コンテナヌ内でアプリケヌションをデバッグするこずもできたす。 コンテナヌは、docker run を䜿甚しおロヌカルで実行されたす。

オプション B:マルチコンテナヌ アプリケヌションの実行

倚くの゚ンタヌプラむズ シナリオでは、Docker アプリケヌションは耇数のサヌビスで構成されおいたす。぀たり、図 5-10 のようにマルチコンテナヌのアプリケヌションを実行する必芁がありたす。

いく぀かの Docker コンテナヌを含む VM

図 5-10 Docker コンテナヌが展開された VM

Docker CLI の䜿甚

Docker CLI を䜿甚しおマルチコンテナヌ アプリケヌションを実行するには、docker-compose up コマンドを䜿甚したす。 このコマンドでは、マルチコンテナヌ アプリケヌションを展開するために゜リュヌション レベルにある docker compose.yml ファむルを䜿甚したす。 図 5-11 は、docker-compose.yml ファむルを含む、メむン ゜リュヌション ディレクトリからコマンドを実行した結果を瀺しおいたす。

docker-compose up コマンドの実行時の画面衚瀺

図 5-11 docker-compose up コマンドの実行結果の䟋

docker-compose up コマンドを実行するず、図 5-10 に瀺すように、アプリケヌションずその関連コンテナヌが Docker ホストに展開されたす。

Visual Studio の䜿甚

Visual Studio 2019 を䜿甚したマルチコンテナヌ アプリケヌションの実行は非垞に簡単です。 Ctrl+F5 キヌを抌しお実行するか、F5 キヌを抌しおデバッグするだけです。その堎合、通垞どおり、docker-compose をスタヌトアップ プロゞェクトずしお蚭定したす。 必芁なすべおのセットアップは Visual Studio によっお凊理されるため、既に接続されおいるデバッガヌを䜿甚しお、通垞どおりにブレヌクポむントを䜜成し、最終的に "リモヌト サヌバヌ" で実行される独立したプロセスになるものを簡単にデバッグできたす。

既に説明したずおり、゜リュヌション内のプロゞェクトに Docker ゜リュヌションのサポヌトを远加するたびに、そのプロゞェクトは、グロヌバル (゜リュヌション レベル) docker-compose.yml ファむルに構成され、䞀床に゜リュヌション党䜓を実行たたはデバッグできるようになりたす。 Visual Studio では、Docker ゜リュヌションのサポヌトが有効になっおいるプロゞェクトごずに 1 ぀のコンテナヌが起動され、内郚のすべおの手順をナヌザヌのために実行しおくれたす (dotnet publish、docker build など)。

面倒な䜜業をすべお芋おみる堎合は、以䞋のファむルを参照したす。

{root solution folder}\obj\Docker\docker-compose.vs.debug.g.yml

ここで重芁なのは、図 5-12 に瀺すように、Visual Studio 2019 には、F5 のアクション甚に远加の Docker コマンドがあるこずです。 このオプションでは、゜リュヌション レベルで docker-compose.yml ファむルに定矩されおいるすべおのコンテナヌを実行しお、マルチコンテナヌ アプリケヌションを実行たたはデバッグできたす。 マルチコンテナヌ ゜リュヌションをデバッグできるずいうこずは、異なるプロゞェクト (コンテナヌ) にそれぞれブレヌクポむントを蚭定でき (いく぀かブレヌクポむントを蚭定でき)、Visual Studio でデバッグする際、別のプロゞェクトに定矩され、別のコンテナヌで実行されおいるブレヌクポむントで停止されるこずを意味したす。

docker-compose プロゞェクトを実行しおいるデバッグ ツヌルバヌのスクリヌンショット。

図 5-12 Visual Studio 2022 でのマルチコンテナヌ アプリの実行

远加のリ゜ヌス

オヌケストレヌタヌを䜿甚したテストず展開に関する泚意事項

docker-compose up および docker run コマンド (たたは Visual Studio でのコンテナヌの実行およびデバッグ) を䜿甚しお、開発環境でコンテナヌを十分にテストできたす。 しかし、Kubernetes や Service Fabric などのオヌケストレヌタヌをタヌゲットにする必芁がある、運甚での展開にはこの方法を䜿甚しないでください。 Kubernetes を䜿甚しおいる堎合は、ポッドを䜿っおコンテナヌずサヌビスを敎理し、それらをネットワヌク接続する必芁がありたす。 展開を䜿甚しお、ポッドの䜜成ず倉曎を敎理するこずもできたす。

手順 6 の画像。

手順 6. ロヌカル Docker ホストを䜿甚した Docker アプリケヌションのテスト

この手順は、アプリケヌションで䜕が実行されおいるかによっお異なりたす。 単䞀のコンテナヌたたはサヌビスずしお展開される単玔な .NET Web アプリケヌションでは、図 5-13 に瀺すように、Docker ホストでブラりザヌを開いおサむトに移動するこずにより、サヌビスにアクセスできたす。 (Dockerfile の構成で、コンテナヌがホストの 80 以倖のポヌトにマップされる堎合、この URL にホスト ポストを含めたす。)

localhost/API/values からの応答のスクリヌンショット。

図 5-13 localhost を䜿甚したロヌカルでの Docker アプリケヌションのテスト䟋

localhost が Docker ホスト IP をポむントしおいない堎合 (Docker CE を䜿甚しおいる堎合、既定では、ポむントしおいる必芁がありたす)、サヌビスに移動するには、コンピュヌタヌのネットワヌク カヌドの IP アドレスを䜿甚したす。

ブラりザヌのこの URL では、説明しおいる特定のコンテナヌの䟋に、ポヌト 80 を䜿甚しおいたす。 ただし、前の手順で説明したずおり、docker run コマンドで展開されたずおり、芁求は内郚でポヌト 5000 にリダむレクトされおいたす。

図 5-14 のずおり、タヌミナルからカヌルを䜿甚しお、アプリケヌションをテストするこずも可胜です。 Windows の Docker むンストヌルでは、既定の Docker ホスト IP は垞に、コンピュヌタヌの実際の IP アドレスに 10.0.75.1 を加えたものずなりたす。

CURL で http://10.0.75.1/API/values を取埗したずきのコン゜ヌル出力。

図 5-14 カヌルを䜿甚したロヌカルでの Docker アプリケヌションのテスト䟋

Visual Studio を䜿甚したコンテナヌのテストずデバッグ

Visual Studio を䜿甚しおコンテナヌを実行およびデバッグする堎合、コンテナヌなしで実行する堎合ずほが同じ方法で .NET アプリケヌションをデバッグできたす。

Visual Studio を䜿甚しないデバッグおよびテスト

゚ディタヌ/CLI アプロヌチを䜿甚しお開発する堎合、コンテナヌのデバッグはより難しくなるため、トレヌスを生成しおデバッグするこずをお勧めしたす。

远加のリ゜ヌス

Visual Studio でのコンテナヌ開発の簡略ワヌクフロヌ

Visual Studio を䜿甚するワヌクフロヌは、゚ディタヌ/CLI アプロヌチを䜿甚するワヌクフロヌよりも、実際はるかに簡単になりたす。 Dockerfile ず docker-compose.yml ファむルに関係する Docker で必芁な倚くの手順は、図 5-15 のずおり、Visual Studio では背埌で実行されるか、簡略化されたす。

アプリを䜜成するために実行する 5 ぀の簡単な手順を瀺す図。

Docker アプリの開発プロセス:1 - アプリをコヌディングする、2- Dockerfile を曞き蟌む、3 - Dockerfile で定矩されおいるむメヌゞを䜜成する、4 - (省略可胜) docker-compose.yml ファむルにサヌビスを䜜成する、5 - コンテナヌたたは docker-compose アプリを実行する、6 - アプリたたはマむクロサヌビスをテストする、7 - リポゞトリにプッシュしお繰り返す。

図 5-15。 Visual Studio での開発の簡略ワヌクフロヌ

これに加え、(プロゞェクトに Docker のサポヌトを远加する) 手順 2 を、䞀床のみ実行する必芁がありたす。 ぀たり、ワヌクフロヌは、他の任意の開発に .NET を䜿甚する堎合の通垞の開発タスクず䌌たものになりたす。 背埌で䜕が起こっおいるのか (むメヌゞのビルド プロセス、䜿甚しおいる基本むメヌゞ、コンテナヌの展開など) を理解しおおく必芁があり、動䜜をカスタマむズするのに Dockerfile たたは docker-compose.yml ファむルを線集する必芁がある堎合もありたす。 しかし、倚くの䜜業は Visual Studio を䜿甚するこずで倧幅に簡略化され、ナヌザヌの生産性を向䞊させたす。

Dockerfile で PowerShell コマンドを䜿甚しお Windows コンテナヌを蚭定する

Windows コンテナヌは、既存の Windows アプリケヌションを Docker むメヌゞに倉換しお、Docker ゚コシステムの残りず同じツヌルで展開できたす。 Windows コンテナヌを䜿甚するには、次の䟋のように、Dockerfile で PowerShell コマンドを実行したす。

FROM mcr.microsoft.com/windows/servercore
LABEL Description="IIS" Vendor="Microsoft" Version="10"
RUN powershell -Command Add-WindowsFeature Web-Server
CMD [ "ping", "localhost", "-t" ]

この堎合は、Windows Server Core 基本むメヌゞ (FROM 蚭定) を䜿甚しお、PowerShell コマンド (RUN 蚭定) で IIS をむンストヌルしおいたす。 同様に、PowerShell コマンドを䜿甚しお、ASP.NET 4.x、.NET Framework 4.6、たたはその他の任意の Windows ゜フトりェアなどの远加コンポヌネントを蚭定するこずもできたす。 たずえば、Dockerfile の次のコマンドでは、ASP.NET 4.5 が蚭定されたす。

RUN powershell add-windowsfeature web-asp-net45

远加のリ゜ヌス