Docker, was ist das und was ist der Zweck?


111

Ich habe vor einigen Tagen von Docker gehört und wollte darüber hinweggehen.

Aber in der Tat weiß ich nicht, was der Zweck dieses "Containers" ist?

Was ist ein Container?

Kann es eine virtuelle Maschine ersetzen, die für die Entwicklung vorgesehen ist?

Was ist mit einfachen Worten der Zweck der Verwendung von Docker in Unternehmen? Der Hauptvorteil?



Antworten:


115

VM: Mit VM-Software kann Ubuntu beispielsweise in einem Windows installiert werden. Und sie würden beide gleichzeitig rennen. Es ist, als würde man einen PC mit seinen Kernkomponenten wie CPU, RAM, Festplatten, Netzwerkkarten usw. innerhalb eines Betriebssystems erstellen und so zusammenbauen, als wäre es ein echter PC. Auf diese Weise wird der virtuelle PC zu einem "Gast" innerhalb eines tatsächlichen PCs, der mit seinem Betriebssystem als Host bezeichnet wird.

Container: Es ist das gleiche wie oben, aber anstatt ein gesamtes Betriebssystem zu verwenden, wurden die "unnötigen" Komponenten des virtuellen Betriebssystems reduziert, um eine minimale Version davon zu erstellen. Dies führte zur Erstellung von LXC (Linux Containers). Es ist schneller als VM-Maschinen.

Docker: Ein Docker-Container benötigt im Gegensatz zu einer virtuellen Maschine und einem Container kein separates Betriebssystem. Stattdessen stützt es sich auf die Funktionalität des Linux-Kernels und verwendet die Ressourcenisolation.
Zweck von Docker: Der Hauptfokus liegt auf der Automatisierung der Bereitstellung von Anwendungen in Software-Containern und der Automatisierung der Virtualisierung auf Betriebssystemebene unter Linux. Es ist leichter als Standardcontainer und startet in Sekundenschnelle. ggg

(Beachten Sie, dass im Fall von Docker kein Gastbetriebssystem erforderlich ist.)


1
Ich habe versucht, nach Ressourcen für den Entwicklungs-Bereitstellungs-Workflow von Docker zu suchen, aber ich kann anscheinend nichts finden. Nehmen wir zum Beispiel an, ich habe eine Lampp-Umgebung mit Laravel + Angular4. Teile ich meinen Teamkollegen eine bestimmte Datei? Wie bearbeite ich die Anwendungsquelle (php html js / ts), wenn ich sie in einen Container lege? Können wir noch git / svn für unseren Quellcode verwenden?
Anaval

13
VM steht für "Virtual Machine". Sie müssen es nicht "VM Machine" nennen, da es dann zu "Virtual Machine Machine" wird. :)
Dzhuneyt

32

[Hinweis: Diese Antwort konzentriert sich auf Linux-Container und gilt möglicherweise nicht vollständig für andere Betriebssysteme. ]]

Was ist ein Container?

Es ist eine App : Ein Container ist eine Möglichkeit, voneinander isolierte Anwendungen auszuführen. Anstatt die Hardware zu virtualisieren, um mehrere Betriebssysteme auszuführen, müssen Container das Betriebssystem virtualisieren, um mehrere Anwendungen auszuführen. Dies bedeutet, dass Sie mehr Container auf derselben Hardware als VMs ausführen können, da nur eine Kopie des Betriebssystems ausgeführt wird und Sie nicht für jede Instanz Ihrer App den Speicher und die CPU-Kerne vorab zuweisen müssen. Wie bei jeder anderen App werden sie von einem Container, der die CPU oder den Arbeitsspeicher benötigt, zugewiesen und anschließend freigegeben, sodass andere Apps später dieselben begrenzten Ressourcen verwenden können.

Sie nutzen Kernel-Namespaces : Jeder Container erhält standardmäßig eine Umgebung, in der die folgenden Namespaces vorhanden sind:

  • Mount: Dateisysteme /im Container unterscheiden sich von denen /auf dem Host.
  • PID: Prozess-IDs, PID 1 im Container ist Ihre gestartete Anwendung. Diese PID unterscheidet sich vom Host aus.
  • Netzwerk: Container werden standardmäßig mit einer eigenen Loopback-Schnittstelle (127.0.0.1) und einer privaten IP-Adresse ausgeführt. Docker verwendet Technologien wie Linux-Brückennetzwerke, um mehrere Container in ihrem eigenen privaten LAN miteinander zu verbinden.
  • IPC: Interprozesskommunikation
  • UTS: Dies beinhaltet den Hostnamen
  • Benutzer: Sie können optional alle Benutzer-IDs verschieben, die von denen des Hosts versetzt werden sollen

Jeder dieser Namespaces verhindert auch, dass ein Container Dinge wie das Dateisystem oder Prozesse auf dem Host oder in anderen Containern sieht, es sei denn, Sie entfernen diese Isolation explizit.

Und andere Linux-Sicherheitstools : Container verwenden auch andere Sicherheitsfunktionen wie SELinux, AppArmor, Capabilities und Seccomp, um zu verhindern, dass Benutzer im Container, einschließlich des Root-Benutzers, dem Container entkommen oder den Host negativ beeinflussen können.

Packen Sie Ihre Apps mit ihren Abhängigkeiten für die Portabilität : Um eine Anwendung in einen Container zu packen, müssen Sie nicht nur die Anwendung selbst, sondern alle zum Ausführen dieser Anwendung erforderlichen Abhängigkeiten zu einem tragbaren Image zusammenfügen. Dieses Image ist das Basisdateisystem, mit dem ein Container erstellt wird. Da wir nur die Anwendung isolieren, enthält dieses Dateisystem nicht den Kernel und andere Betriebssystemdienstprogramme, die zum Virtualisieren eines gesamten Betriebssystems erforderlich sind. Daher sollte ein Image für einen Container erheblich kleiner sein als ein Image für eine gleichwertige virtuelle Maschine, damit die Bereitstellung auf Knoten im gesamten Netzwerk beschleunigt werden kann. Infolgedessen sind Container zu einer beliebten Option für die Bereitstellung von Anwendungen in der Cloud und in entfernten Rechenzentren geworden.

Kann es eine virtuelle Maschine ersetzen, die für die Entwicklung vorgesehen ist?

Dies hängt davon ab : Wenn in Ihrer Entwicklungsumgebung Linux ausgeführt wird und Sie entweder keinen Zugriff auf Hardwaregeräte benötigen oder ein direkter Zugriff auf die physische Hardware zulässig ist, ist die Migration in einen Linux-Container recht einfach. Das ideale Ziel für einen Docker-Container sind Anwendungen wie webbasierte APIs (z. B. eine REST-App), auf die Sie über das Netzwerk zugreifen.

Was ist mit einfachen Worten der Zweck der Verwendung von Docker in Unternehmen? Der Hauptvorteil ?

Entwicklung oder Betrieb : Docker wird normalerweise auf einem von zwei Pfaden in eine Umgebung gebracht. Entwickler, die nach einer Möglichkeit suchen, ihre Anwendung schneller zu entwickeln und lokal zu testen, und Vorgänge, die mehr Arbeitslast auf weniger Hardware ausführen möchten, als dies mit virtuellen Maschinen möglich wäre.

Oder Entwickler : Eines der idealen Ziele besteht darin, Docker sofort über das CI / CD-Bereitstellungstool zu nutzen, die Anwendung zu kompilieren und sofort ein Image zu erstellen, das für Entwicklung, CI, Produkt usw. bereitgestellt wird. Container verkürzen häufig die Zeit zum Verschieben der Anwendung vom Einchecken des Codes bis zum Testen, wodurch Entwickler effizienter werden. Bei ordnungsgemäßem Design kann dasselbe Image, das von den Entwicklern und CI-Tools getestet und genehmigt wurde, in der Produktion bereitgestellt werden. Da dieses Image alle Anwendungsabhängigkeiten enthält, wird das Risiko eines Produktionsausfalls, der in der Entwicklung funktioniert hat, erheblich verringert.

Skalierbarkeit : Ein letzter wesentlicher Vorteil von Containern, den ich erwähnen werde, ist, dass sie unter Berücksichtigung der horizontalen Skalierbarkeit ausgelegt sind. Wenn Sie zustandslose Apps unter hoher Last haben, lassen sich Container aufgrund ihrer geringeren Bildgröße und des geringeren Overheads viel einfacher und schneller skalieren. Aus diesem Grund werden Container von vielen größeren webbasierten Unternehmen wie Google und Netflix verwendet.


2
+1 Ich stimme Ihrer Antwort voll und ganz zu, insbesondere dem Teil "Kann es virtuelle Maschine (n) ersetzen?". Ich sehe an anderer Stelle viele Kommentare, die betonen, dass Docker keine virtuelle Maschine ist, aber erfahrungsgemäß funktioniert es in vielen Anwendungsfällen genauso gut oder ist sogar eine bessere Alternative. Was meinen Sie, als Sie sagten "akzeptabel, um direkten Zugriff auf die physische Hardware zu haben"?
Tyress

2
@tyress Wenn Ihr Host Linux ist, können Sie Geräte direkt in einen Linux-Container einbinden. Ich habe es mit Soundgeräten gesehen, aber alles in / dev kann hinzugefügt werden. Dies umgeht eine gewisse Containerisolation, ist jedoch für bestimmte Aufgaben wie Desktop-Apps sinnvoll.
BMitch

das ist großartig. Daran habe ich nicht gedacht.
Tyress

@BMitch: sehr saubere und elegante Antwort, danke !! Ich denke, ich kann mir jetzt vorstellen, was ein Container ist. Es wäre jedoch großartig, wenn Sie Ihre Antwort dahingehend aktualisieren könnten, wie der Container mit dem Docker zusammenhängt. Entspricht Docker im Vergleich von Container und VM dem Hypervisor?
rahulaga_dev

1
Docker ist ein Tool, das Container implementiert und den Rest des benötigten Ökosystems wie die Registrierung in Docker-Hub- und Desktop-Umgebungen bereitstellt, in die eine VM zum Ausführen von Linux-Containern eingebettet ist.
BMitch

6

Dieselben Fragen trafen mich vor einigen Tagen und was ich fand, nachdem ich mich darauf eingelassen hatte, lassen Sie uns in sehr einfachen Worten verstehen.

Warum sollte man an Docker und Container denken, wenn mit dem aktuellen Prozess der Anwendungsarchitektur und -entwicklung alles in Ordnung zu sein scheint?

Nehmen wir ein Beispiel, in dem wir eine Anwendung mit den Diensten nodeJs, MongoDB, Redis, RabbitMQ usw. entwickeln [Sie können sich alle anderen Dienste vorstellen].

Jetzt sehen wir uns den folgenden Dingen als Probleme bei der Anwendungsentwicklung und im Versandprozess gegenüber, wenn wir die Existenz von Docker oder anderen Alternativen für Containerisierungsanwendungen vergessen.

  1. Kompatibilität von Diensten (nodeJs, mongoDB, Redis, RabbitMQ usw.) mit dem Betriebssystem (selbst nachdem kompatible Versionen mit dem Betriebssystem gefunden wurden, müssen wir die Kompatibilität erneut überprüfen und beheben, wenn im Zusammenhang mit Versionen etwas Unerwartetes passiert).

  2. Wenn für zwei Systemkomponenten eine Bibliothek / Abhängigkeit mit unterschiedlichen Versionen in der Anwendung im Betriebssystem erforderlich ist (dies muss jedes Mal neu überprüft werden, wenn ein unerwartetes Anwendungsverhalten aufgrund eines Problems mit der Bibliothek und der Abhängigkeitsversion auftritt).

  3. Vor allem, wenn eine neue Person dem Team beitritt, fällt es uns sehr schwer, die neue Umgebung einzurichten. Die Person muss eine Vielzahl von Anweisungen befolgen und Hunderte von Befehlen ausführen, um die Umgebung endgültig einzurichten. Dies erfordert Zeit und Mühe.

    Die Benutzer müssen sicherstellen, dass sie die richtige Version des Betriebssystems verwenden, und die Kompatibilität der Dienste mit dem Betriebssystem überprüfen. Jeder Entwickler muss dies jedes Mal beim Einrichten befolgen.

  4. Wir haben auch unterschiedliche Umgebungen wie Entwicklung , Test und Produktion. Wenn ein Entwickler mit einem Betriebssystem vertraut ist und ein anderer mit einem anderen Betriebssystem vertraut ist, können wir in diesem Fall nicht garantieren, dass sich unsere Anwendung in diesen beiden unterschiedlichen Situationen gleich verhält .

All dies erschwert unser Leben bei der Entwicklung , dem Testen und dem Versand der Anwendungen.

Wir brauchen also etwas, das Kompatibilitätsprobleme löst und es uns ermöglicht, Änderungen und Modifikationen an jeder Systemkomponente vorzunehmen, ohne andere Komponenten zu beeinflussen.

Jetzt denken wir an Docker, weil es das Ziel ist, die Anwendungen zu containerisieren, die Bereitstellung von Anwendungen zu automatisieren und sie sehr einfach zu versenden.

Geben Sie hier die Bildbeschreibung ein

Wie Docker die oben genannten Probleme löst

  1. Wir können jede Dienstkomponente (nodeJs, MongoDB, Redis, RabbitMQ) in verschiedenen Containern mit eigenen Abhängigkeiten und Bibliotheken im selben Betriebssystem, aber mit unterschiedlichen Umgebungen ausführen .

  2. Wir müssen die Docker-Konfiguration nur einmal ausführen, dann können alle unsere Teamentwickler mit dem einfachen Docker-Ausführungsbefehl beginnen. Wir haben hier viel Zeit und Mühe gespart :) .

So Container sind isolierte Umgebungen mit allen Abhängigkeiten und Bibliotheken gebündelt zusammen mit ihrem eigenen Prozess und Netzwerkschnittstellen und Halterungen .

Alle Container verwenden dieselben Betriebssystemressourcen, daher benötigen sie weniger Zeit zum Starten und zur effizienten Nutzung der CPU mit geringeren Hardwarekosten.

Ich hoffe das wäre hilfreich.


2

Lassen Sie mich versuchen, so einfache Antworten wie möglich zu geben:

Aber in der Tat weiß ich nicht, was der Zweck dieses "Containers" ist?

Was ist ein Container?

Einfach ausgedrückt: ein Paket mit Software . Insbesondere werden eine Anwendung und alle ihre Abhängigkeiten gebündelt. Eine reguläre, nicht dockerisierte Anwendungsumgebung ist direkt mit dem Betriebssystem verbunden, während ein Docker-Container eine Abstraktionsschicht des Betriebssystems ist.

Ein Container unterscheidet sich von einem Image dadurch, dass ein Container eine Laufzeitinstanz eines Images ist - ähnlich wie Objekte Laufzeitinstanzen von Klassen sind, falls Sie mit OOP vertraut sind.

Kann es eine virtuelle Maschine ersetzen, die für die Entwicklung vorgesehen ist?

Sowohl VMs als auch Docker-Container sind Virtualisierungstechniken, da sie eine Abstraktion über die Systeminfrastruktur hinaus bieten.

Auf einer VM wird ein vollständiges Gastbetriebssystem mit virtuellem Zugriff auf Hostressourcen über einen Hypervisor ausgeführt. Dies bedeutet, dass die VM der Umgebung häufig mehr Ressourcen zur Verfügung stellt, als sie tatsächlich benötigt. Im Allgemeinen stellen VMs einer Umgebung mehr Ressourcen zur Verfügung, als die meisten Anwendungen benötigen. Daher sind Behälter eine leichtere Technik. Die beiden lösen unterschiedliche Probleme.

Was ist mit einfachen Worten der Zweck der Verwendung von Docker in Unternehmen? Der Hauptvorteil?

Die Containerisierung geht Hand in Hand mit Microservices. Die kleineren Dienste, aus denen die größere Anwendung besteht, werden häufig getestet und in Docker-Containern ausgeführt. Dies erleichtert das kontinuierliche Testen.

Da Docker-Container schreibgeschützt sind, wird ein wichtiges DevOps-Prinzip durchgesetzt: Produktionsservices sollten unverändert bleiben

Einige allgemeine Vorteile ihrer Verwendung:

  • Große Isolation der Dienstleistungen
  • Hervorragende Verwaltbarkeit, da Container alles enthalten, was die App benötigt
  • Kapselung der Implementierungstechnologie (in den Containern)
  • Effiziente Ressourcennutzung (aufgrund der geringen Betriebssystemvirtualisierung) im Vergleich zu VMs
  • Schnelle Bereitstellung
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.