Ćwiczenie — tworzenie obrazu kontenera dla mikrousługi platformy .NET

Ukończone

W tym ćwiczeniu utworzysz punkt końcowy mikrousługi i konteneryzujesz go przy użyciu zestawu .NET SDK i platformy Docker.

Uwaga

To ćwiczenie można wykonać w wystąpieniu usługi GitHub Codespaces z wstępnie zainstalowanym zestawem Docker i zestawem .NET SDK . Jeśli używasz tych narzędzi i technik we własnym środowisku programistycznym, upewnij się, że zostały zainstalowane te wymagania wstępne.

Otwieranie środowiska projektowego

Możesz użyć przestrzeni kodu usługi GitHub, która hostuje ćwiczenie, lub wykonać ćwiczenie lokalnie w programie Visual Studio Code.

Aby użyć przestrzeni kodu, utwórz wstępnie skonfigurowany element GitHub Codespace za pomocą tego linku tworzenia usługi Codespace.

Utworzenie i skonfigurowanie przestrzeni kodu w usłudze GitHub trwa kilka minut. Po zakończeniu procesu zobaczysz pliki kodu dla ćwiczenia. Kod używany w pozostałej części tego modułu znajduje się w katalogu /dotnet-docker .

Aby użyć programu Visual Studio Code, sklonuj https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative repozytorium na komputer lokalny. Następnie:

  1. Zainstaluj wszelkie wymagania systemowe, aby uruchomić kontener deweloperski w programie Visual Studio Code.
  2. Upewnij się, że platforma Docker jest uruchomiona.
  3. W nowym oknie programu Visual Studio Code otwórz folder sklonowanego repozytorium
  4. Naciśnij klawisze Ctrl+Shift+P, aby otworzyć paletę poleceń.
  5. Wyszukiwanie: Tworzenie kontenerów: >ponowne kompilowanie i ponowne otwieranie w kontenerze
  6. Wybierz pozycję eShopLite — dotnet-docker z listy rozwijanej. Program Visual Studio Code tworzy kontener dewelopera lokalnie.

Tworzenie obrazu zaplecza Products za pomocą publikowania platformy .NET

Najnowsza wersja platformy .NET 8 zwiększa obsługę konteneryzacji. Możesz użyć dotnet publish polecenia , aby utworzyć obraz platformy Docker dla mikrousług. Polecenie tworzy obraz kontenera bez rootless, który uruchamia usługi na koncie app . Uruchamianie kontenerów bez rootless doskonale nadaje się do bezpieczeństwa i wydajności. Polecenie wie, jak wybrać najlepszy obraz podstawowy, sprawdzając ustawienia w pliku projektu.

  1. Aby utworzyć obrazy dla wszystkich eShopLite usług, przejdź do karty TERMINAL i uruchom następujące polecenie:

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

    Zobaczysz dane wyjściowe podobne do następujących komunikatów:

    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'.
    

    Polecenie odczytuje plik rozwiązania, ustalił, że zawiera trzy projekty, skompilowane i utworzone obrazy dla projektów sklepu i produktów. Obrazy są nazwane po projektach i publikowane w lokalnym rejestrze platformy Docker.

  2. Sprawdź, czy obrazy są dostępne na platformie Docker:

    docker images
    

    Zobaczysz dane wyjściowe podobne do następujących komunikatów:

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

Tworzenie obrazu zaplecza Products za pomocą pliku Dockerfile

Jeśli chcesz mieć większą kontrolę nad sposobem tworzenia obrazów, możesz użyć pliku Dockerfile do utworzenia obrazu dla usługi internetowej Products.

  1. W okienku EKSPLORATOR utwórz plik o nazwie Dockerfile w pliku ./dotnet-docker/Products. Plik jest pusty.

  2. Wprowadź następujące kod:

    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
    

    Po wykonaniu poniższych kroków ten kod skonfiguruje bibliotekę DataEntities w obrazie platformy Docker Products:

    • Pobierz obraz i nadaj mcr.microsoft.com/dotnet/sdk:8.0 obrazowi buildnazwę .
    • Ustaw katalog roboczy w obrazie na /DataEntitieswartość .
    • Skopiuj plik o nazwie DataEntities.csproj znaleziony lokalnie do utworzonego /DataEntities katalogu.
    • Wywołaj projekt dotnet restore .
    • Skopiuj wszystko w lokalnym katalogu DataEntities do obrazu.
    • Wywołaj projekt dotnet publish .
  3. Bezpośrednio poniżej ostatniego wiersza wprowadź następujący kod:

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

    Ten kod wykonuje następujące kroki sekwencyjnie po wywołaniu:

    • Ustaw katalog roboczy w obrazie na /srcwartość .
    • Skopiuj plik o nazwie Products.csproj znaleziony lokalnie do utworzonego /src katalogu.
    • Wywołaj projekt dotnet restore .
    • Skopiuj wszystko w lokalnym katalogu Products do obrazu.
    • Wywołaj projekt dotnet publish .
  4. Bezpośrednio poniżej ostatniego wiersza wprowadź następujący kod:

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

    Ten kod wykonuje następujące kroki sekwencyjnie po wywołaniu:

    • Przeciągnij mcr.microsoft.com/dotnet/aspnet:8.0 obraz.
    • Ustaw katalog roboczy w obrazie na /appwartość .
    • Uwidaczniaj port 80 i 443.
    • Skopiuj wszystko z katalogu aplikacji obrazu kompilacji utworzonego do katalogu aplikacji tego obrazu.
    • Ustaw punkt wejścia tego obrazu na dotnet i przekaż Products.dll go jako argument.

Tworzenie obrazu platformy Docker

Po ukończeniu pliku Dockerfile następnym krokiem jest użycie go do utworzenia obrazu platformy Docker:

  1. Aby utworzyć obraz dla usługi zaplecza Products, przejdź do karty TERMINAL i uruchom następujące polecenie:

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

    Spowoduje to uruchomienie poleceń w pliku Dockerfile w bieżącym katalogu i zastosowanie tagu productsbackend:latest do wynikowego obrazu.

  2. Po dużej ilości danych wyjściowych obraz zostanie skompilowany. Wprowadzenie docker images spowoduje wyświetlenie listy wszystkich obrazów w przestrzeni kodu, w tym productsbackend. Drugi obraz jest jednym dla samej przestrzeni kodu.

    Zobaczysz dane wyjściowe podobne do następujących komunikatów:

    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
    

Zastanów się nad różnicą między użyciem i dotnet publish koniecznością ręcznego utworzenia plików Dockerfile dla każdej mikrousługi w aplikacjach.

Uruchamianie kontenera i testowanie usługi

Teraz możesz użyć obrazu, aby uruchomić i hostować usługę Products.

  1. Aby utworzyć i uruchomić kontener na podstawie obrazu nowych produktów i uwidocznić usługę na porcie 32001, uruchom następujące polecenie:

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

    Lub jeśli chcesz uruchomić obraz utworzony przy użyciu pliku Dockerfile, uruchom polecenie:

    docker run -it --rm -p 32001:8080 productsbackend
    
  2. Aby przetestować usługę, przejdź do karty PORTY , a następnie po prawej stronie adresu lokalnego dla portu zaplecza wybierz ikonę globusa. Przeglądarka otwiera nową kartę pod tym adresem.

    Zrzut ekranu przedstawiający sposób nawiązywania połączenia z usługą produktów zaplecza.

  3. Aby wykonać zapytanie dotyczące niektórych produktów, dołącz adres za pomocą polecenia /api/product , a następnie naciśnij klawisz Enter. Powinny zostać wyświetlone informacje o produkcie w formacie 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"
        },
        ...
    ]