Übung: Erstellung eines Container-Images für Ihren .NET-Microservice
In dieser Übung erstellen Sie einen Microservice-Endpunkt und containerisieren ihn mithilfe des .NET SDK und Docker.
Hinweis
Sie können diese Übung in einer Instanz von GitHub Codespaces abschließen, die Docker und das .NET SDK vorinstalliert hat. Wenn Sie diese Tools und Techniken in Ihrer eigenen Entwicklungsumgebung verwenden, stellen Sie sicher, dass diese Voraussetzungen installiert 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 über diesen Link zur Codespace-Erstellung erstellen.
GitHub dauert mehrere Minuten, um den Codespace zu erstellen und zu konfigurieren. Nach Abschluss des Vorgangs werden die Codedateien für die Übung angezeigt. Der für den Rest dieses Moduls verwendete Code 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: Neu erstellen und erneut im Container öffnen
- Wählen Sie "eShopLite - dotnet-docker " aus der Dropdownliste aus. Visual Studio Code erstellt Ihren Entwicklungscontainer lokal.
Verwenden Sie '.NET publish', um das Back-End-Image des Produkts zu erstellen.
Die neueste .NET 8-Version verbessert die Unterstützung für die Containerisierung. Sie können den dotnet publish
Befehl 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 Sie das beste Basisimage auswählen, indem Sie die Einstellungen in der Projektdatei überprüfen.
Um die Bilder 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 liest die Lösungsdatei aus, bestimmt, dass sie drei Projekte enthält, baut sie und erstellt Bilder für die Store- und Produktprojekte. 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 Back-End-Images für Produkte
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 Products-Webdienst 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 Abschluss der folgenden Schritte richtet dieser Code die DataEntities-Bibliothek im Docker-Image "Products" ein:
- Ziehen Sie das
mcr.microsoft.com/dotnet/sdk:8.0
Bild, und benennen Sie das Bildbuild
. - Das Arbeitsverzeichnis im Image wird auf
/DataEntities
festgelegt. - Kopieren Sie die Datei " DataEntities.csproj " lokal in das
/DataEntities
von Ihnen erstellte Verzeichnis. - Rufen Sie
dotnet restore
im Projekt auf. - Kopieren Sie alle Elemente im lokalen DataEntities-Verzeichnis in das Bild.
- Rufen Sie
dotnet publish
im Projekt auf.
- Ziehen Sie das
Geben Sie direkt 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 die folgenden Schritte sequenziell aus, wenn sie aufgerufen werden:
- Das Arbeitsverzeichnis im Image wird auf
/src
festgelegt. - Kopieren Sie die Datei mit dem Namen "Products.csproj " lokal in das
/src
von Ihnen erstellte Verzeichnis. - Rufen Sie
dotnet restore
im Projekt auf. - Kopieren Sie alle Elemente im lokalen Produktverzeichnis in das Bild.
- Rufen Sie
dotnet publish
im Projekt auf.
- Das Arbeitsverzeichnis im Image wird auf
Geben Sie direkt 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 die folgenden Schritte sequenziell aus, wenn sie aufgerufen werden:
- 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 alles aus dem app-Verzeichnis des build-Images, das Sie erstellt haben, in das app-Verzeichnis dieses Bildes.
- Legen Sie den Einstiegspunkt dieses Bildes auf
dotnet
fest und übergeben SieProducts.dll
als Argument.
- Ein Pull für das Image
Erstellen des Docker-Images
Nach Abschluss der Dockerfile-Datei besteht der nächste Schritt darin, es zum Erstellen eines Docker-Images zu verwenden:
Um das Image für den Back-End-Dienst für Produkte 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 resultierende Image angewendet.
Nachdem viele Ergebnisse vorliegen, wird das Image erstellt. Mit der Eingabe von
docker images
erhalten Sie eine Liste aller Bilder 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 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 Produktdienst auszuführen und zu hosten.
Führen Sie den folgenden Befehl aus, um einen Container aus dem Image der neuen Produkte 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
Um den Dienst zu testen, wechseln Sie zur Registerkarte "PORTS ", und wählen Sie dann rechts neben der lokalen Adresse für den Back-End-Port das Globussymbol aus. Der Browser öffnet an dieser Adresse eine neue Registerkarte.
Um einige Produkte abzufragen, fügen Sie die Adresse mit "/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" }, ... ]