ASP.NET Core Anwendung in einen Docker Container verpacken
In diesem Tutorial zeige ich wie man eine ASP.NET Core Anwendung in einen Docker Container verpacken kann. Damit wird das eigene Service als Container Plattform unabhängig nutzbar. Ob Azure Cloud, AWS Cloud oder einem Linux Server mit Docker – das eigene Microservice kann man ohne eine Änderung überall verwenden.
ASP.NET Core Anwendung in einen Docker Container verpacken
Alles was man benötigt ist ein Dockerfile und ein lokal installiertes Docker. Auf meinem Entwicklungsrechner habe ich Docker Desktop installiert. Über ein Dockerfile wird die App in einen Docker Container verwandelt den man direkt lokal starten kann zum Testen. Wenn man wie ich unter Visual Studio eine einfache Web App erstellt hat braucht man sich um fast nichts kümmern, denn Visual Studio 2019 kann mittlerweile auch automatisch das passende Dockerfile erzeugen.
Ausgangssituation
In diesem Tutorial werde ich meine zuletzt erstellte PostgreSQLConnect ASP.NET Applikation in einen Docker Container packen. Zur Erinnerung, das die Standard WeatherForecast App die man bekommt wenn man unter Visual Studio 2019 eine neue ASP.NET Applikation erstellt. Ich habe diese derart verändert, dass die Daten einer PostgreSQL Datenbank ausgegeben werden. Diese läuft bereits als Docker Container (PostgreSQL Docker Container). Ziel ist nun ein großes Docker-Compose Skript, welches neben der Datenbank und der pgAdmin Software auch die ASP.NET Applikation als Container erzeugt startet. Damit hat man einen idealen Ausgangspunkt um eine eigene Webapplikation mit Datenbankunterstützung für die Cloud zu schreiben.
Dockerize
Bei einem Projekt kann man über einen Rechtsklick im Kontextmenü unter „Hinzufügen“ die Option „Docker-Unterstützung…“ wählen.
Im nächsten Dialog muss man das Zielbetriebssystem auswählen. Aktuell stehen Linux und Windows zur Auswahl. Da ich meine Microservices Applikation auf meinem Linux Server mit Docker laufen lassen möchte wähle ich die Standardantwort Linux.
Es wird nun automatisch folgendes Dockerfile erzeugt:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build WORKDIR /src COPY ["PostgreSQLConnect/PostgreSQLConnect.csproj", "PostgreSQLConnect/"] RUN dotnet restore "PostgreSQLConnect/PostgreSQLConnect.csproj" COPY . . WORKDIR "/src/PostgreSQLConnect" RUN dotnet build "PostgreSQLConnect.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "PostgreSQLConnect.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "PostgreSQLConnect.dll"]
Selbst wenn man gar keine Ahnung von Docker hat lässt sich das Dockerfile lesen. Was passiert da? Im ersten Block wird das Basisimage gewählt (und in der Ausführung heruntergeladen). In diesem Fall ein von Microsoft bereitgestelltes schlankes ASP.NET Core Image. Das bedeutet das Image ist in der Lage ASP.NET Core Applikationen auszuführen. Im nächsten Block wird der Source Code mit der Projektdatei in das Image kopiert und im dritten Block daraus eine App erstellt. Im letzten Block wird noch das Ergebnis des builds in den Ausführungsordner kopiert und im Endpunkt bestimmt was ausgeführt werden soll – in diesem Fall die App PostgreSQLConnect.
Ausführen /Debuggen
Wählt man in Visual Studio für die Ausführung / Debuggen statt den voreingestellten IIS Express nun Docker aus, dann wird das Dockerfile gebaut und der erstellte Container direkt mit der laufenden Docker Instanz gehostet.
Nach erfolgreichem Deployment wird automatisch der Browser mit dem Pfad des Endpunkts des Containers geöffnet und man bekommt dessen Ausgabe präsentiert.
Problem
Die ASP.NET Applikation leitet HTTP Anfragen aktuell automatisch auf HTTPS weiter. Das hat in den Tests nicht funktioniert. Damit das Problem nicht auftritt muss man die Zeile
//app.UseHttpsRedirection();
In der Startup.cs Datei auskommentieren wie hier gezeigt. Den korrekten Source Code findet man auf GitHub.
Fazit
Ich habe gezeigt wie einfach man unter Visual Studio eine ASP.NET .NET Core Anwendung in einen Docker Container verwandelt. Visual Studio bietet den nötigen Komfort um recht einfach und schnell Microservices zu bauen und zu deployen.