Övning – Skapa en containeravbildning för .NET-mikrotjänsten
I den här övningen skapar du en mikrotjänstslutpunkt och containeriserar den med hjälp av .NET SDK och Docker.
Notera
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ådeskapar du ett förkonfigurerat GitHub Codespace med denna Codespace-skapningslänk.
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. Då:
- Installera eventuella systemkrav för att köra Dev Container i Visual Studio Code.
- Kontrollera att Docker körs.
- Öppna mappen för den klonade lagringsplatsen i ett nytt Visual Studio Code-fönster
- Tryck på Ctrl+Skift+P för att öppna kommandopaletten.
- Sök: >Dev Containers: Återskapa och öppna igen i container
- Välj eShopLite – dotnet-docker i listrutan. Visual Studio Code skapar din utvecklingscontainer lokalt.
Använd .NET publish för att skapa back-end-avbildningen för Produkter
Den senaste .NET 8-versionen förbättrar stödet för containerisering. Du kan använda kommandot dotnet publish 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.
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=DefaultContainerDu 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.
Kontrollera att avbildningarna är tillgängliga i docker:
docker imagesDu 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änd en Dockerfile för att skapa avbildningen för Produkters back-end
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.
I explorer-fönstret skapar du en fil med namnet Dockerfile i ./dotnet-docker/Products. Filen är tom.
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 /appNär du har slutfört följande steg konfigurerar den här koden dataentitetsbiblioteket i docker-avbildningen Products:
- Hämta
mcr.microsoft.com/dotnet/sdk:8.0-avbildningen och ge bilden namnetbuild. - Ange arbetskatalogen i avbildningen till
/DataEntities. - Kopiera filen med namnet DataEntities.csproj som finns lokalt till katalogen
/DataEntitiessom du skapade. - Ring
dotnet restorepå projektet. - Kopiera allt i den lokala DataEntiteter mapp till avbildningen.
- Ring
dotnet publishpå projektet.
- Hämta
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 /appDen 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
/srcsom du skapade. - Ring
dotnet restorepå projektet. - Kopiera allt i den lokala katalogen Products till avbildningen.
- Ring
dotnet publishpå projektet.
- Ange arbetskatalogen i avbildningen till
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
mcr.microsoft.com/dotnet/aspnet:8.0bilden. - Ange arbetskatalogen i avbildningen till
/app. - Exponera port 80 och 443.
- Kopiera allt från katalogen app av bygg avbildningen du skapade till katalogen app i den här avbildningen.
- Ange startpunkten för den här bilden till
dotnetoch skickaProducts.dllsom ett argument.
- Hämta
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:
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.
Efter mycket utdata skapas avbildningen. När du anger
docker imagesvisas 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 hosta tjänsten Products.
Kör följande kommando för att skapa och köra en container från den nya avbildningen för produkter och öppna tjänsten på port 32001:
docker run -it --rm -p 32001:8080 productsEller om du vill köra avbilden du skapade med Dockerfile, kör:
docker run -it --rm -p 32001:8080 productsbackendOm 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.
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" }, ... ]