Was ist der Unterschied zwischen Docker und einer virtuellen Maschine (VM)?

0
249

Docker-Container bieten einen ähnlichen Dienst wie virtuelle Maschinen und bieten eine isolierte Umgebung für Anwendungen, in denen sie ausgeführt werden sollen, aber es handelt sich im Grunde um zwei unterschiedliche Technologien. Wir besprechen die Unterschiede und was Docker so nützlich macht.

Was macht Docker so nützlich?

Der Hauptzweck einer virtuellen Maschine besteht darin, einen großen Server in kleinere Blöcke zu unterteilen. Der wichtige Teil besteht darin, dass Prozesse isoliert werden, die auf jeder VM ausgeführt werden. Ihr Hosting-Provider könnte beispielsweise über eine 32-Core-Maschine verfügen und diese in acht 4-Core-VMs aufteilen, die er an verschiedene Kunden verkauft. Dies reduziert die Kosten für alle und sie sind großartig, wenn Sie viele Prozesse ausführen oder vollen SSH-Zugriff auf die zugrunde liegende Hardware benötigen.

Wenn Sie jedoch nur eine App ausführen, verbrauchen Sie möglicherweise mehr Ressourcen als nötig. Um diese einzelne App auszuführen, muss der Hypervisor ein ganzes Gastbetriebssystem hochfahren, was bedeutet, dass auf einem 32-Kern-Computer acht Kopien von Ubuntu ausgeführt werden. Darüber hinaus haben Sie für jede Instanz einen Overhead der virtuellen Maschine.

Docker bietet eine bessere Lösung. Docker-Container bieten Isolation ohne den Overhead von virtuellen Maschinen. Jeder Container läuft in seiner eigenen Umgebung, die in Linux-Namespaces unterteilt ist, aber der wichtige Teil ist, dass der Code in den Containern direkt auf dem Computer ausgeführt wird. Es ist keine Emulation oder Virtualisierung erforderlich.

Es gibt immer noch ein wenig Overhead aufgrund von Netzwerken und Schnittstellen mit dem Hostsystem, aber Anwendungen in Docker laufen im Allgemeinen mit Bare-Metal-Geschwindigkeiten und sicherlich viel schneller als Ihr durchschnittlicher VPS. Sie müssen nicht 8 Kopien von Ubuntu ausführen, sondern nur eine, was es billig macht, mehrere Docker-Container auf einem Host auszuführen. Dienste wie der Elastic Container Service von AWS und Cloud Run der GCP bieten Möglichkeiten, einzelne Container auszuführen, ohne einen zugrunde liegenden Server bereitzustellen.

Werbung

Container fassen alle Abhängigkeiten zusammen, die Ihre App zum Ausführen benötigt, einschließlich Bibliotheken und Binärdateien, die das Betriebssystem verwendet. Sie können einen CentOS-Container auf einem Ubuntu-Server ausführen; beide verwenden den Linux-Kernel, und der einzige Unterschied sind die enthaltenen Binärdateien und Bibliotheken für das Betriebssystem.

Der Hauptunterschied bei Docker-Containern besteht darin, dass Sie im Allgemeinen keinen SSH-Zugriff auf den Container haben. Sie brauchen es jedoch nicht unbedingt, die Konfiguration wird vollständig von der Containerdatei selbst übernommen, und wenn Sie Aktualisierungen vornehmen möchten, müssen Sie eine neue Version des Containers übertragen.

Da diese Konfiguration alles im Code erfolgt, können Sie Versionskontrolle wie Git für Ihre Serversoftware verwenden. Da Ihr Container ein einzelnes Image ist, können Sie verschiedene Builds Ihres Containers leicht verfolgen. Mit Docker ist Ihre Entwicklungsumgebung genau die gleiche wie Ihre Produktionsumgebung und auch die Entwicklungsumgebung aller anderen, was das Problem “es ist auf meinem Computer kaputt!’ 8221;

Wenn Sie Ihrem Cluster einen weiteren Server hinzufügen möchten, müssen Sie sich nicht darum kümmern, diesen Server neu zu konfigurieren und alle benötigten Abhängigkeiten neu zu installieren. Sobald Sie einen Container erstellt haben, können Sie ohne viel Konfiguration problemlos hundert Instanzen dieses Containers einrichten. Dies ermöglicht auch ein sehr einfaches Auto Scaling, wodurch Sie viel Geld sparen können.

Nachteile von Docker

Natürlich wird Docker virtuelle Maschinen in absehbarer Zeit nicht ersetzen. Es sind zwei unterschiedliche Technologien und virtuelle Maschinen haben immer noch viele Vorteile.

Networking ist in der Regel mehr beteiligt. Auf einer virtuellen Maschine steht Ihnen normalerweise dedizierte Netzwerkhardware direkt zur Verfügung. Sie können ganz einfach Firewalls konfigurieren, Anwendungen so einstellen, dass sie an bestimmten Ports lauschen, und komplizierte Workloads wie den Lastausgleich mit HAProxy ausführen. Da bei Docker alle Container auf demselben Host laufen, ist dies oft etwas komplizierter. Normalerweise stellen jedoch containerspezifische Dienste wie der Elastic Container Service von AWS und Cloud Run der GCP dieses Netzwerk als Teil ihres Dienstes bereit.

Werbung

Leistung auf nicht-nativen Betriebssysteme sind immer noch auf Augenhöhe mit virtuellen Maschinen. Sie können keinen Linux-Container auf einem Windows-Hostcomputer ausführen, daher verwendet Docker für Windows tatsächlich ein Windows-Subsystem für Linux-VMs, um laufende Container zu verarbeiten. Docker bietet in diesem Fall im Wesentlichen eine Abstraktionsebene über der virtuellen Maschine.

Persistente Daten sind auch etwas kompliziert. Docker-Container sind zustandslos konzipiert. Dies kann mit Volume-Mounts behoben werden, die ein Verzeichnis auf dem Host in den Container einhängen, und Dienste wie ECS ermöglichen Ihnen das Mounten von freigegebenen Volumes. Es ist jedoch nicht besser als das Speichern von Daten auf einem normalen Server, und Sie würden nicht wirklich versuchen, eine Produktionsdatenbank in Docker auszuführen.