Freigeben über


Containerisieren einer .NET Core-App

Gilt für: Windows Server 2025, Windows Server 2022, Windows Server 2019, Windows Server 2016

In diesem Thema wird beschrieben, wie Sie eine vorhandene .NET-Beispiel-App für die Bereitstellung als Windows-Container verpacken, nachdem Sie Ihre Umgebung wie unter Erste Schritte: Vorbereiten von Windows für Container beschrieben eingerichtet haben und den ersten Container gemäß Ausführen des ersten Windows-Containers ausführen.

Außerdem benötigen Sie das Git-Quellcodeverwaltungssystem auf Ihrem Computer installiert. Um es zu installieren, besuchen Sie Git.

Klonen des Beispielcodes von GitHub

Der gesamte Containerbeispiel-Quellcode wird im Virtualization-Documentation- Git-Repository in einem Ordner namens windows-container-samplesgespeichert.

  1. Öffnen Sie eine PowerShell-Sitzung, und ändern Sie Verzeichnisse in den Ordner, in dem Sie dieses Repository speichern möchten. (Andere Eingabeaufforderungsfenstertypen funktionieren ebenfalls, aber unsere Beispielbefehle verwenden PowerShell.)

  2. Klonen Sie das Repository in Ihrem aktuellen Arbeitsverzeichnis:

    git clone https://github.com/MicrosoftDocs/Virtualization-Documentation.git
    
  3. Navigieren Sie mit den folgenden Befehlen zu dem unter Virtualization-Documentation\windows-container-samples\asp-net-getting-started gefundenen Beispielverzeichnis, und erstellen Sie eine Dockerfile-Datei.

    Eine Dockerfile- ist wie eine Makefile- es ist eine Liste von Anweisungen, die dem Containermodul mitteilen, wie das Containerimage erstellt wird.

    # Navigate into the sample directory
    Set-Location -Path Virtualization-Documentation\windows-container-samples\asp-net-getting-started
    
    # Create the Dockerfile for our project
    New-Item -Name Dockerfile -ItemType file
    

Schreiben der Dockerfile-Datei

Öffnen Sie die Dockerfile-Datei, die Sie soeben erstellt haben, und fügen Sie dann den folgenden Inhalt hinzu:

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "asp-net-getting-started.dll"]

Lass uns das Schritt für Schritt aufschlüsseln und erklären, was jeder Befehl bedeutet.

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env
WORKDIR /app

Die erste Gruppe von Zeilen gibt an, welches Basisimage wir verwenden werden, um unseren Container darauf aufzubauen. Wenn das lokale System dieses Image noch nicht aufweist, versucht Docker es automatisch und ruft es ab. Die mcr.microsoft.com/dotnet/core/sdk:2.1 wird mit dem installierten .NET Core 2.1 SDK verpackt. Daher liegt es an der Aufgabe, ASP .NET-Kernprojekte für Version 2.1 zu erstellen. Die nächste Anweisung ändert das Arbeitsverzeichnis in unserem Container so, dass er /appwird, sodass alle Befehle, die auf diesen Befehl folgen, unter diesem Kontext ausgeführt werden.

COPY *.csproj ./
RUN dotnet restore

Als Nächstes kopieren diese Anweisungen die .csproj-Dateien in das /app-Verzeichnis des build-env-Containers. Nach dem Kopieren dieser Datei liest .NET sie aus und ruft dann alle Abhängigkeiten und Tools ab, die von unserem Projekt benötigt werden.

COPY . ./
RUN dotnet publish -c Release -o out

Sobald .NET alle Abhängigkeiten in den container build-env abgerufen hat, kopiert die nächste Anweisung alle Projektquelldateien in den Container. Anschließend wird .NET aufgefordert, unsere Anwendung mit einer Releasekonfiguration zu veröffentlichen und den Ausgabepfad anzugeben.

Die Kompilierung sollte erfolgreich sein. Jetzt müssen wir das endgültige Image erstellen.

Tipp

Diese Schnellstartanleitung erstellt ein .NET-Kernprojekt aus der Quelle. Beim Erstellen von Containerimages empfiehlt es sich, nur die Produktionsnutzdaten und ihre Abhängigkeiten in das Containerimage aufzunehmen. Wir möchten nicht, dass das .NET Core SDK in unserem endgültigen Image enthalten ist, da wir nur die .NET Core-Runtime benötigen. Deshalb ist das Dockerfile so geschrieben, dass es einen temporären Container namens build-env verwendet, der mit dem SDK gepackt ist, um die App zu bauen.

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "asp-net-getting-started.dll"]

Da unsere Anwendung ASP.NET ist, geben wir ein Bild mit dieser eingeschlossenen Laufzeit an. Anschließend kopieren wir alle Dateien aus dem Ausgabeverzeichnis unseres temporären Containers in unseren endgültigen Container. Wir konfigurieren unseren Container so, dass er mit unserer neuen App als Einstiegspunkt ausgeführt wird, wenn der Container gestartet wird.

Wir haben das Dockerfile geschrieben, um eine mehrstufige Erstellung durchzuführen. Wenn die Dockerfile-Datei ausgeführt wird, wird der temporäre Container build-envmit dem .NET Core 2.1 SDK zum Erstellen der Beispiel-App verwendet und dann die ausgegebenen Binärdateien in einen anderen Container kopiert, der nur die .NET Core 2.1-Laufzeit enthält, sodass wir die Größe des endgültigen Containers minimiert haben.

Erstellen und Ausführen der App

Mit der geschriebenen Dockerfile-Datei können wir Docker auf unsere Dockerfile verweisen und es anweisen, es zu erstellen und dann unser Image auszuführen:

  1. Navigieren Sie in einem Eingabeaufforderungsfenster zu dem Verzeichnis, in dem sich die Dockerfile befindet, und führen Sie dann den Docker Build Befehl aus, um den Container aus der Dockerfile-Datei zu erstellen.

    docker build -t my-asp-app .
    
  2. Führen Sie den neu erstellten Container aus, indem Sie den Befehl docker run ausführen.

    docker run -d -p 5000:80 --name myapp my-asp-app
    

    Lassen Sie uns diesen Befehl dissectieren:

    • -d weist Docker an, den Container im Hintergrund auszuführen, was bedeutet, dass keine Konsole mit der Konsole innerhalb des Containers verbunden ist. Der Container wird im Hintergrund ausgeführt.
    • -p 5000:80 weist Docker an, Port 5000 auf dem Host zu Port 80 im Container zuzuordnen. Jeder Container erhält eine eigene IP-Adresse. ASP .NET lauscht standardmäßig auf Port 80. Die Portzuordnung ermöglicht es uns, zur IP-Adresse des Hosts am zugeordneten Port zu wechseln, und Docker leitet den gesamten Datenverkehr an den Zielport innerhalb des Containers weiter.
    • --name myapp weist Docker an, diesem Container einen leicht zu verwendenden Namen für Abfragen zu geben, anstatt die von Docker zur Laufzeit zugewiesene Container-ID nachschlagen zu müssen.
    • my-asp-app ist das Image, das Docker ausführen soll. Dies ist das Containerimage, das als Höhepunkt des docker build Prozesses erzeugt wird.
  3. Öffnen Sie einen Webbrowser, und navigieren Sie zu http://localhost:5000, um Ihre containerisierte Anwendung anzuzeigen.

    ASP.NET Core-Webseite, die vom Localhost in einem Container ausgeführt wird

Nächste Schritte

  1. Der nächste Schritt besteht darin, Ihre containerisierte ASP.NET Web-App in einer privaten Registrierung mithilfe der Azure-Containerregistrierung zu veröffentlichen. Auf diese Weise können Sie sie in Ihrer Organisation bereitstellen.

    Wenn Sie zum Abschnitt gelangen, in dem Sie Ihr Containerimage an die Registrierungübertragen, geben Sie den Namen der ASP.NET App an, die Sie soeben gepackt haben (my-asp-app) zusammen mit Ihrer Containerregistrierung (z. B. contoso-container-registry):

    docker tag my-asp-app contoso-container-registry.azurecr.io/my-asp-app:v1
    

    Weitere App-Beispiele und deren zugehörige Dockerfiles finden Sie unter zusätzliche Containerbeispiele.

  2. Nachdem Sie Ihre App in der Containerregistrierung veröffentlicht haben, besteht der nächste Schritt darin, die App in einem Kubernetes-Cluster bereitzustellen, den Sie mit Azure Kubernetes Service erstellen.