Container vs. virtuelle Maschinen Cloud Explained Series

Cover picture article on containers

Sowohl virtuelle Maschinen als auch Container werden dafür genutzt, um Cloudanwendungen darauf laufen zu lassen. In unserem vorherigen Artikel haben wir uns damit beschäftigt, wie virtuelle Maschinen funktionieren. In diesem Artikel beschäftigen wir uns mit einem verwandten Thema – Containern. Bevor wir damit anfangen, fassen wir kurz den vorherigen Artikel zusammen: 

Was sind nochmal virtuelle Maschinen?

Virtuelle Maschinen sind vollständig unabhängige, virtuelle Computer, welche alles können, was auch nicht- virtuelle Computer können. Virtuelle Maschinen haben ihre eigenen zugewiesenen Hardwareressourcen, also eine bestimmte Anzahl an CPU-Kernen, RAM und so weiter. 

Moderne Virtualisierung funktioniert durch eine spezielle Software, die sogenannte Hypervisoren (Hypervisor). Hypervisoren sind dafür zuständig, die Hardwareressourcen unter den verschiedenen virtuellen Maschinen aufzuteilen – manchmal nutzt eine virtuelle Maschine mehr Ressourcen als die anderen, manchmal andersherum. Da es heutzutage ziemlich einfach ist, mehrere virtuelle Maschinen auf ein und demselben physischen Server zu betreiben, ist Virtualisierung eine weit verbreitete Methode um kosten einzusparen. Anstatt einen kompletten physischen Server zu kaufen ist es so möglich, nur ein kleines Stück der Gesamtleistung in form eines VPS zu kaufen. 

Es gibt übrigens viele verschiedene Ausdrücke für ein und dasselbe Konzept – virtuelle Maschinen, virtuelle Computer, Cloud Instanzen oder VPS. Einige Firmen haben sogar eigene Produktnamen wie z.B. Amazons EC2 oder Digital Oceans Droplet.  

Falls noch nicht getan, empfehlen wir Euch, unseren Artikel über Virtualisierung zuerst zu lesen. Dies hilft Euch, diesen Artikel über Container besser zu verstehen. 

Was ist ein Linux Container?

Container sind eine Form der Virtualisierung, welche minimalistischer ist als virtuelle Maschinen. Container laufen nativ unter Linux, da sie direkt in den Kernel eingebaut sind und auf dieselben Systemressourcen wie das Betriebssystem zurückgreifen. Vereinfacht gesagt, sind Container ähnlich wie andere Programme unter Linux. 

Um einen Container zu installieren reicht ein einziger Befehl – das System läd ein Distributionsimage herunter und installiert dieses auf den Computer. Der Kernel beginnt damit, dieser neuen Instanz Systemressourcen zuzuweisen. Hier nimmt der Linux-Kernel die Rolle eines Hypervisors mit einer virtuellen Maschine ein – er weist jedem Container nur so viele Ressourcen zu, wie benötigt werden. 

Auf den ersten Blick sind Container wie virtuelle Instanzen. So beinhaltet das populäre Alpine-Image die bekannten home, root und proc Ordner: 

Alpine file system

Allerdings sind Container keine unabhängigen Betriebssysteme. Sie sind nur ein Prozess, welcher auf dem Linux-Kernel und somit auf dem Host-System läuft. Sie enthalten nur das mindeste, um die zugewiesene Aufgabe oder das zugewiesene Programm ausführen zu können. So verbraucht der bereits erwähnte Alpine-Container standardmäßig nur 5MB Speicherplatz, während das komplette Betriebssystem mehrere Gigabyte an Speicherplatz benötigt (3GB im Falle von Ubuntu 20.04). Container sind portabel und laufen auf jedem System gleich, egal auf welchem Computer sie installiert wurden. 

virtual machines vs containers comparison

Container sind ein wichtiger Bestandteil moderner DevOps, welche es Entwicklern erlauben, Produkte schneller zu veröffentlichen und diese konstant zu updaten. Mehr Informationen bezüglich DevOps findet Ihr im nächsten Artikel unserer Cloud Explained Series. 

Container vs. virtuelle Maschinen

In den vergangenen Jahren haben viele Firmen ihre Anwendungen/Prozesse von virtuellen Maschinen auf Container übertragen. Trotz der Beliebtheit von Container werden virtuelle Maschinen nie vollständig durch Container ersetzt. Container und virtuelle Maschinen sind sich gegenseitig ergänzende Technologien – keine Rivalen. Beide finden aber ihren Einsatz in der Cloud Infrastruktur 

  VMs Containers 
Image Vollständig minimal 
Kernel Unabhängig von Host-Betriebssystem Mit dem Host-Betriebssystem geteilt 
Bereitstellung wenige Minuten wenige Sekunden 
Virtualisierung Hardware-basiert Betriebssystem-basiert 

Befassen wir uns nun etwas näher mit den Vor- und Nachteilen von Containern und virtuellen Maschinen: 

Virtuelle Maschinen: Das vollständige Betriebssystem

Wie bereits erwähnt, enthalten Container nur das minimalste des Betriebssystems, während virtuelle Maschinen das gesammte Betriebssystem enthalten – ähnlich wie ein physischer Computer. Virtuelle Maschinen bieten also ein komplette virtuelle Umgebung, wie z.B. unsere VPS Instanzen

Cntainer: Weniger Speicherplatz benötigt

Einige Schätzungen gehen davon aus, dass man vier bis sechs Mal soviele Container auf demselben Speicherplatz betreiben kann, wie eine einzige virtuelle Maschine, welche Xen oder KVM als Hypervisor benutzt. 

Container: Sofort betriebsbereit

Container sind schnell eingerichtet – meist durch wenige Befehle. Da Container direkt auf dem Kernel des Host-Betriebssystems laufen, gibt es keine Verzögerung beim starten des Containers. 

Container: Einheitlicher Betrieb

Container verhalten sich auf jedem Computer gleich. 

Entscheidender Faktor: Wann sind Container ein Vorteil, wann ein Nachteil?

Apps und Programme testen

Container erlauben es Entwicklern, ihre Programme schnell auf mehreren Betriebssystem gleichzeitig zu testen. Eine neue oder andere Version eines Betriebssystems zu installieren ist deutlich schneller, als auf virtuellen Maschinen. 

Microservice Architektur

Container sind perfekt für „One-Task“ Instanzen, also Instanzen, welche nur eine einzige Aufgabe ausführen. Microservices nutzen allerdings meistens eine Kombination aus virtuellen Maschinen und Containern. 

Datenbanken

Das Installieren von traditionellen Datenbanken, wie MySQL kann auf Containern allerdings schwierig sein: 

Tino Profile Picture

Experten Meinung: Tino Lehnig, Cloud Architect

Container eignen sich am besten für Anwendungen, die zustandslos sind, d. h. sie speichern keine dauerhaften Daten im Inneren. Solche Anwendungen können leicht skaliert werden, indem einfach mehr Container mit dem selben Code bereitgestellt werden. Datenbankanwendungen sind das genaue Gegenteil – Datenbankeinträge müssen permanent verfügbar sein und die Skalierung erfordert eine sorgfältige Konfiguration. Es gibt spezielle Software für die Datenbankorchestrierung, die bereits darauf ausgelegt ist, diesen Faktor zu berücksichtigen. Das Mischen von Container- und Datenbankorchestrierung ist in der Regel den Aufwand nicht wert.

Docker

Docker ist die aktuell weitverbreitetste und beliebteste Container-Software, welche u.a. LXC oder andere Container-Software ersetzt hat. Obwohl es alternativen zu Docker gibt, ist es schwierig über Container zu sprechen, ohne Docker zu erwähnen. Bevor wir anfangen, lasst uns über drei Schlüsselbegriffe sprechen: 

Schlüsselbegriffe: 

Parent Image – ist ein „read-only“ Standard-Image was immer zuerst heruntergeladen wird. Dieses kann alles sein: ein Ubuntu-Container, ein LAMP-Container oder ein WordPress-Container. 

Image – Sobald du etwas am Parent Image veränderst, wird dies zu deinem eigenen Projekt. Das Image ist dann das, was du z.B. mit deinen Kollegen teilen kannst. 

Container – ist die Umgebung, wo dein Image läuft. Container können nicht ohne Image laufen. 

Wie benutzen Entwickler Docker?

Um dies besser zu verstehen, werfen wir einen Blick auf ein typisches Docker Setup. 

1. Docker installieren

Obwohl Container eine Technologie verwenden, welche bereits in Linux implementiert ist, müsst Ihr zunächst eine „Container-Engine“ installieren. Diese könnt Ihr ganz einfach, abhängig von Eurem Betriebssystem, über das Terminal mit wenigen Befehlen machen. 

Solltet Ihr Kunde bei Contabo sein könnt Ihr euch diesen Schritt sparen und Docker direkt während der Installation oder Neuinstallation eines VPS, VDS oder Dedicated Server im Customer Control Panel durchführen: 

Installing Docker with Contabo

Hinweis: Sichert Eure Daten bevor Ihr eine Neuinstallation des Betriebssystems durchführt. Eure Daten werden nicht automatisch gespeichert! 

2. Download des Container-Images

Es gibt öffentliche und private Docker-Repositories (libraries), in welchen Entwickler diese auswählen und herunterladen können. 

Das bekannteste Docker-Repository ist der Docker Hub. Diese Repositories beinhalten bereits einen Befehl, mit welchem Ihr das Image direkt herunterladen könnt, zum Beispiel: 

Example of a docker pull

Neben dem Docker Hub gibt es viele Firmen (uns eingeschlossen), welche eigene, private Repositories für den internen Gebraucht nutzen. 

3. Arbeiten mit Containern

Sobald der Entwickler ein Image heruntergeladen und ausgeführt hat, kann dieser Daten in das Image hochladen oder Parameter anpassen: 

https://docs.docker.com/get-started/

4. Arbeit in ein Repository hochladen

Sobald die Arbeit getan ist kann der Entwickler das Image exportieren. Dieses Image kann nun durch einen Link mit Kollegen oder mit jedem geteilt werden.