Warum Docker und was ist es?
Docker entwickelt sich zum De-facto-Standard in der Container-Branche, und seine Beliebtheit nimmt von Tag zu Tag zu. Nach Angaben von Docker wurden über 3,5 Millionen Anwendungen mithilfe der Docker-Technologie in Containern platziert und über 37 Milliarden containerisierte Anwendungen heruntergeladen. Sie werden überrascht sein, wie viele beliebte Technologien in Docker laufen: NGINX, Redis, Postgres, Elasticsearch, MongoDB, MySQL, RabbitMQ – und das ist noch nicht einmal eine vollständige Liste!
Natürlich kann man auch ohne Docker arbeiten. Viele Anwendungen laufen erfolgreich ohne Docker und alles scheint gut zu laufen. In der Regel ist die Situation hinter den Kulissen jedoch ganz anders. Wenn Sie ein Entwickler oder ein DevOps sind, wissen Sie, dass es nicht so einfach und gut ist, wie es auf den ersten Blick scheint. Wie oft haben Sie schon an einigen Funktionen gearbeitet und alles lief auf Ihrem lokalen Rechner großartig, und gleich nach der Bereitstellung auf dem Staging- oder Produktionssystem stellen Sie fest, dass etwas schief gelaufen ist. Mit Docker werden Sie nie von solchen Problemen hören, denn die gepackte Docker-Anwendung kann in jeder unterstützten Docker-Umgebung ausgeführt werden und läuft auf allen Bereitstellungszielen so, wie sie vorgesehen ist. Sie können die Anwendung auf Ihrem Rechner entwickeln und debuggen und sie dann auf einem anderen Rechner mit derselben Umgebung bereitstellen – garantiert.
Hier bei Redwerk verwenden wir Docker in letzter Zeit recht häufig, sowohl für interne als auch für kundenspezifische Projekte. Dabei haben wir aus eigener Erfahrung gelernt, dass die Verwendung von Docker das Leben einfacher machen kann.
Mit Hilfe von Docker konnten wir die Ausfallzeiten unserer Test-Sites während des Deployments erfolgreich reduzieren, da Docker in der Lage ist, den aktuellen Container zu verwenden, während ein neuer Build erstellt wird. Dies ist in verschiedenen Fällen sehr hilfreich: Ihr QA-Team muss nicht warten, bis Sie neue Änderungen bereitstellen; Ihre Kunden werden nicht einmal merken, dass etwas bereitgestellt wurde, während sie Ihre Website nutzten. In der modernen Welt ist dies ein sehr wichtiges Thema.
Docker ermöglicht es, eine Anwendung oder einen Dienst, seine Abhängigkeiten und die Konfiguration als portables, autarkes Container-Image zu verpacken, das in der Cloud oder vor Ort ausgeführt werden kann. Kurz gesagt, Container bieten die Vorteile der Isolierung, Portabilität, Agilität, Skalierbarkeit und Kontrolle über den gesamten Lebenszyklus einer Anwendung. Sie ermöglichen es uns, unsere Anwendungen mit all ihren Abhängigkeiten in einem Docker-Container zu verpacken und sie bequem in Test- oder Arbeitsumgebungen einzusetzen. Es vereinfacht unseren Entwicklungsprozess, erleichtert den Übergang der Projektarbeit auf eine andere Maschine und ermöglicht es, die Zeit der Aufnahme neuer Entwickler in ein Projekt zu reduzieren.
Docker klingt manchmal wie eine virtuelle Maschine, und es gibt viele Ähnlichkeiten zwischen den beiden. Insbesondere ermöglichen beide die Erstellung eines Images und dessen Skalierung auf einige wenige Instanzen, die sicher und isoliert voneinander arbeiten. Container haben jedoch weitere Vorteile, die sie für die Erstellung und Bereitstellung von Anwendungen besser geeignet machen.
Im Gegensatz zu virtuellen Maschinen teilen Container den Betriebssystemkern und alle Bibliotheken miteinander, sie benötigen kein vollständiges Gastbetriebssystem und laufen als isolierte Prozesse (eine Ausnahme sind Hyper-V-Container). Aus diesem Grund lassen sie sich leicht bereitstellen und starten sehr schnell, was für die Produktion sehr wichtig ist. Außerdem sind Container leichter als Images virtueller Maschinen. Containerisierte Anwendungen lassen sich leicht skalieren, da Container schnell zu einer Umgebung hinzugefügt oder aus ihr entfernt werden können. Es ist so, als würde man einen Prozess wie eine Webanwendung oder einen Dienst instanziieren. Entwickler können verschiedene Entwicklungsumgebungen verwenden: auf Mac, Linux können Sie Linux-Images verwenden, auf Windows entweder Linux oder Windows. Die Konsistenz von Containern wird dadurch nicht beeinträchtigt, so dass sie besser portabel sind.
Virtuelle Maschinen spielen nach wie vor eine wichtige Rolle, da sie sehr häufig für die Ausführung von Containern unter virtuellen Maschinen verwendet werden – auch bei der Nutzung der Cloud-Infrastruktur von Anbietern wie Amazon, Google und Microsoft.
Docker-Terminologie
Dies ist eine kurze Liste von Docker-Begriffen, die benötigt werden, um einige Details zu verstehen und um tiefer in Docker einzusteigen.
Container-Image: Docker-Images sind die Grundlage von Containern. Ein Image ist eine geordnete Sammlung von Root-Dateisystem-Änderungen und den entsprechenden Ausführungsparametern für die Verwendung innerhalb einer Container-Laufzeit (mit anderen Worten: alle Abhängigkeiten plus Bereitstellungs- und Ausführungskonfiguration). Ein Image enthält typischerweise eine Vereinigung von übereinander gestapelten Dateisystemen. Ein Image ist unveränderlich und hat keinen Zustand.
Container: ist eine Laufzeitinstanz eines Docker-Images. Er besteht aus einem Image, einer Ausführungsumgebung und einem Standardsatz von Anweisungen. Nach Angaben von Docker ist das Konzept den Schiffscontainern entlehnt, die einen Standard für den weltweiten Versand von Waren definieren. Docker definiert einen Standard für den Versand von Software.
Tag: ein Etikett, das Sie auf Images anwenden können, damit verschiedene Images oder Versionen in einem Repository voneinander unterschieden werden können.
Dockerfile: ein Textdokument, das alle Befehle enthält, die Sie normalerweise manuell ausführen würden, um ein Docker-Image zu erstellen. Images können mit Hilfe dieser Anweisungen automatisch von Docker erstellt werden.
Repository: ist ein Satz von Docker-Images. Ein Repository kann gemeinsam genutzt werden, indem es auf einen Registry-Server gepusht wird. Es kann mehrere Varianten eines bestimmten Images enthalten (Plattformvarianten, schwerere oder leichtere Varianten eines Images).
Docker Hub: ist eine zentralisierte Ressource für die Arbeit mit Docker und seinen Komponenten. Es bietet Image-Hosting, Benutzerauthentifizierung, automatisierte Image-Builds und Workflow-Tools (wie Build-Trigger und Webhooks), Integration mit GitHub und Bitbucket.
Kitematic: eine Legacy-GUI, die mit der Docker Toolbox gebündelt ist, um Docker-Container zu verwalten.
Cluster: eine Sammlung von Docker-Hosts, die als ein einziger dargestellt werden. Kann mit Docker Swarm, Mesosphere DC/OS, Kubernetes und Azure Service Fabric erstellt werden.
Orchestrator: Ein Tool, das die Verwaltung von Clustern und Docker-Hosts vereinfacht. Orchestratoren umfassen eine Reihe von Funktionen, die die Verwaltung von Images, Containern und Hosts, die Vernetzung von Containern, Konfigurationen, Lastausgleich, Service Discovery, Hochverfügbarkeit und mehr ermöglichen. In der Regel handelt es sich bei den Orchestrator-Produkten um dieselben Produkte, die auch die Cluster-Infrastruktur bereitstellen.
.NET Core vs. .NET Framework für Docker-Container
Es gibt zwei unterstützte Frameworks für die Erstellung serverseitiger containerisierter Docker-Anwendungen mit .NET: .NET Framework und .NET Core. Es gibt grundlegende Unterschiede zwischen ihnen, und die Antwort auf die Frage „Welches Framework sollte verwendet werden?“ hängt davon ab, was Sie erreichen wollen. Lassen Sie uns also darüber sprechen, was zu wählen ist – .NET Core oder .NET Framework für Docker-Container.
Wann sollte .NET Core für Docker-Container verwendet werden?
Die schnellste Antwort wird auf den oben genannten Vorteilen basieren. Sie sollten sich natürlich für .NET Core entscheiden, wenn Sie eine plattformübergreifende, schnelle und leichtgewichtige Plattform benötigen und Ihre Anwendungsarchitektur auf Microservices basiert. Aber lassen Sie uns in die Details eintauchen.
Der erste Punkt ist also, dass Sie .NET Core verwenden sollten, wenn Ihr Ziel eine Anwendung ist, die auf mehreren Plattformen ausgeführt werden kann. Wenn Sie Serveranwendungen mit Linux- oder Windows-Container-Images bereitstellen müssen, liegt Ihre Wahl auf der Hand.
Zweitens, wenn Ihr Ziel die Erstellung und Bereitstellung von Microservices auf Containern ist – Ihre bevorzugte Wahl ist .NET Core. Und wieder kann dies durch die Leichtigkeit der Plattform erklärt werden. Ein Microservice soll so klein wie möglich sein: Er soll beim Hochfahren leicht sein, einen kleinen Footprint haben, einen kleinen Bounded Context haben, einen kleinen Bereich von Belangen repräsentieren und schnell starten und stoppen können. Um diese Anforderungen zu erfüllen, sollten Sie kleine und schnell zu instanzierende Container-Images wie das .NET Core Container-Image verwenden. Wenn Sie dagegen .NET Framework für einen Container verwenden möchten, müssen Sie Ihr Image nur auf dem Windows Server Core-Image aufbauen, das viel schwerer ist als die Windows Nano Server- oder Linux-Images, die Sie für .NET Core verwenden.
Drittens, wenn es für Sie wichtig ist, dass die Pakete regelmäßig aktualisiert werden. Da Ihr Projekt regelmäßig aktualisiert wird, spart das Geld und senkt auch die Risiken, daher spielt dieser Punkt eine entscheidende Rolle. .NET Core bietet die Möglichkeit, verschiedene Versionen der Laufzeitumgebung auf demselben Rechner zu installieren. Dieser Vorteil ist besonders wichtig für Server oder VMs, die keine Container verwenden, da Container die für die Anwendung benötigten Versionen von .NET isolieren. Natürlich nur, wenn sie mit dem zugrunde liegenden Betriebssystem kompatibel sind.
Zu guter Letzt, wenn Sie eine Container-basierte Website haben, wäre Ihre beste Wahl .NET Core und ASP.NET Core für den Technologie-Stack, um die bestmögliche Dichte, Granularität und Leistung für Ihr System zu erhalten. ASP.NET Core ist bis zu zehnmal schneller als ASP.NET im traditionellen .NET Framework. Und, um noch einmal auf Microservices-Architekturen zurückzukommen, für diese ist es besonders relevant. Wenn Sie Hunderte von Microservices (Containern) betreiben oder planen, deren Anzahl in Zukunft zu erhöhen, können Sie mit ASP.NET Core-Images (basierend auf der .NET Core-Laufzeitumgebung) auf Linux oder Windows Nano Ihr System mit einer viel geringeren Anzahl von Servern oder VMs betreiben und letztlich Kosten für Infrastruktur und Hosting sparen.
Wann sollte .NET Framework für Docker-Container verwendet werden?
.NET Core hat viele Vorteile, aber trotzdem ist .NET Framework für viele bestehende Szenarien immer noch eine gute Wahl.
Bestimmte NuGet-Pakete benötigen Windows zur Ausführung und unterstützen möglicherweise .NET Core nicht. Und trotz der Tatsache, dass Bibliotheken von Drittanbietern schnell den .NET-Standard annehmen, der die gemeinsame Nutzung von Code in allen .NET-Varianten, einschließlich .NET Core, ermöglicht, besteht dieses Problem weiterhin. Wenn diese Pakete für Ihre Anwendung kritisch sind und dringend benötigt werden, müssen Sie .NET Framework auf Windows Containern verwenden. Für einige Pakete ist das Problem bereits gelöst, da das Windows Compatibility Pack kürzlich veröffentlicht wurde, um die für .NET Standard 2.0 unter Windows verfügbare API-Oberfläche zu erweitern. Mit diesem Pack kann der meiste vorhandene Code mit wenigen oder gar keinen Änderungen zu .NET Standard 2.x rekompiliert werden, um unter Windows zu laufen. Es besteht jedoch immer noch die Möglichkeit, dass genau Ihr Paket nicht kompatibel ist, und in dieser Situation ist Ihre Wahl definitiv .NET Framework.
Einige .NET Framework-Technologien sind in der aktuellen Version von .NET Core (Version 2.1 zum Zeitpunkt der Erstellung dieses Artikels) nicht verfügbar. Einige von ihnen werden in späteren Versionen verfügbar sein, aber andere werden vielleicht nie verfügbar sein. Hier ist die offizielle Liste der häufigsten Technologien, die nicht in .NET Core von Microsoft zu finden sind:
- ASP.NET Web Forms-Anwendungen: ASP.NET Web Forms sind nur im .NET Framework verfügbar und ASP.NET Core kann nicht für sie verwendet werden. Es gibt keine Pläne, ASP.NET Web Forms in .NET Core zu integrieren.
- ASP.NET Web Pages-Anwendungen: Sie sind nicht in ASP.NET Core enthalten. ASP.NET Core Razor Pages haben viele Ähnlichkeiten mit Web Pages.
- WCF-Dienste-Implementierung. Auch wenn es eine WCF-Client-Bibliothek gibt, um WCF-Dienste von .NET Core zu nutzen, ist die WCF-Serverimplementierung derzeit nur im .NET Framework verfügbar. Dieses Szenario ist nicht Teil des aktuellen Plans für .NET Core, aber es wird für die Zukunft in Betracht gezogen.
- Workflow-bezogene Dienste: Windows Workflow Foundation, Workflow Services (WCF + WF in einem einzigen Dienst) und WCF Data Services sind nur im .NET Framework verfügbar. Es gibt keine Pläne, sie in .NET Core zu integrieren.
- Sprachunterstützung: Visual Basic und F# werden derzeit in .NET Core unterstützt, aber nicht für alle Projekttypen. Beide werden (zum Zeitpunkt der Erstellung dieses Artikels) für die Konsolenanwendung, die Klassenbibliothek classlib, das Unit-Test-Projekt mstest und das xUnit-Test-Projekt unterstützt. Und F# wird auch für ASP.NET Core empty, ASP.NET Core Web App (Model-View-Controller) und ASP.NET Core Web API unterstützt. Alle anderen werden nicht unterstützt.
Wenn Sie ein stabiles Projekt haben, das nicht erweitert werden muss und keine Probleme aufweist, müssen Sie Ihr Projekt natürlich nicht auf .NET Core migrieren. Ein empfohlener Ansatz ist die Verwendung von .NET Core, wenn Sie eine bestehende Anwendung erweitern, z. B. durch das Schreiben eines neuen Dienstes in ASP.NET Core. Sie könnten Docker-Container nur zur Vereinfachung der Bereitstellung verwenden. Container bieten zum Beispiel besser isolierte Testumgebungen und können auch Bereitstellungsprobleme beseitigen, die durch fehlende Abhängigkeiten verursacht werden, wenn Sie in eine Produktionsumgebung wechseln. In solchen Fällen ist es sinnvoll, Docker und Windows-Container für Ihre aktuellen .NET Framework-Anwendungen zu verwenden.
Warum ist .NET Core also so cool?
Nachdem wir die wichtigsten Vor- und Nachteile der beiden Frameworks erörtert haben, möchten wir nun einige weitere Details darüber mitteilen, warum .NET Core so gut ist und was Sie wissen müssen, um damit zu arbeiten.
Die .NET-Plattform wurde im Jahr 2002 eingeführt und hat seitdem enorme Veränderungen durchlaufen. Lange Zeit war .NET eine Multiplattform-Umgebung, aber nicht plattformübergreifend und hauptsächlich eine Windows-Sache.
.NET Core war ein neuer Atemzug der .NET-Plattform. Es wurde von Grund auf neu geschrieben, um ein quelloffenes, modulares, leichtgewichtiges und plattformübergreifendes Framework für die Erstellung von Webanwendungen und -diensten zu sein, die auf Windows, Linux und Mac laufen. Im Folgenden finden Sie die wichtigsten Fakten, die Sie über .NET Core von Microsoft wissen sollten.
.NET Core ist eine plattformübergreifende Lösung. Wenn Sie bisher der Meinung waren, dass die .NET-Plattform nur für Windows konzipiert ist, dann ändert sich mit .NET Core nun die Realität. Dieses Framework läuft bereits auf Windows, Mac OS X und Linux. In unserem Unternehmen haben wir ein erfolgreiches ASP.NET Core-Projekt, in dem unser Team verschiedene Betriebssysteme verwendet: Das Frontend-Team verwendet Linux für die Entwicklung, einer unserer Backend-Entwickler verwendet MacOS, und zwei weitere Entwickler arbeiten auf Windows-Maschinen. Und alles funktioniert wie ein Schweizer Mechanismus, ohne Probleme, als ob jeder das gleiche Betriebssystem hätte. Was vor ein paar Jahren noch unglaublich erschien, ist heute Realität. Natürlich erfordern einige einzelne Komponenten, z. B. solche betriebssystemspezifischen Dinge wie ein Dateisystem, eine separate Implementierung. Das Bereitstellungsmodell über NuGet ermöglicht es, diese Unterschiede zu beseitigen. Für Entwickler ist dies eine einzige API, die auf verschiedenen Plattformen läuft, sie müssen sich nicht darum kümmern, da das Paket bereits verschiedene Implementierungen für jede der Umgebungen enthält.
In unserem Unternehmen haben wir einige erfolgreiche ASP.NET Core-Projekte, bei denen unser Team verschiedene Betriebssystemplattformen verwendet: Das Frontend-Team verwendet Linux für die Entwicklung, einer unserer Backend-Entwickler verwendet MacOS, und zwei weitere Entwickler arbeiten auf Windows-Maschinen. Und alles funktioniert wie ein Schweizer Mechanismus, ohne Probleme, als ob jeder das gleiche Betriebssystem hätte. Was vor ein paar Jahren noch unglaublich erschien, ist heute Realität.
Container-Unterstützung. Die Modularität und Leichtgewichtigkeit von .NET Core macht es perfekt für Container. Es ist für Cloud-spezifische Workloads optimiert, und Microsoft Azure bietet sogar Unterstützung für die Bereitstellung Ihrer Anwendung in Containern und Kubernetes. Wenn Sie einen Container erstellen und bereitstellen, ist sein Image mit .NET Core viel kleiner als mit .NET Framework. Außerdem passt es am besten zur Philosophie und Arbeitsweise von Containern.
.NET Core ist Open-Source. Die Verwendung einer Open-Source-Plattform hat viele Vorteile: Sie ist transparenter, Sie haben mehr Kontrolle bei der Verwendung und Änderung und sie bietet offensichtlich ein stärkeres Ökosystem.
Hohe Leistung. .NET Core ist auch das schnellste .NET aller Zeiten. Und das Beste daran ist, dass Sie Ihren Code nicht ändern müssen. Der Compiler wird Ihren Code von Natur aus mit den neuen Sprachverbesserungen optimieren. Der neue Kestrel-Webserver wurde von Grund auf neu entwickelt, um die Vorteile asynchroner Programmiermodelle zu nutzen und um leichter und schneller zu sein. Es hat sich gezeigt, dass die Kombination von Kestrel und ASP.NET Core um ein Vielfaches schneller ist.
Dies ist nur ein sehr kurzer Überblick über all die Vorzüge von .NET Core.
In diesem Artikel haben wir versucht, einige Details von Docker und der .NET Core-Plattform zu erklären, die Vorteile der Verwendung von Docker mit .NET Core aufzuzeigen und Entwicklern zu helfen, die richtige Plattform für die Entwicklung zu wählen. Zusammenfassend fasst die folgende Entscheidungstabelle von Microsoft zusammen, ob Sie .NET Framework oder .NET Core verwenden sollten. Denken Sie daran, dass Sie für Linux-Container Linux-basierte Docker-Hosts (VMs oder Server) und für Windows-Container Windows-Server-basierte Docker-Hosts (VMs oder Server) benötigen.
Microservices auf Containern
.NET Core
.NET Core
Monolithische Anwendung
.NET Core
.NET Framework
.NET Core
Erstklassige Leistung und Skalierbarkeit
.NET Core
.NET Core
Migration von Windows Server-Legacy-Anwendungen („brown-field“) auf Container
–
.NET Framework
Neue Entwicklung auf der Grundlage von Containern („grüne Wiese“)
.NET Core
.NET Core
ASP.NET Core
.NET Core
.NET Core (empfohlen)
.NET Framework
ASP.NET 4 (MVC 5, Web API 2 und Web Forms)
–
.NET Framework
SignalR-Dienste
.NET Core 2.1 oder höhere Version
.NET-Rahmenwerk
.NET Core 2.1 oder höhere Version
WCF, WF und andere Legacy-Frameworks
WCF in .NET Core (nur dieWCF-Client-Bibliothek)
.NET-Rahmenwerk
WCF in .NET Core (nur die WCF-Client-Bibliothek)
Inanspruchnahme von Azure-Diensten
.NET Core (letztendlich werden alle Azure-Dienste Client-SDKs für .NET Core bereitstellen)
.NET-Framework
.NET Core (irgendwann werden alle Azure-Dienste Client-SDKs für .NET Core anbieten)
Über Redwerk
Unser Team besteht aus ASP.NET-Programmierern, die über solide Erfahrung in der Erstellung von Anwendungen auf Microsoft-bezogenen Plattformen verfügen. Als Softwareentwicklungs-Outsourcing-Agentur bieten wir komplette Entwicklungsdienstleistungen in den Bereichen E-Commerce, Business Automation, E-Health, Media & Entertainment, E-Government, Game Development, Startups & Innovation. Mehr als ein Jahrzehnt Erfahrung mit hunderten von erfolgreichen Projekten – das ist Microsoft Software-Entwicklungsunternehmen Redwerk.