演習 - .NET マイクロサービスのコンテナー イメージを構築する

完了

この演習では、マイクロサービス エンドポイントを作成し、.NET SDK と Docker を使用してコンテナー化します。

この演習は、 Docker.NET SDK がプレインストールされている GitHub Codespaces のインスタンスで実行できます。 独自の開発環境でこれらのツールと手法を使用する場合は、これらの前提条件がインストールされていることを確認してください。

開発環境を開く

演習をホストする GitHub codespace を使うか、Visual Studio Code でローカルで演習を完了するかを選択できます。

codespace を使用するには、この codespace 作成リンクを使用して、事前構成済みの GitHub codespace を作成します。

GitHub では、コードスペースの作成と構成に数分かかります。 プロセスが完了すると、演習のコード ファイルが表示されます。 このモジュールの残りの部分で使用されるコードは 、/dotnet-docker ディレクトリにあります。

Visual Studio Code を使用するには、ローカル コンピューターに https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative リポジトリをクローンします。 その後、以下を実行します。

  1. Visual Studio Code で Dev Container を実行するためのシステム要件をインストールします。
  2. Docker が動作していることを確認します。
  3. 新しい Visual Studio Code ウィンドウで、クローンされたリポジトリのフォルダーを開きます
  4. Ctrl+Shift+P キーを押して、コマンド パレットを開きます。
  5. 検索: >Dev Containers:コンテナーでリビルドして再度開く
  6. ドロップダウンから eShopLite - dotnet-docker を選択します。 Visual Studio Code により、ローカルで開発コンテナーが作成されます。

.NET 発行を使用して製品バックエンド イメージを作成する

最新の .NET 8 リリースでは、コンテナー化のサポートが強化されています。 dotnet publish コマンドを使用して、マイクロサービス用の Docker イメージを作成できます。 このコマンドは、 app アカウントでサービスを実行するルートレス コンテナー イメージを作成します。 ルートレス コンテナーの実行は、セキュリティとパフォーマンスに最適です。 このコマンドは、プロジェクト ファイルの設定を確認して、最適な基本イメージを選択する方法を認識します。

  1. すべての eShopLite サービスのイメージを作成するには、[ ターミナル ] タブに移動し、次のコマンドを実行します。

    cd ./dotnet-docker 
     dotnet publish /p:PublishProfile=DefaultContainer
    

    次のメッセージのような出力が表示されます。

    DataEntities -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/DataEntities/bin/Release/net8.0/publish/
    Products -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Products/bin/Release/net8.0/Products.dll
    Products -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Products/bin/Release/net8.0/publish/
    Store -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Store/bin/Release/net8.0/Store.dll
    Store -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Store/bin/Release/net8.0/publish/
    Building image 'store' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'.
    Building image 'products' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'.
    Pushed image 'store:latest' to local registry via 'docker'.
    Pushed image 'products:latest' to local registry via 'docker'.
    

    このコマンドは、ソリューション ファイルを読み取り、3 つのプロジェクトが含まれていると判断し、ビルドし、ストア プロジェクトと製品プロジェクトのイメージを作成しました。 イメージにはプロジェクトの名前が付けられ、ローカル Docker レジストリに発行されます。

  2. Docker でイメージが使用可能であることを確認します。

    docker images
    

    次のメッセージのような出力が表示されます。

    REPOSITORY                          TAG       IMAGE ID       CREATED              SIZE
    products                            latest    63614e340088   About a minute ago   293MB
    store                               latest    e9458c3abdb1   About a minute ago   218MB
    

Dockerfile を使用して製品バックエンド イメージを作成する

イメージの構築方法をより詳細に制御する場合は、Dockerfile を使用して Products Web サービスのイメージを作成できます。

  1. エクスプローラー ウィンドウで、./dotnet-docker/ProductsDockerfile という名前のファイルを作成します。 ファイルが空です。

  2. 次のコードを入力します。

    FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
    
    WORKDIR /DataEntities
    COPY "DataEntities/DataEntities.csproj" .
    RUN dotnet restore
    COPY "DataEntities" .
    RUN dotnet publish -c release -o /app
    

    次の手順を完了すると、このコードによって Products Docker イメージに DataEntities ライブラリが設定されます。

    • mcr.microsoft.com/dotnet/sdk:8.0イメージをプルし、イメージにbuildという名前を付けます。
    • イメージ内の作業ディレクトリを /DataEntitiesに設定します。
    • ローカルで見つかった DataEntities.csproj という名前のファイルを、作成した /DataEntities ディレクトリにコピーします。
    • プロジェクトの dotnet restore を呼び出します。
    • ローカル DataEntities ディレクトリ内のすべてをイメージにコピーします。
    • プロジェクトの dotnet publish を呼び出します。
  3. 最後の行のすぐ下に、次のコードを入力します。

     WORKDIR /src
     COPY Products/Products.csproj .
     RUN dotnet restore
     COPY Products .
     RUN dotnet publish -c release -o /app
    

    このコードは、呼び出されたときに次の手順を順番に実行します。

    • イメージ内の作業ディレクトリを /srcに設定します。
    • ローカルで見つかった Products.csproj という名前のファイルを、作成した /src ディレクトリにコピーします。
    • プロジェクトの dotnet restore を呼び出します。
    • ローカルの Products ディレクトリ内のすべてをイメージにコピーします。
    • プロジェクトの dotnet publish を呼び出します。
  4. 最後の行のすぐ下に、次のコードを入力します。

     FROM mcr.microsoft.com/dotnet/aspnet:8.0
     WORKDIR /app
     EXPOSE 80
     EXPOSE 443
     COPY --from=build /app .
     ENTRYPOINT ["dotnet", "Products.dll"]
    

    このコードは、呼び出されたときに次の手順を順番に実行します。

    • mcr.microsoft.com/dotnet/aspnet:8.0イメージをプルします。
    • イメージ内の作業ディレクトリを /appに設定します。
    • ポート 80 と 443 を公開します。
    • 作成したビルド イメージのアプリ ディレクトリから、このイメージのアプリ ディレクトリにすべてをコピーします。
    • このイメージのエントリ ポイントを dotnet に設定し、 Products.dll を引数として渡します。

Docker イメージを作成する

Dockerfile を完了したら、次の手順で Docker イメージを作成します。

  1. Products バックエンド サービスのイメージを作成するには、[ ターミナル ] タブに移動し、次のコマンドを実行します。

    cd ./dotnet-docker 
     docker build -t productsbackend:latest -f Products/Dockerfile .
    

    これにより、現在のディレクトリの Dockerfile でコマンドが実行され、結果のイメージにタグ productsbackend:latest が適用されます。

  2. 多くの出力後、イメージがビルドされます。 docker images入力すると、productsbackend を含むコードスペース内のすべてのイメージの一覧が表示されます。 もう 1 つのイメージは、コードスペース自体のイメージです。

    次のメッセージのような出力が表示されます。

    REPOSITORY                          TAG       IMAGE ID       CREATED              SIZE
    products                            latest    63614e340088   10 minutes ago       293MB
    store                               latest    e9458c3abdb1   10 minutes ago       218MB
    productsbackend                     latest   190783f7e06f    About a minute ago   293MB
    

dotnet publishを使用することと、アプリ内のマイクロサービスごとに Dockerfile を手動で作成する必要がある場合の違いについて考えます。

コンテナーを実行してサービスをテストする

これで、イメージを使用して Products サービスを実行およびホストできます。

  1. 新しい 製品 イメージからコンテナーを作成して実行し、ポート 32001 でサービスを公開するには、次のコマンドを実行します。

    docker run -it --rm -p 32001:8080  products
    

    または、Dockerfile を使用して作成したイメージを実行する場合は、次を実行します。

    docker run -it --rm -p 32001:8080 productsbackend
    
  2. サービスをテストするには、[ ポート ] タブに切り替え、 バックエンド ポートのローカル アドレスの右側にある地球アイコンを選択します。 ブラウザーで、そのアドレスに新しいタブが開きます。

    バックエンド製品サービスに接続する方法を示すスクリーンショット。

  3. 一部の製品に対してクエリを実行するには、 アドレスを /api/product に追加し、 Enter キーを押します。 いくつかの製品情報が JSON 形式で一覧表示されます。

    [
        {
            "id": 1,
            "name": "Solar Powered Flashlight",
            "description": "A fantastic product for outdoor enthusiasts",
            "price": 19.99,
            "imageUrl": "product1.png"
        },
        {
            "id": 2,
            "name": "Hiking Poles",
            "description": "Ideal for camping and hiking trips",
            "price": 24.99,
            "imageUrl": "product2.png"
        },
        {
            "id": 3,
            "name": "Outdoor Rain Jacket",
            "description": "This product will keep you warm and dry in all weathers",
            "price": 49.99,
            "imageUrl": "product3.png"
        },
        ...
    ]