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

完了

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

Note

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

開発環境を開く

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

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

GitHub による codespace の作成と構成には数分かかります。 このプロセスが完了すると、演習用のコード ファイルが表示されます。 このモジュールの残りの部分で使われるコードは、/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 発行を使用して Products バックエンド イメージを作成する

最新の .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 を使用して Products バックエンド イメージを作成する

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

  1. EXPLORER ペインで、./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 を公開します。
    • 作成した build イメージの app ディレクトリから、このイメージの app ディレクトリにすべてをコピーします。
    • このイメージのエントリ ポイントを 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 を含む codespace 内のすべてのイメージの一覧が表示されます。 もう 1 つのイメージは、codespace 自体のイメージです。

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

    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 を使用することと、アプリ内のマイクロサービスごとに Dockerfiles を手動で作成する必要がある場合の違いについて考えてみてください。

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

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

  1. 新しいproducts イメージからコンテナーを作成して実行し、ポート 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"
        },
        ...
    ]