Øvelse – Opret et objektbeholderbillede til din .NET-mikrotjeneste

Fuldført

I denne øvelse skal du oprette et mikrotjenesteslutpunkt og objektbeholderisere det ved hjælp af .NET SDK og Docker.

Seddel

Du kan fuldføre denne øvelse i en forekomst af GitHub Codespaces, der har Docker- og .NET SDK- forudinstalleret. Når du bruger disse værktøjer og teknikker i dit eget udviklingsmiljø, skal du sørge for, at disse forudsætninger er installeret.

Åbn udviklingsmiljøet

Du kan vælge at bruge et GitHub-kodeområde, der er vært for øvelsen, eller fuldføre øvelsen lokalt i Visual Studio Code.

Hvis du vil bruge et kodeområde, skal du oprette et forudkonfigureret GitHub-kodeområde med dette link til oprettelse af kodeområde.

GitHub tager flere minutter at oprette og konfigurere kodeområdet. Når processen er fuldført, kan du se kodefilerne til øvelsen. Den kode, der bruges til resten af dette modul, findes i mappen /dotnet-docker.

Hvis du vil bruge Visual Studio Code, skal du klone det https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative lager til din lokale computer. Derpå:

  1. Installér alle systemkrav for at køre Dev Container i Visual Studio Code.
  2. Kontrollér, at Docker kører.
  3. Åbn mappen med det klonede lager i et nyt Visual Studio Code-vindue
  4. Tryk Ctrl+Skift+P- for at åbne kommandopaletten.
  5. Søg efter: >udviklerobjektbeholdere: Genopbyg og genåbn i objektbeholder
  6. Vælg eShopLite – dotnet-docker- på rullelisten. Visual Studio Code opretter din udviklingsobjektbeholder lokalt.

Brug .NET publicer til at oprette back end-afbildningen af Products

Den seneste .NET 8-version forbedrer understøttelsen af objektbeholderisering. Du kan bruge kommandoen dotnet publish til at oprette et Docker-billede til dine mikrotjenester. Kommandoen opretter et rodløst objektbeholderbillede, der kører tjenester under en app konto. Kørsel af rodløse objektbeholdere er velegnet til sikkerhed og ydeevne. Kommandoen ved, hvordan du vælger det bedste basisbillede ved at kontrollere indstillingerne i projektfilen.

  1. Hvis du vil oprette billederne for alle de eShopLite tjenester, skal du gå til fanen TERMINAL og køre denne kommando:

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

    Du kan se output som følgende meddelelser:

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

    Kommandoen læser løsningsfilen, fastslår, at den indeholder tre projekter, byggede dem og oprettede billeder til butiks- og produktprojekter. Billederne er navngivet efter projekterne og publiceret i den lokale docker-registreringsdatabase.

  2. Kontrollér, at billederne er tilgængelige i docker:

    docker images
    

    Du kan se output som følgende meddelelser:

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

Brug en Dockerfile til at oprette back end-billedet Products

Hvis du vil have mere kontrol over, hvordan billederne bygges, kan du bruge en Dockerfile til at oprette et billede til webtjenesten Products.

  1. I ruden EXPLORER skal du oprette en fil med navnet Dockerfile i ./dotnet-docker/Products. Filen er tom.

  2. Angiv følgende kode:

    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
    

    Når du har fuldført følgende trin, konfigurerer denne kode biblioteket DataEntities på afbildningen Products docker:

    • Træk det mcr.microsoft.com/dotnet/sdk:8.0 billede, og navngiv billedet build.
    • Angiv arbejdsmappen på billedet til /DataEntities.
    • Kopiér filen med navnet DataEntities.csproj, findes lokalt, til den /DataEntities mappe, du har oprettet.
    • Ring til dotnet restore på projektet.
    • Kopiér alt i den lokale DataEntities mappe til billedet.
    • Ring til dotnet publish på projektet.
  3. Angiv denne kode direkte under den sidste linje:

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

    Denne kode udfører følgende trin sekventielt, når den aktiveres:

    • Angiv arbejdsmappen på billedet til /src.
    • Kopiér filen med navnet Products.csproj fundet lokalt til den /src mappe, du har oprettet.
    • Ring til dotnet restore på projektet.
    • Kopiér alt i den lokale Products mappe til billedet.
    • Ring til dotnet publish på projektet.
  4. Angiv denne kode direkte under den sidste linje:

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

    Denne kode udfører følgende trin sekventielt, når den aktiveres:

    • Træk billedet mcr.microsoft.com/dotnet/aspnet:8.0.
    • Angiv arbejdsmappen på billedet til /app.
    • Vis port 80 og 443.
    • Kopiér alt fra app--mappen for det build billede, du har oprettet, til mappen app for dette billede.
    • Angiv indgangspunktet for dette billede for at dotnet og overføre Products.dll som et argument.

Opret Docker-billedet

Når Dockerfile er fuldført, er det næste trin at bruge den til at oprette et Docker-billede:

  1. Hvis du vil oprette billedet for back end-tjenesten Products, skal du gå til fanen TERMINAL og køre denne kommando:

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

    Dette kører kommandoerne i Dockerfile i den aktuelle mappe og anvender koden productsbackend:latest på det resulterende billede.

  2. Efter meget output bygges billedet. Hvis du angiver docker images, kan du se en liste over alle billeder i kodeområdet, herunder productsbackend. Det andet billede er det for selve kodeområdet.

    Du kan se output som følgende meddelelser:

    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
    

Tænk på forskellen mellem at bruge dotnet publish og at skulle oprette Dockerfiles manuelt for hver mikrotjeneste i dine apps.

Kør objektbeholderen, og test tjenesten

Nu kan du bruge billedet til at køre og hoste tjenesten Products.

  1. Hvis du vil oprette og køre en objektbeholder fra de nye produkter billede og vise tjenesten på port 32001, skal du køre denne kommando:

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

    Eller hvis du vil køre det billede, du har oprettet ved hjælp af Dockerfile, skal du køre:

    docker run -it --rm -p 32001:8080 productsbackend
    
  2. Hvis du vil teste tjenesten, skal du skifte til fanen PORTE og derefter vælge globusikonet til højre for den lokale adresse for Back End port. Browseren åbner en ny fane på den pågældende adresse.

    Skærmbillede, der viser, hvordan du opretter forbindelse til backend-produkttjenesten.

  3. Hvis du vil forespørge om nogle produkter, skal du tilføje adressen med /api/product og derefter trykke på Enter. Du bør kunne se nogle produktoplysninger, der er angivet i JSON-format.

    [
        {
            "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"
        },
        ...
    ]