Übung: Erstellung eines Container-Images für Ihren .NET-Microservice

Abgeschlossen

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:

  1. Installieren Sie alle Systemanforderungen, um Dev Container in Visual Studio Code ausführen zu können.
  2. Achten Sie darauf, dass Docker ausgeführt wird.
  3. Öffnen Sie in einem neuen Visual Studio Code-Fenster den Ordner des geklonten Repositorys.
  4. Drücken Sie STRG+UMSCHALT+P, um die Befehlspalette zu öffnen.
  5. Suche: >Dev-Container: Neu erstellen und erneut im Container öffnen
  6. 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.

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

  2. Ü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.

  1. Erstellen Sie im EXPLORER-Bereich eine Datei namens Dockerfile in ./dotnet-docker/Products. Die Datei ist leer.

  2. 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 Bild build.
    • 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.
  3. 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.
  4. 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 Sie Products.dll als Argument.

Erstellen des Docker-Images

Nach Abschluss der Dockerfile-Datei besteht der nächste Schritt darin, es zum Erstellen eines Docker-Images zu verwenden:

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

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

  1. 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
    
  2. 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.

    Screenshot, der zeigt, wie eine Verbindung mit dem Back-End-Produktdienst hergestellt wird.

  3. 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"
        },
        ...
    ]