Containerisierung von C#-Anwendungen mit der .NET CLI leicht gemacht
Container sind ein leistungsfähiges Werkzeug, aber für viele Entwickler kann die Idee, eine C#-Anwendung in einen Container zu packen, überwältigend sein. Das Einrichten einer Dockerdatei und die manuelle Handhabung von Abhängigkeiten kann kompliziert sein. Wie Tim Corey in seinem Video jedoch erklärt, vereinfacht die .NET CLI diesen Prozess und ermöglicht es Entwicklern, ihre Anwendungen zu containerisieren, ohne eine Dockerdatei zu benötigen.
In diesem Artikel werden wir einen tieferen Blick auf die Containerisierung einer C#-Anwendung werfen, indem wir Tims schrittweisen Ansatz aus seinem Video "Containerize Your C# Application Easily with the .NET CLI" verwenden Wenn wir Tims Anleitung folgen, werden wir verstehen, wie man eine .NET-Anwendung mühelos in einem Docker-Container veröffentlicht.
Einführung in .NET CLI for Containers
Zu Beginn des Videos erklärt Tim die Notwendigkeit der Containerisierung. Er hebt hervor, dass Container zwar ein großartiges Werkzeug sind, der Prozess der Einrichtung eines Dockerfiles und seiner korrekten Konfiguration jedoch komplex sein kann.
Anstatt ein Dockerfile manuell zu erstellen, stellt Tim einen einfacheren Ansatz vor, bei dem die .NET CLI verwendet wird. Diese Methode ermöglicht es Entwicklern, eine containerisierte Anwendung zu erstellen, ohne manuell eine Dockerdatei zu schreiben.
Tim stellt außerdem klar, dass dieses Video Teil seiner 10-minütigen Schulungsreihe ist, die sich auf schnelle und effektive Einführungen in technische Themen konzentriert.
Das Anwendungssetup
Tim beginnt mit einer minimalen Web-API-Anwendung als Beispiel. Die Anwendung enthält einen einzigen Endpunkt namens /messages, der einige Daten zurückgibt.
Um das Verhalten der Anwendung vor der Containerisierung zu demonstrieren, führt Tim sie lokal aus. Durch den Zugriff auf den /messages Endpunkt bestätigt er, dass es außerhalb eines Containers korrekt funktioniert.
Bevor er mit der Containerisierung fortfährt, überprüft er außerdem, dass:
- Docker ist installiert und läuft auf seinem Rechner.
- Zu Beginn gibt es keine vorhandenen Docker-Images oder -Container.
Dadurch wird sichergestellt, dass wir bei der Erstellung eines neuen Containers die Änderungen klar erkennen können.
Vorbereitung auf die Containerisierung
Um die Anwendung zu containerisieren, wechselt Tim in die Befehlszeile des Projektverzeichnisses. Anschließend führt er den folgenden Befehl aus:
dotnet publish -o:Linux -a:x64 -p:PublishProfile=DefaultContainer -c:Release
Tim schlüsselt jeden Teil des Befehls auf:
-o:Linux→ Veröffentlicht die Anwendung für einen auf Linux basierenden Container.-a:x64→ Gibt die Architektur als 64-Bit an.-p:PublishProfile=DefaultContainer→ Verwendet die Standardeinstellungen des Containers.-c:Release→ Veröffentlicht die App im Release-Modus für bessere Leistung.
Tim betont, dass Linux-Container gegenüber Windows-Containern bevorzugt werden, da Windows-Container hauptsächlich als Brücke for .NET Framework-Anwendungen dienen.
Veröffentlichen und Erstellen eines Containers
Sobald der Veröffentlichungsbefehl ausgeführt wird, erklärt Tim, dass die .NET CLI automatisch die erforderlichen Konfigurationen ermittelt und alles in einen Container packt. Er weist darauf hin, dass:
- Ein Dockerfile ist bei dieser Methode nicht erforderlich.
- Der Prozess erstellt die Anwendung und containerisiert sie in einem Schritt.
- Das verwendete Basis-Image ist der .NET 8-Laufzeitcontainer von Microsoft.
Nach der Veröffentlichung überprüft er Docker Desktop und bestätigt, dass das neue Container-Image, background-demo, erstellt wurde. Die ursprüngliche Containergröße beträgt 221 MB.
Tim versichert den Betrachtern, dass dieser Umfang später reduziert werden kann.
Ausführen des Containers
Um die containerisierte Anwendung zu testen, startet Tim den Container direkt von Docker Desktop aus. Da es noch keine laufenden Container gibt, klickt er auf "Ausführen" und legt eine optionale Einstellung fest:
- Er ordnet den internen Port des Containers (zufällig zugewiesen) dem Port 8080 auf dem Host-Rechner zu.
Nach dem Starten greift er über einen Webbrowser auf die Anwendung zu. Zunächst führt der Zugriff auf die Root-URL zu einem 404-Fehler, aber beim Navigieren zu /messages werden die erwarteten Daten erfolgreich angezeigt.
Tim hebt einen wichtigen Punkt hervor:
- Die Anwendung läuft innerhalb des Containers in UTC-Zeit, die von der Zeitzone des lokalen Rechners abweichen kann.
Er weist auch darauf hin, dass die Swagger UI standardmäßig deaktiviert ist, da die Anwendung im Release-Modus veröffentlicht wurde.
Optimierung der Containergröße
Zu diesem Zeitpunkt beträgt die Standardgröße des Containers 221 MB, was Tim als ziemlich groß einschätzt. Um die Größe zu reduzieren, führt er ein helleres Basisbild ein.
Durch das Ändern der Program.cs Datei stellt er die Container-Familie auf jammy-chiseled ein, ein kleineres, auf Ubuntu basierendes Image:
builder.Services.Configure<ContainerOptions>(options => options.ContainerFamily = "jammy-chiseled");
builder.Services.Configure<ContainerOptions>(options => options.ContainerFamily = "jammy-chiseled");
Anschließend führt er den Veröffentlichungsbefehl erneut aus und überprüft nach dem Neuaufbau des Containers erneut die Größe des Images.
Die neue Bildgröße beträgt 113 MB - eine Reduzierung um etwa 100 MB! Trotz des geringeren Umfangs funktioniert die Anwendung identisch.
Löschen und Wiedererstellen von Containern
Tim demonstriert das Löschen des Containers, um den Arbeitsbereich aufzuräumen. Das Docker-Image bleibt jedoch verfügbar, sodass der Container bei Bedarf neu erstellt werden kann.
Er betont, dass der Container, sobald er gebaut ist, auch genutzt werden kann:
- Lokale Ausführung für Entwicklung und Tests.
- Pushen zu einer Container-Registry wie Docker Hub oder Azure Container Registry.
- Sie dient als Grundlage für eine in der Cloud bereitgestellte Webanwendung.
Fazit und Schlussgedanken
Tim schließt das Video ab, indem er die wichtigsten Vorteile der Verwendung der .NET CLI für die Containerisierung hervorhebt:
- Eine Dockerdatei ist nicht erforderlich - die .NET CLI erledigt alles automatisch.
- Schneller und einfacher Prozess - Mit nur einem Befehl kann eine Anwendung containerisiert werden.
- Kleinere, optimierte Images – Die Verwendung von
jammy-chiseledreduziert die Containergröße. - Nahtlose Bereitstellung - Der Container kann auf verschiedene Cloud-Dienste übertragen werden.
Abschließende Gedanken
Tims Ansatz zur Containerisierung von C#-Anwendungen mit der .NET CLI ist einfach, schnell und effektiv. Mit seiner Methode können Entwickler Container erstellen und optimieren, ohne dass sie umfangreiche Docker-Kenntnisse benötigen.
Durch den Einsatz von Linux-Containern, optimierten Basis-Images und optimierten Veröffentlichungsbefehlen ermöglicht diese Technik Entwicklern eine effiziente Containerisierung ihrer Anwendungen mit minimalem Aufwand.
Wenn Sie tiefer eintauchen möchten, sollten Sie sich das Video von Tim Corey ansehen. Sie bietet eine klare, schrittweise Anleitung für den gesamten Prozess.
