Übung: Erstellen eines Containerimages für Ihren .NET-MicroserviceApp
In dieser Übung erstellen Sie einen Microservice-Endpunkt und containerisieren ihn mit Hilfe der .NET-SDK und Docker.
Hinweis
Sie können diese Übung in einer Instanz von GitHub Codespaces durchführen, auf der Docker und .NET SDK vorinstalliert sind. Wenn Sie diese Tools und Techniken in Ihrer eigenen Entwicklungsumgebung verwenden, stellen Sie sicher, dass diese Voraussetzungen erfüllt sind.
Öffnen der Entwicklungsumgebung
Sie können entweder einen GitHub-Codespace verwenden, der die Übung hostet, oder die Übung lokal in Visual Studio Code durchführen.
Um einen Codespace zu verwenden, erstellen Sie einen vorkonfigurierten GitHub Codespace mit diesem Link zur Codespace-Erstellung.
Die Erstellung und Konfiguration des Codespace auf GitHub dauert ein paar Minuten. Nach Abschluss des Vorgangs werden die Codedateien für die Übung angezeigt. Der Code, der für den Rest des Moduls verwendet wird, befindet sich im Verzeichnis /dotnet-docker.
Um Visual Studio Code zu verwenden, klonen Sie das https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative Repository auf Ihrem lokalen Computer. Führen Sie dann folgende Schritte aus:
- Installieren Sie alle Systemanforderungen, um Dev Container in Visual Studio Code ausführen zu können.
- Achten Sie darauf, dass Docker ausgeführt wird.
- Öffnen Sie in einem neuen Visual Studio Code-Fenster den Ordner des geklonten Repositorys.
- Drücken Sie STRG+UMSCHALT+P, um die Befehlspalette zu öffnen.
- Suche: >Dev-Container: In Container neu erstellen und erneut öffnen
- Wählen Sie eShopLite – Dotnet-Docker aus der Dropdownliste aus. Visual Studio Code erstellt Ihren Entwicklungscontainer lokal.
Verwenden der .NET-Veröffentlichung zum Erstellen des Images für das Products-Back-End
Im neuesten .NET 8-Release wurde die Unterstützung für die Containerisierung verbessert. Sie können den Befehl dotnet publish
verwenden, um ein Docker-Image für Ihre Microservices zu erstellen. Der Befehl erstellt ein Rootless-Containerimage, das Dienste unter einem app
Konto ausführt. Das Ausführen von Rootless-Containern eignet sich hervorragend für Sicherheit und Leistung. Der Befehl weiß, wie er das beste Basisimage auswählt, indem er die Einstellungen in der Projektdatei überprüft.
Um die Images für alle eShopLite-Dienste zu erstellen, wechseln Sie zur Registerkarte TERMINAL, und führen Sie den folgenden Befehl aus:
cd ./dotnet-docker dotnet publish /p:PublishProfile=DefaultContainer
Ihnen sollte eine Ausgabe wie der folgende Text angezeigt werden:
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'.
Der Befehl hat die Lösungsdatei gelesen, hat ermittelt, dass sie drei Projekte enthält, und hat sie sowie Images für die Store- und Produktprojekte erstellt. Die Images werden nach den Projekten benannt und in der lokalen Docker-Registrierung veröffentlicht.
Überprüfen Sie, ob die Images in Docker verfügbar sind:
docker images
Ihnen sollte eine Ausgabe wie der folgende Text angezeigt werden:
REPOSITORY TAG IMAGE ID CREATED SIZE products latest 63614e340088 About a minute ago 293MB store latest e9458c3abdb1 About a minute ago 218MB
Verwenden einer Dockerfile-Datei zum Erstellen des Images für das Products-Back-End
Wenn Sie mehr Kontrolle darüber wünschen, wie die Images erstellt werden, können Sie ein Dockerfile verwenden, um ein Image für den Produktwebdienst zu erstellen.
Erstellen Sie im EXPLORER-Bereich eine Datei namens Dockerfile in ./dotnet-docker/Products. Die Datei ist leer.
Geben Sie den folgenden Code ein:
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
Nach dem Ausführen der folgenden Schritte wird mit diesem Code die DataEntities-Bibliothek im Docker-Image „Products“ eingerichtet:
- Ein Pull für das Image
mcr.microsoft.com/dotnet/sdk:8.0
wird ausgeführt, und das Image wird alsbuild
benannt. - Das Arbeitsverzeichnis im Image wird auf
/DataEntities
festgelegt. - Kopieren Sie die Datei namens DataEntities.csproj, die lokal im Verzeichnis
/DataEntities
gespeichert ist, das Sie erstellt haben. - Rufen Sie
dotnet restore
im Projekt auf. - Kopieren Sie alle Inhalte im lokalen Verzeichnis DataEntities in das Image.
- Rufen Sie
dotnet publish
im Projekt auf.
- Ein Pull für das Image
Geben Sie unmittelbar unterhalb der letzten Zeile diesen Code ein:
WORKDIR /src COPY Products/Products.csproj . RUN dotnet restore COPY Products . RUN dotnet publish -c release -o /app
Dieser Code führt nacheinander die folgenden Schritte aus, wenn er aufgerufen wird:
- Das Arbeitsverzeichnis im Image wird auf
/src
festgelegt. - Kopieren Sie die Datei namens Products.csproj, die lokal im Verzeichnis
/src
gespeichert ist, das Sie erstellt haben. - Rufen Sie
dotnet restore
im Projekt auf. - Kopieren Sie alle Inhalte im lokalen Verzeichnis Products in das Image.
- Rufen Sie
dotnet publish
im Projekt auf.
- Das Arbeitsverzeichnis im Image wird auf
Geben Sie unmittelbar unterhalb der letzten Zeile diesen Code ein:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app EXPOSE 80 EXPOSE 443 COPY --from=build /app . ENTRYPOINT ["dotnet", "Products.dll"]
Dieser Code führt nacheinander die folgenden Schritte aus, wenn er aufgerufen wird:
- Ein Pull für das Image
mcr.microsoft.com/dotnet/aspnet:8.0
wird ausgeführt. - Das Arbeitsverzeichnis im Image wird auf
/app
festgelegt. - Machen Sie die Ports 80 und 443 verfügbar.
- Kopieren Sie alle Inhalte aus dem Verzeichnis app des erstellten Build-Image in das Verzeichnis app von diesem Image.
- Legen Sie den Einstiegspunkt dieses Images auf
dotnet
fest, und übergeben SieProducts.dll
als Argument.
- Ein Pull für das Image
Erstellen des Docker-Images
Wenn Sie das Dockerfile abgeschlossen haben, verwenden Sie es als nächstes zum Erstellen eines Docker-Images:
Um das Image für den Products-Back-End-Dienst zu erstellen, wechseln Sie zur Registerkarte TERMINAL, und führen Sie den folgenden Befehl aus:
cd ./dotnet-docker docker build -t productsbackend:latest -f Products/Dockerfile .
Dadurch werden die Befehle in Dockerfile im aktuellen Verzeichnis ausgeführt und das Tag productsbackend:latest auf das sich ergebende Image angewendet.
Nach einiger Ausgabe wird das Image erstellt. In
docker images
sehen Sie eine Liste aller Images in Ihrem Codespace, einschließlich productsbackend. Das andere Image ist das Image für den Codespace selbst.Ihnen sollte eine Ausgabe wie der folgende Text angezeigt werden:
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
Überlegen Sie sich den Unterschied zwischen der Verwendung von dotnet publish
und dem manuellen Erstellen der Dockerfiles für jeden Microservice in Ihren Apps.
Ausführen des Containers und Testen des Diensts
Jetzt können Sie das Image verwenden, um den Products-Dienst auszuführen und zu hosten.
Führen Sie den folgenden Befehl aus, um einen Container aus dem neuen Imageproducts zu erstellen und auszuführen und den Dienst auf Port 32001 verfügbar zu machen:
docker run -it --rm -p 32001:8080 products
Oder wenn Sie das mit der Dockerfile erstellte Image ausführen möchten, führen Sie Folgendes aus:
docker run -it --rm -p 32001:8080 productsbackend
Wechseln Sie zum Testen des Diensts zur Registerkarte PORTS. Wählen Sie dann rechts neben der lokalen Adresse für den Back-End-Port das Globussymbol aus. Der Browser öffnet eine neue Registerkarte mit dieser Adresse.
Fügen Sie zum Abfragen einiger Produkte an die Adresse /api/product an, und drücken Sie dann die EINGABETASTE. Einige Produktinformationen sollten im JSON-Format aufgeführt sein.
[ { "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" }, ... ]