Øvelse – bygg et beholderbilde for .NET-mikrotjenesten

Fullført

I denne øvelsen oppretter du et mikrotjenesteendepunkt og beholder det ved hjelp av .NET SDK og Docker.

Merk deg

Du kan fullføre denne øvelsen i en forekomst av GitHub Codespaces som har Docker og .NET SDK forhåndsinstallert. Når du bruker disse verktøyene og teknikkene i ditt eget utviklingsmiljø, må du kontrollere at du har disse forutsetningene installert.

Åpne utviklingsmiljøet

Du kan velge å bruke et GitHub-kodeområde som er vert for øvelsen, eller fullføre øvelsen lokalt i Visual Studio Code.

Hvis du vil bruke et kodeområde, oppretter du et forhåndskonfigurert GitHub-kodeområde med denne koblingen for oppretting av kodeområde.

GitHub bruker flere minutter på å opprette og konfigurere kodeområdet. Når prosessen er fullført, ser du kodefilene for øvelsen. Koden som brukes for resten av denne modulen, er i /dotnet-docker-katalogen .

Hvis du vil bruke Visual Studio Code, kloner du https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-repositoriet til den lokale maskinen. Da:

  1. Installer eventuelle systemkrav for å kjøre Utviklingsbeholder i Visual Studio Code.
  2. Sørg for at Docker kjører.
  3. Åpne mappen til det klonede repositoriet i et nytt Visual Studio Code-vindu
  4. Trykk CTRL+SKIFT+P for å åpne kommandopaletten.
  5. Søk: >utviklerbeholdere: Gjenoppbygge og åpne på nytt i beholder
  6. Velg eShopLite – dotnet-docker fra rullegardinlisten. Visual Studio Code oppretter utviklingsbeholderen lokalt.

Bruk .NET-publisering til å opprette bakbilde av produkter

Den nyeste versjonen av .NET 8 forbedrer støtten for beholdere. Du kan bruke dotnet publish kommandoen til å opprette et Docker-bilde for mikrotjenesten. Kommandoen oppretter et rotløst beholderbilde som kjører tjenester under en app konto. Det er flott å kjøre rotløse beholdere for sikkerhet og ytelse. Kommandoen vet hvordan du velger det beste basisbildet ved å kontrollere innstillingene i prosjektfilen.

  1. Hvis du vil opprette bildene for alle eShopLite tjenestene, går du til TERMINAL-fanen og kjører denne kommandoen:

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

    Du ser utdata som følgende meldinger:

    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 leser løsningsfilen, fastslo at den inneholder tre prosjekter, bygde dem og opprettet bilder for store- og produktprosjekter. Bildene er oppkalt etter prosjektene og publisert i det lokale docker-registeret.

  2. Kontroller at bildene er tilgjengelige i docker:

    docker images
    

    Du ser utdata som følgende meldinger:

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

Bruk en Dockerfile til å opprette bakbilde av produkter

Hvis du vil ha mer kontroll over hvordan bildene bygges, kan du bruke en Dockerfile til å opprette et bilde for produkter-nettjenesten.

  1. Opprett en fil med navnet Dockerfile i ./dotnet-docker/Products i EXPLORER-ruten. Filen er tom.

  2. Skriv inn 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 fullført følgende trinn, konfigurerer denne koden DataEntities-biblioteket i products docker-bildet:

    • Dra bildet mcr.microsoft.com/dotnet/sdk:8.0 og gi bildet buildet navn.
    • Angi arbeidskatalogen i bildet til /DataEntities.
    • Kopier filen med navnet DataEntities.csproj funnet lokalt til katalogen /DataEntities du opprettet.
    • Ring dotnet restore på prosjektet.
    • Kopier alt i den lokale dataenheter-katalogen til bildet.
    • Ring dotnet publish på prosjektet.
  3. Skriv inn denne koden rett under den siste linjen:

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

    Denne koden utfører følgende trinn sekvensielt når den aktiveres:

    • Angi arbeidskatalogen i bildet til /src.
    • Kopier filen Products.csproj som ble funnet lokalt til katalogen /src du opprettet.
    • Ring dotnet restore på prosjektet.
    • Kopier alt i den lokale produktkatalogen til bildet.
    • Ring dotnet publish på prosjektet.
  4. Skriv inn denne koden rett under den siste linjen:

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

    Denne koden utfører følgende trinn sekvensielt når den aktiveres:

    • Dra bildet mcr.microsoft.com/dotnet/aspnet:8.0 .
    • Angi arbeidskatalogen i bildet til /app.
    • Vis port 80 og 443.
    • Kopier alt fra appkatalogen for build-bildet du opprettet i appkatalogen for dette bildet.
    • Angi inngangspunktet for dette bildet til dotnet og send Products.dll som et argument.

Opprett Docker-bildet

Etter å ha fullført Dockerfile, er neste trinn å bruke den til å opprette et Docker-bilde:

  1. Hvis du vil opprette bildet for serverdeltjenesten produkter, går du til TERMINAL-fanen og kjører denne kommandoen:

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

    Dette kjører kommandoene i Dockerfile i gjeldende katalog og bruker koden productsbackend:latest på det resulterende bildet.

  2. Etter mye utdata bygges bildet. Når du skriver inn docker images , vises en liste over alle bildene i kodeområdet, inkludert productsbackend. Det andre bildet er det for selve kodeområdet.

    Du ser utdata som følgende meldinger:

    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
    

Tenk på forskjellen mellom å bruke dotnet publish og å måtte opprette Dockerfiles manuelt for hver mikrotjeneste i appene dine.

Kjør beholderen og test tjenesten

Nå kan du bruke bildet til å kjøre og være vert for Produkter-tjenesten.

  1. Hvis du vil opprette og kjøre en beholder fra det nye produktbildet og vise tjenesten på port 32001, kjører du denne kommandoen:

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

    Eller hvis du vil kjøre bildet du opprettet ved hjelp av Dockerfile, kan du kjøre:

    docker run -it --rm -p 32001:8080 productsbackend
    
  2. Hvis du vil teste tjenesten, bytter du til PORTER-fanen og velger globusikonet til høyre for den lokale adressen for serverdelporten . Nettleseren åpner en ny fane på denne adressen.

    Skjermbilde som viser hvordan du kobler til serverdelprodukttjenesten.

  3. Hvis du vil spørre noen produkter, tilføyer du adressen med /api/product og trykker deretter på ENTER. Du bør se noe produktinformasjon oppført 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"
        },
        ...
    ]