Docker und C#: Containerisierung von .NET-Anwendungen von Grund auf

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum C#-Anwendungen containerisieren?

Moderne C#-Entwicklung (.NET) kommt selten ohne Docker aus. Die Containerisierung ermöglicht es, die Anwendung zusammen mit allen Abhängigkeiten, der Laufzeitumgebung und Konfigurationen in ein isoliertes Image zu packen. Dies löst das Problem "Auf meinem Rechner funktioniert es" und vereinfacht das Deployment auf Server, in die Cloud oder auf die lokale Infrastruktur.

In diesem Artikel werden wir durchgehen, wie man ein Docker-Image für eine .NET-Anwendung (ASP.NET Core oder Konsolenanwendung) erstellt, dessen Größe optimiert, docker-compose für die Verbindung mit einer Datenbank verwendet und CI/CD einrichtet. Alle Codebeispiele sind in C# geschrieben und einsatzbereit.



1. Grundlagen von Docker für .NET-Entwickler

Docker ist eine Plattform zum Ausführen von Anwendungen in Containern. Ein Container enthält alles Notwendige: Code, Laufzeitumgebung (Runtime), Bibliotheken und Einstellungen. Für .NET ist dies besonders praktisch, da Sie das .NET SDK nicht auf dem Server installieren müssen – Docker reicht aus.



1.1. Docker installieren

Laden Sie Docker Desktop von der offiziellen Website herunter und installieren Sie es. Überprüfen Sie nach der Installation die Version:

docker --version


1.2. Projektstruktur von .NET

Angenommen, wir haben eine einfache ASP.NET Core Web API-Anwendung. Die Ordnerstruktur:

MyApp/├── MyApp.csproj├── Program.cs├── Controllers/│   └── WeatherController.cs└── Dockerfile


2. Erstellen eines Dockerfile für eine .NET-Anwendung

Ein Dockerfile ist eine Anleitung zum Erstellen eines Images. Für .NET wird empfohlen, einen Multi-Stage-Build zu verwenden, um die Build- und Ausführungsphasen zu trennen. Dies reduziert die endgültige Image-Größe.



2.1. Basis-Dockerfile

Erstellen Sie eine Datei Dockerfile im Projektstammverzeichnis:

# Build-PhaseFROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /srcCOPY ["MyApp.csproj", "."]RUN dotnet restoreCOPY . .RUN dotnet publish -c Release -o /app/publish

# AusführungsphaseFROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtimeWORKDIR /appCOPY --from=build /app/publish .EXPOSE 80ENTRYPOINT ["dotnet", "MyApp.dll"]

Erläuterungen:

  • FROM ... AS build – Verwenden des SDK zur Kompilierung.
  • COPY ["MyApp.csproj", "."] – Nur die Projektdatei kopieren, um den Restore zu cachen.
  • RUN dotnet restore – NuGet-Pakete wiederherstellen.
  • RUN dotnet publish – Release-Version erstellen.
  • FROM ... AS runtime – Minimales aspnet-Image verwenden.
  • EXPOSE 80 – Port 80 freigeben.
  • ENTRYPOINT – Startbefehl der Anwendung.


2.2. Image erstellen und ausführen

Führen Sie die folgenden Befehle im Terminal aus dem Projektordner aus:

docker build -t myapp:latest .docker run -d -p 8080:80 --name myapp_container myapp:latest

Die Anwendung ist nun unter http://localhost:8080 erreichbar.



3. Optimierung von Docker-Images für .NET

Große Images verlangsamen das Deployment und verbrauchen Ressourcen. Hier sind einige Praktiken zur Optimierung:



3.1. Verwenden Sie .NET 8 (oder neuer)

Neuere .NET-Versionen haben integrierte Unterstützung für AOT-Kompilierung (Ahead-of-Time), was die Runtime-Größe reduziert. Für ASP.NET Core verwenden Sie das Image aspnet:8.0.



3.2. Minimieren Sie die Layer

Jede RUN- oder COPY-Anweisung erstellt einen Layer. Fassen Sie Befehle zusammen:

RUN apt-get update && apt-get install -y \    curl \    && rm -rf /var/lib/apt/lists/*


3.3. Verwenden Sie .dockerignore

Erstellen Sie eine Datei .dockerignore im Projektstammverzeichnis, um unnötige Dateien auszuschließen:

bin/obj/.vs/*.user.git/README.md


3.4. Beispiel eines optimierten Dockerfile

FROM mcr.microsoft                

Blogs

Buchempfehlungen