Gute Frage, und die Antwort ist tatsächlich ein sauberer Einzeiler, den du dir merken kannst: Eine VM virtualisiert die Hardware, ein Container virtualisiert das Betriebssystem. Alles andere folgt daraus.
Virtuelle Maschine: Auf der echten Hardware läuft ein Hypervisor, der so tut, als gäbe es mehrere vollständige Rechner. Jede VM bekommt virtuelle CPU, virtuellen Arbeitsspeicher, virtuelle Festplatte und Netzwerkkarte – und darauf installierst du ein komplettes Gastbetriebssystem mit eigenem Kernel. Deine 8 GB und die Bootzeit sind genau das: Du startest einen ganzen Rechner, nur eben in Software.
Für die Klausur die übliche Unterteilung:
- Typ 1 (bare metal): Hypervisor läuft direkt auf der Hardware – Rechenzentrumsbetrieb, performanter
- Typ 2 (hosted): Hypervisor läuft als Programm in einem normalen Betriebssystem – das ist das, was du auf dem Laptop machst
Container: Hier gibt es kein zweites Betriebssystem. Alle Container auf einem Host teilen sich denselben Kernel und sind im Kern nur besonders gut abgeschottete Prozesse. Diese Abschottung leistet der Kernel selbst über zwei Mechanismen: Namespaces sorgen dafür, dass ein Container nur seine eigenen Prozesse, sein eigenes Dateisystem und sein eigenes Netzwerk sieht, und cgroups begrenzen, wie viel CPU und Arbeitsspeicher er verbrauchen darf.
Damit ist auch beantwortet, was ihm fehlt: das eigene Betriebssystem. Im Image stecken nur deine Anwendung, ihre Bibliotheken und ein paar Systemdateien – kein Kernel und nicht die vielen Dienste, die eine vollwertige Installation mitbringt. Daher MB statt GB und Sekunden statt Minuten, weil eben kein Bootvorgang stattfindet, sondern nur ein Prozess gestartet wird.
Zwei Begriffe, die gern verwechselt werden: Ein Image ist die unveränderliche Vorlage, ein Container die laufende Instanz davon – wie Klasse und Objekt in der objektorientierten Programmierung. Aus einem Image kannst du beliebig viele Container starten. Beschrieben wird das Image in einer Build-Datei (Basis-Image, Abhängigkeiten, Anwendung, Startbefehl), es besteht aus aufeinander aufbauenden Schichten und wird über eine Registry verteilt. Gemeinsame Schichten liegen auf dem Host nur einmal – noch ein Grund für den kleinen Fußabdruck.