Blog

Plattformübergreifende Anwendung mit .NET Core, Jenkins & Docker

Aktualisiert Oktober 21, 2025
6 Minuten

In diesem Artikel werden wir eine .NET Core-Anwendung und ihr Docker-Image mit Jenkins erstellen. Alle Technologien sind mit Windows, Linux und Mac OS kompatibel. Beginnen wir mit ein paar Worten zu jeder von ihnen.

.NET Core

Laut der Microsoft-Website:

.NET Core ist ein schlankes und kompatibles Framework für die Entwicklung von Web- und Cloud-Anwendungen

Einfach ausgedrückt ist .NET Core eine plattformübergreifende Open-Source-Implementierung des .NET Framework. Es enthält die Kernfunktionen des .NET Framework, einschließlich Laufzeitumgebung, Compiler, Bibliotheken und zusätzliche Toolkomponenten, die eine Vielzahl von Betriebssystemen unterstützen.

Jenkins

Jenkins ist eine Open-Source-Anwendung für die kontinuierliche Integration zum Erstellen, Testen und Berichten über Änderungen in einer größeren Codebasis in Echtzeit. Die Software ermöglicht es Entwicklern, Fehler schnell zu finden und zu beheben und das Testen ihrer Builds zu automatisieren. Sie unterstützt Versionskontrollsysteme wie Git, Subversion und viele mehr.

Docker

Docker ist ein Open-Source-Toolset, das die sogenannten "Container" bereitstellt - Anwendungen, die sicher in einer isolierten Umgebung ausgeführt werden. Ein Container umschließt eine Anwendung mit all ihren Abhängigkeiten: Binärdateien und Konfigurationsdateien, Systemtools, Bibliotheken - alles, was auf einem Zielserver installiert werden muss. Er enthält auch Teile eines Betriebssystems, die für die Ausführung eines Containers erforderlich sind.

Um die klassische virtuelle Maschine und Docker-Images zu vergleichen, sehen wir uns die folgende Abbildung an:

klassische virtuelle Maschine und Docker-Images vergleichen

Docker-Container sind ähnlich wie virtuelle Maschinen, aber ohne den Overhead. Eine normale virtuelle Maschine benötigt Binärdateien und Bibliotheken sowie ein komplettes Gastbetriebssystem mit eigener Speicherverwaltung für jede Anwendung. All das kann sich auf viele GB belaufen und benötigt Zeit zum Laden. Container, die auf der Docker Engine laufen, teilen sich den Kernel mit anderen Containern, sind aber isolierte Prozesse auf dem Host-Betriebssystem. Docker-Container sind daher kleiner, leichter und schneller. Außerdem sind sie im Vergleich zu VMs besser skalierbar.

Integration

Ziel ist es, einen automatisierten Prozess für die Bereitstellung der neuen Version der Anwendung im Docker-Images-Repository zu schaffen, der mit dem Übertragen von Änderungen in das Repository des Versionskontrollsystems (in diesem Fall Github) beginnt. Für dieses Projekt werden wir auch Docker Hub verwenden, ein Cloud-basiertes Repository für Docker-Images. In Kürze sollte Jenkins das Github-Repository jede Stunde auf Commits überprüfen. Wenn es welche findet, kompiliert es die Quellen, erstellt ein Image und sendet es an Docker Hub.

Unsere Zielplattform ist Ubuntu 14.04, aber auch Windows oder Mac OS können verwendet werden. Bevor Sie beginnen, sollten auch .NET Core, Jenkins und Docker installiert werden. Nützliche Links finden Sie in einem Abschnitt am Ende dieser Seite.

Fangen wir von vorne an und erstellen eine Standard-ASP.NET Core MVC-Lösung in Visual Studio 2015 - es geht genauso weiter wie in früheren MVC-Versionen.

Erstellen einer ASP.NET Core MVC-Standardlösung in Visual Studio 2015

Die Struktur des Projekts ist ähnlich, aber ein wesentlicher Unterschied ist die Hauptkonfigurationsdatei - project.json (nicht web.config wie zuvor). Es gibt einige Abschnitte, aber lassen Sie uns einen Blick auf den Abschnitt "frameworks" werfen:

  "Frameworks": {
  "netcoreapp1.0": {
  ...  
  }
  }

Das Ziel-Framework für ASP.NET Core MVC-Projekte ist standardmäßig .NET Core 1.0. Weitere Informationen über TFM (Target Framework Monikers) finden Sie in diesem Artikel im MSDN Blog.

Die ASP.NET Core MVC-Lösung kann problemlos in Docker integriert werden. Die einzige Voraussetzung ist, die Erweiterung für Docker in Visual Studio 2015 zu installieren und die Docker-Unterstützung hinzuzufügen, wie in der Abbildung unten zu sehen ist.

Installieren Sie die Erweiterung für Docker in Visual Studio 2015 und fügen Sie die Docker-Unterstützung hinzu

Docker-Images werden anhand von Anweisungen aus dem Dockerfile erstellt, einer Konfigurationsdatei, die Befehle enthält, die für die Zusammenstellung eines Images erforderlich sind. Ein Beispiel für ein Dockerfile sieht so aus:

FROM microsoft/dotnet:latest
KOPIEREN . /app
WORKDIR /app
EXPOSE 5000/tcp
ENTRYPOINT ["dotnet", "run"]

Hier sehen Sie, was jede dieser Anweisungen bewirkt:

  • FROM teilt Docker mit, dass wir unser Image auf dem bestehenden Image (microsoft/dotnet:latest) aufbauen wollen, das bereits alle Abhängigkeiten für die Ausführung von .NET Core unter Linux enthält
  • COPY und WORKDIR kopieren den Inhalt des aktuellen Verzeichnisses in ein neues Verzeichnis innerhalb des Containers mit dem Namen app und setzen dieses zum Arbeitsverzeichnis für die nachfolgenden Anweisungen
  • EXPOSE teilt Docker mit, dass der Container auf dem angegebenen Netzwerkport lauscht - 5000 (der Standardport für ASP.NET)
  • ENTRYPOINT gibt den Befehl an, der beim Starten des Containers ausgeführt werden soll. In diesem Fall ist es dotnet run

Die vollständige Dokumentation zur Konfiguration von Dockerfile finden Sie unter diesem Link.

Der nächste Schritt ist die Konfiguration von Jenkins, wofür die Installation von Github- und Docker-Plugins erforderlich ist (siehe Abschnitt Plugin Manager). Wir werden das Github-Repository nach neuen Commits abfragen und, falls es welche gibt, ein Docker-Image erstellen und es in das Docker Hub Repository pushen.

Für die Nutzung von Docker Hub müssen Sie unter diesem Link ein Konto anlegen (es ist kostenlos).

Lassen Sie uns einen neuen Job anlegen und die URL auf unser Versionskontrollsystem-Repository setzen:

Jenkins Jenkins - Quellcode-Verwaltung

Dann planen Sie unseren Job so, dass er das Github-Repository abfragt, z.B. einmal pro Stunde:

Jenkins - Build-Auslöser

Der letzte Schritt besteht darin, ein Shell-Skript zum Erstellen von Schritten auszuführen. Hier ist das Beispielskript:

dotnet wiederherstellen
dotnet publish -c release
docker build -t dockerhubuser/simplecoreapp:v0.${BUILD_NUMBER}  .
docker login -u dockerhubuser -p dockerhubpassword -e user@domain.com
docker push dockerhubuser/simplecoreapp:v0.${BUILD_NUMBER}

Und was jede dieser Anweisungen bewirkt:

  • dotnet restore - stellt die in der Datei project.json angegebenen Abhängigkeiten aus NuGet wieder her
  • dotnet publish - erstellt und packt die Anwendung und alle ihre Abhängigkeiten in einen Ordner und bereitet sie so für die Veröffentlichung vor
  • docker build - erstellt ein Image aus einer Dockerdatei. Jenkins ersetzt die Variable ${BUILD_NUMBER} durch die Nummer des aktuellen Builds
  • docker login - meldet sich mit den Anmeldedaten bei einem Docker Hub an
  • docker push - schiebt ein Image auf Docker Hub

Der Auftrag wird automatisch ausgelöst, nachdem Änderungen in das Github-Repository übertragen wurden. Der vorgestellte Prozess kann weiterentwickelt werden, z.B. um Unit Tests oder andere Funktionalitäten zu verwenden.

Zusammenfassung

Was wir erreicht haben, ist ein vollständig automatisierter Prozess der Bereitstellung von Docker-Images der Anwendung im Images-Repository. Es kann von externen Tools verwaltet und verwendet werden, um eine Container-zentrierte Infrastruktur in einer Cloud Computing-Plattform bereitzustellen.

Dieser Artikel ist der erste von zwei Artikeln in diesem Blog, in dem der Aufbau einer CI-Pipeline mit Technologien wie .NET Core, Jenkins, Docker, Kubernetes und Spinnaker beschrieben wird. Weitere Informationen finden Sie im zweiten Artikel, der die Continuous Integration Pipeline beschreibt, demnächst in diesem Blog. Bleiben Sie dran!

Nützliche Links

Contact

Let’s discuss how we can support your journey.