Zum Fußzeileninhalt springen
Iron Academy Logo
C#-Anwendung
C#-Anwendung

Andere Kategorien

Bereitstellen in einem Container und Docker Hub - Erstellen einer Beispiel-API in C# Kurs

Tim Corey
23m 51s

Das Deployment einer .NET Core-Anwendung in einen Docker-Container ist eine wichtige Fähigkeit für moderne Entwickler. Container bieten eine unveränderliche Infrastruktur, einfache Verteilung und leichtgewichtige Laufzeitumgebungen. In diesem ausführlichen Leitfaden gehen wir durch die Bereitstellung einer Beispiel-API in einem Docker-Container und pushen sie anschließend in Docker Hub, wobei wir den Schritten folgen, die im umfassenden Video-Tutorial von Tim Corey gezeigt werden: "Deploying to a Container and Docker Hub - Building a Sample API in C#."

Lassen Sie uns den Prozess Schritt für Schritt erkunden, wobei wir uns auf bestimmte Zeitstempel beziehen, um den Prozess leicht nachvollziehen zu können. Dieses Handbuch umfasst die Verwendung von Befehlen wie dotnet publish, den Befehl docker run und Begriffe wie base image, runtime image und container image - alles wichtige Konzepte für die Bereitstellung einer .NET-Anwendung mit Docker.

Erstellen und Verstehen der Beispiel-API

Zu Beginn des Videos hebt Tim die Nützlichkeit einer Beispielanwendung beim Erlernen der Webentwicklung hervor. Die App enthält Endpunkte wie /courses und /health, simuliert reale Probleme wie z. B. verschlechterte Gesundheitsprüfungen und ist so konzipiert, dass sie sowohl auf Ihrem lokalen Rechner als auch auf einem Remote-Server ausgeführt werden kann.

Es handelt sich um eine .NET Core-Anwendung (genauer gesagt um eine minimale ASP.NET Core-API), die problemlos über Docker-Container ausgeführt und getestet werden kann.

Docker lokal einrichten

Tim überprüft, ob Docker auf seinem lokalen Rechner installiert ist, indem er Docker Desktop verwendet. Er merkt an, dass es möglich ist, direkt auf Docker Hub zu veröffentlichen, ohne dass Docker lokal installiert ist, aber zur Demonstration beginnt er mit der lokalen Bereitstellung.

Er zeigt zwei vorinstallierte Docker-Images:

  • Ein persönliches Tool für Untertitel

  • Das offizielle ASP.NET Core-Basisbild von Microsoft: mcr.microsoft.com/dotnet/aspnet

Dieses Basis-Image ist etwa 328 MB groß und dient als Grundlage für unser Container-Image. Microsoft hostet diese Images auf seiner MCR (Microsoft Container Registry) und unterstützt sowohl Linux- als auch Windows-Container. Für dieses Projekt ist Linux das Zielbetriebssystem.

Lokales Veröffentlichen in einem Container

Tim navigiert zum API-Projektordner und führt den folgenden Befehl in der Befehlszeile aus:

dotnet publish -p:PublishProfile=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer

Dieser Befehl verwendet die eingebaute Container-Unterstützung in .NET 8 und .NET 9, wodurch eine Dockerdatei nicht mehr erforderlich ist. Der Veröffentlichungsprozess wählt ein geeignetes Laufzeit-Image aus und erstellt ein in sich geschlossenes Container-Image.

So sieht es unter der Haube aus:

  • Die Projektdatei (.csproj) wird zur Erstellung der API verwendet

  • Abhängigkeiten werden mit dem Befehl dotnet restore wiederhergestellt

  • Die Ausgabe wird in einem Veröffentlichungsordner abgelegt

  • Es wird eine DLL-Datei erstellt und in den Container eingebettet

Das resultierende Bild ist etwa 333 MB groß (nur 5 MB größer als die Basisdatei).

Das Image mit Docker ausführen

Sobald das Image erstellt ist, verwendet Tim Docker Desktop, um den Container auszuführen. Intern lauscht die Anwendung auf Port 8080. Tim ordnet diesen Port einem zufälligen Host-Port zu, indem er in der Port-Konfiguration 0 eingibt.

Der Container wird mit einem zufälligen Namen gestartet (z. B. elegant_hoover), und der Browser öffnet sich, um eine funktionierende API mit "Hello World" als Standardantwort anzuzeigen.

Durch das Aufrufen von /courses und /health bestätigt Tim, dass die API funktioniert. Der Endpunkt für den Gesundheitscheck ist nützlich, um ein Szenario für eine Produktionsumgebung zu simulieren.

Um laufende Container anzuzeigen, können Sie den Befehl docker ps in der CLI verwenden. Tim löscht anschließend den laufenden Container und das Image, um die Bereinigung zu demonstrieren.

Erstellen eines Docker Hub Repository

Als Nächstes geht Tim zum Teil der Cloud-Bereitstellung über. Er meldet sich bei seinem Docker Hub-Konto an und erstellt ein öffentliches Repository namens thesampleapi.

Hier wird das Docker-Image veröffentlicht, damit andere es verwenden können:

docker pull timcorey/thesampleapi:latest
docker pull timcorey/thesampleapi:latest

Konfiguration des Projekts für Docker Hub

In der Projektdatei der API fügt Tim Metadaten hinzu, um festzulegen, wo und wie das Docker-Image veröffentlicht werden soll. Er fügt den folgenden Codeblock hinzu:

<ContainerRegistry>docker.io</ContainerRegistry>
<ContainerRepository>timcorey/thesampleapi</ContainerRepository>
<ContainerImageTags>1.0.0;latest</ContainerImageTags>
<ContainerRegistry>docker.io</ContainerRegistry>
<ContainerRepository>timcorey/thesampleapi</ContainerRepository>
<ContainerImageTags>1.0.0;latest</ContainerImageTags>
  • ContainerRegistrierung: Gibt Docker Hub als Zielregistrierung an.

  • ContainerRepository: Der Pfad zum Docker Hub Repo.

  • ContainerImageTags: Kennzeichnet das Bild für die Versionierung und die neueste Version.

Dies bereitet das Bild für einen mehrstufigen Build-Flow in der Zukunft vor, obwohl Tim die Dinge im Moment einfach hält.

Veröffentlichung auf Docker Hub

Tim führt denselben Veröffentlichungsbefehl erneut aus:

dotnet publish -p:PublishProfile=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer

Zunächst schlägt der Push fehl, weil er vergessen hat, die .csproj-Datei zu speichern. Nach dem Speichern und erneuten Ausführen des Befehls wird das Bild erfolgreich in Docker Hub hochgeladen.

In Docker Hub erscheinen sowohl die neuesten als auch die 1.0.0-Tags unter dem thesampleapi-Repository. Diese Tags ermöglichen Flexibilität beim Ziehen bestimmter Versionen.

Das Image von Docker Hub abrufen

Tim demonstriert, wie man das Image von einem beliebigen Rechner mit installiertem Docker zieht:

docker pull timcorey/thesampleapi:latest
docker pull timcorey/thesampleapi:latest

Dank der Zwischenspeicherung auf Docker-Ebene kann das Bild schnell heruntergeladen werden, da das meiste davon bereits im Basisbild vorhanden ist.

So führen Sie das Bild aus:

docker run -p 0:8080 timcorey/thesampleapi:latest
docker run -p 0:8080 timcorey/thesampleapi:latest

Damit wird ein zufälliger Host-Port auf den internen Port 8080 abgebildet.

Erstellung einer neuen Version des Bildes

Um die Versionierung zu demonstrieren, bearbeitet Tim die .csproj-Datei:

<ContainerImageTags>1.0.1;latest</ContainerImageTags>
<ContainerImageTags>1.0.1;latest</ContainerImageTags>

Anschließend führt er den Veröffentlichungsbefehl erneut aus:

dotnet publish -p:PublishProfile=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer

Das Docker Hub Repository zeigt nun drei Tags an:

  • 1.0.0

  • 1.0.1

  • neueste Version (zeigt jetzt auf 1.0.1)

Tim erklärt, dass Docker trotz mehrerer Tags keine doppelten Schichten speichert und die Festplattennutzung durch getrennte Schichten optimiert.

Verwendung des Docker-Images für lokale Entwicklung

Tim betont, dass das Image, sobald es sich auf Docker Hub befindet, jederzeit auf jedem beliebigen Rechner ausgeführt werden kann, indem es verwendet wird:

docker pull timcorey/thesampleapi:latest
docker pull timcorey/thesampleapi:latest

Verwenden Sie dann den Befehl docker run, um es zu starten. Wenn Sie fertig sind, räumen Sie mit auf:

docker ps           # Get container ID
docker stop <id>    # Stop the container
docker rm <id>      # Remove the container
docker rmi <image>  # Remove the image
docker ps           # Get container ID
docker stop <id>    # Stop the container
docker rm <id>      # Remove the container
docker rmi <image>  # Remove the image

Er erklärt, dass dies die perfekte Lösung für On-Demand-Entwicklung und -Tests ist, ohne dass Ihr lokaler Rechner überlastet wird.

Wie geht es weiter?

Abschließend weist Tim auf den nächsten Schritt hin: die Bereitstellung derselben API auf einem Virtual Private Server (VPS). Er wird die Zuordnung einer Domäne und die Konfiguration des Containers für den öffentlichen Zugriff erläutern.

Abschluss: Vom lokalen Build zur Cloud-Bereitstellung

Mit Hilfe des Videos von Tim Corey haben wir:

  • Erstellung einer .NET Core API mit dotnet new console

  • Verwendung von dotnet restore und dotnet publish zur Erstellung und Bereitstellung

  • Erstellen eines Docker-Containers, ohne dass eine Beispiel-Dockerdatei erforderlich ist

  • Hochladen des Container-Images auf Docker Hub

  • Der Container wurde mit Docker Run entnommen und ausgeführt

  • Verwaltete Tags und unterschiedliche Bildebenen

  • Vorbereitet für Produktionsumgebungen mit versionierten Images

Dieser Arbeitsablauf, der sich um Docker und .NET dreht, ist perfekt für die Erstellung skalierbarer, testbarer und gemeinsam nutzbarer Anwendungen.

Hero Worlddot related to Bereitstellen in einem Container und Docker Hub - Erstellen einer Beispiel-API in C# Kurs
Hero Affiliate related to Bereitstellen in einem Container und Docker Hub - Erstellen einer Beispiel-API in C# Kurs

Verdienen Sie mehr, indem Sie teilen, was Sie lieben

Erstellen Sie Inhalte für Entwickler, die mit .NET, C#, Java, Python oder Node.js arbeiten? Verwandeln Sie Ihr Fachwissen in ein zusätzliches Einkommen!

Iron Support Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an