Übung: Erstellen eines Containerimages für Ihren .NET-MicroserviceApp

Abgeschlossen

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:

  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: In Container neu erstellen und erneut öffnen
  6. 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.

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

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

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

Erstellen des Docker-Images

Wenn Sie das Dockerfile abgeschlossen haben, verwenden Sie es als nächstes zum Erstellen eines Docker-Images:

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

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

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

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

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