Um eine .NET Core Anwendung in Docker zu hosten, bedarf es natürlich eines installierten .NET Core, einer App (im Falle dieses Beitrags existiert eine Web API auf Basis .NET Core) und natürlich Docker.
Für Tests am Desktop empfiehlt sich, die Docker Community Edition zu installieren.
Im nächsten Schritt muss dem .NET Core Projekt ein Dockerfile hinzugefügt werden. Dabei handelt es sich eine Datei mit Instruktionen, welches Basis-Image herangezogen werden soll, welche Dateien auf das neu zu erstellende Image gepackt werden sollen und einigen Informationen mehr.
Hier ein Beispiel für ein Dockerfile:
# Stage 1
FROM microsoft/aspnetcore-build AS builder
WORKDIR /source
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . .
RUN dotnet publish --output /app/ --configuration Release
# Build runtime image
FROM microsoft/aspnetcore
WORKDIR /app
COPY --from=builder /app .
EXPOSE 5000
ENTRYPOINT ["dotnet", "MeinDotnetCoreProjekt.dll"]
Im Docker-Hub stehen relevante Images von Microsoft bereit:
Von den Images gibt es unterschiedliche Ausprägungen mit unterschiedlichem Tooling. Darauf ist zu achten.
Program.cs anpassen
Standardmäßig läuft ASP.NET Core unter http://localhost:5000
. Das ist für Tests am eigenn Rechner in Ordnung. In einem Docker-Container würde dies jedoch bedeuten, dass nicht am öffentlichen Port gelauscht wird, Anfragen also nicht angenommen werden. Deswegen ist sicherzustellen, dass auf allen Interfaces gelauscht wird:
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseUrls("http://*:5000")
.Build();
Das wäre nun alles.
Docker Container erstellen
Zuerst müssen wir ein eigenes Image erstellen:
docker build -t UnsereDemoApp .
Der Aufruf sollte aus dem Verzeichnis vorgenommen werden, in dem auch das Dockerfile liegt. Dieses wird eingelesen, validiert und bei Erfolg das neue Image restellt.
Dieses muss mit unserem definierten Tag UnsereDemoApp
in der Liste der Images aufgeführt werden. Diese können mittels docker images
abgerufen werden.
Aus diesem Image kann nun ein neuer Container erstellt werden. Ein Container besitzt einen eindeutigen Namen. Bei keiner Angabe erstellt Docker einen Namen für uns.
docker run -d -p 5000:5000 UsereDemoApp
Zu beachten ist, dass mit der Option -d
der Container in einem Detached Modus läuft, d.h. wir erhalten keine Meldungen/Ausgabe. Durch -p 5000:5000
wird der lokale Port 5000 auf den Port 5000 des Containers gemappt. Deswegen kann am Host-Computer per http://localhost:5000
auf das Service im Container zugegriffen werden.
Ein entsprechender Zugriff auf einen vorhandenen Endpunkt sollte das gewünschte Ergebnis bringen.
Hilfreiche Befehle
Ausgabe der laufenden Container:
docker container
Einen Container stoppen
docker container stop [name]
EInen Container entfernen
docker container rm [name]
An einen Container attachen (und die Ausgabe konsumieren):
docker attach [name]
Die letzten angefallenen Meldungen ausgeben:
docker logs [name]
Viel Spaß bei der Verwendung von Docker und .NET Core.