Ö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.
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:
- 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ä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.
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.
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.
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 /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 bildenbuild
namnet . - 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.
- Hämta avbildningen
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.
- 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 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 skickaProducts.dll
som ett argument.
- Hämta bilden
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 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.
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
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.
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" }, ... ]