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 --version1.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└── Dockerfile2. 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:latestDie 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.md3.4. Beispiel eines optimierten Dockerfile
FROM mcr.microsoft