Övning – Skapa en containeravbildning för .NET-mikrotjänsten

Slutförd

I den här övningen skapar du en mikrotjänstslutpunkt och containeriserar den med hjälp av .NET SDK och Docker.

Kommentar

Du kan slutföra den här övningen i en instans av GitHub Codespaces som har Docker och .NET SDK förinstallerat. När du använder de här verktygen och teknikerna i din egen utvecklingsmiljö ska du se till att du har dessa förutsättningar installerade.

Öppna utvecklingsmiljön

Du kan välja att använda ett GitHub-kodområde som är värd för övningen eller slutföra övningen lokalt i Visual Studio Code.

Om du vill använda ett kodområde skapar du ett förkonfigurerat GitHub Codespace med den här länken för att skapa Codespace.

GitHub tar flera minuter att skapa och konfigurera kodområdet. När processen är klar visas kodfilerna för övningen. Koden som används för resten av den här modulen finns i katalogen /dotnet-docker .

Om du vill använda Visual Studio Code klonar du lagringsplatsen https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative till den lokala datorn. Sedan:

  1. Installera eventuella systemkrav för att köra Dev Container i Visual Studio Code.
  2. Kontrollera att Docker körs.
  3. Öppna mappen för den klonade lagringsplatsen i ett nytt Visual Studio Code-fönster
  4. Tryck på Ctrl+Skift+P för att öppna kommandopaletten.
  5. Sök: >Dev Containers: Återskapa och öppna igen i container
  6. Välj eShopLite – dotnet-docker i listrutan. Visual Studio Code skapar din utvecklingscontainer lokalt.

Använda .NET-publicering för att skapa backend-avbildningen Produkter

Den senaste .NET 8-versionen förbättrar stödet för containerisering. Du kan använda dotnet publish kommandot för att skapa en Docker-avbildning för dina mikrotjänster. Kommandot skapar en rotlös containeravbildning som kör tjänster under ett app konto. Att köra rotlösa containrar är bra för säkerhet och prestanda. Kommandot vet hur du väljer den bästa basavbildningen genom att kontrollera inställningarna i projektfilen.

  1. Om du vill skapa avbildningarna för alla eShopLite tjänster går du till fliken TERMINAL och kör det här kommandot:

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

    Du ser utdata som följande meddelanden:

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

    Kommandot läser lösningsfilen, fastslog att den innehåller tre projekt, skapade dem och skapade avbildningar för butiks- och produktprojekten. Avbildningarna namnges efter projekten och publiceras i det lokala Docker-registret.

  2. Kontrollera att avbildningarna är tillgängliga i docker:

    docker images
    

    Du ser utdata som följande meddelanden:

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

Använda en Dockerfile för att skapa backend-avbildningen Produkter

Om du vill ha mer kontroll över hur avbildningarna skapas kan du använda en Dockerfile för att skapa en avbildning för webbtjänsten Produkter.

  1. I explorer-fönstret skapar du en fil med namnet Dockerfile i ./dotnet-docker/Products. Filen är tom.

  2. Ange följande 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
    

    När du har slutfört följande steg konfigurerar den här koden dataentitetsbiblioteket i docker-avbildningen Products:

    • Hämta avbildningen mcr.microsoft.com/dotnet/sdk:8.0 och ge bilden buildnamnet .
    • Ange arbetskatalogen i avbildningen till /DataEntities.
    • Kopiera filen med namnet DataEntities.csproj som finns lokalt till katalogen /DataEntities som du skapade.
    • Anropa dotnet restore projektet.
    • Kopiera allt i den lokala dataentitetskatalogen till avbildningen.
    • Anropa dotnet publish projektet.
  3. Ange följande kod direkt under den sista raden:

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

    Den här koden utför följande steg sekventiellt när den anropas:

    • Ange arbetskatalogen i avbildningen till /src.
    • Kopiera filen med namnet Products.csproj som finns lokalt till katalogen /src som du skapade.
    • Anropa dotnet restore projektet.
    • Kopiera allt i den lokala produktkatalogen till avbildningen.
    • Anropa dotnet publish projektet.
  4. Ange följande kod direkt under den sista raden:

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

    Den här koden utför följande steg sekventiellt när den anropas:

    • Hämta bilden mcr.microsoft.com/dotnet/aspnet:8.0 .
    • Ange arbetskatalogen i avbildningen till /app.
    • Exponera port 80 och 443.
    • Kopiera allt från appkatalogen för den byggbild som du skapade till appkatalogen för den här avbildningen.
    • Ange startpunkten för den här bilden till dotnet och skicka Products.dll som ett argument.

Skapa Docker-avbildningen

När du har slutfört Dockerfile är nästa steg att använda den för att skapa en Docker-avbildning:

  1. Om du vill skapa avbildningen för serverdelstjänsten Produkter går du till fliken TERMINAL och kör följande kommando:

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

    Detta kör kommandona i Dockerfile i den aktuella katalogen och tillämpar taggen productsbackend:latest på den resulterande avbildningen.

  2. Efter mycket utdata skapas avbildningen. När du anger docker images visas en lista över alla bilder i kodområdet, inklusive productsbackend. Den andra avbildningen är den för själva kodområdet.

    Du ser utdata som följande meddelanden:

    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å skillnaden mellan att använda dotnet publish och att behöva skapa Dockerfiles manuellt för varje mikrotjänst i dina appar.

Kör containern och testa tjänsten

Nu kan du använda avbildningen för att köra och vara värd för produkttjänsten.

  1. Kör följande kommando för att skapa och köra en container från den nya produktavbildningen och exponera tjänsten på port 32001:

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

    Eller om du vill köra avbildningen som du skapade med Hjälp av Dockerfile kör du:

    docker run -it --rm -p 32001:8080 productsbackend
    
  2. Om du vill testa tjänsten växlar du till fliken PORTar och väljer sedan jordglobsikonen till höger om den lokala adressen för backend-porten . Webbläsaren öppnar en ny flik på den adressen.

    Skärmbild som visar hur du ansluter till tjänsten serverdelsprodukter.

  3. Om du vill fråga efter vissa produkter lägger du till adressen med /api/product och trycker sedan på Retur. Du bör se viss produktinformation 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"
        },
        ...
    ]