Images und Container - der Unterschied den jeder kennen sollte

Images und Container - der Unterschied den jeder kennen sollte

Ein Image und ein Container sind zwei grundverschiedene Dinge — wer das nicht versteht, kämpft früher oder später gegen Probleme, die eigentlich keine sein müssten.

Das Image: der Blueprint

Ein Docker-Image ist eine unveränderliche, schreibgeschützte Vorlage. Es enthält das Dateisystem, alle Abhängigkeiten, die Konfiguration und den Startbefehl einer Anwendung — aber es läuft nicht. Es existiert einfach.

Gut vergleichbar mit einer Klasse in der objektorientierten Programmierung: Die Klasse definiert, wie ein Objekt aussieht und was es kann. Sie selbst tut nichts.

Images bestehen aus übereinanderliegenden Layern, die beim Build entstehen. Mehr dazu in einem separaten Artikel.

# Vorhandene Images anzeigen
docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    a6bd71f48f68   2 weeks ago    192MB
alpine       3.18      c1afedef4846   4 weeks ago    7.33MB

Der Container: die laufende Instanz

Ein Container ist eine laufende (oder gestoppte) Instanz eines Images. Docker legt beim Start einen dünnen, beschreibbaren Layer über das Image und startet den definierten Prozess. Das Image selbst bleibt unverändert.

Analogie zur Klasse: Der Container ist das Objekt, das aus der Klasse erzeugt wurde.

# Laufende Container anzeigen
docker ps

# Alle Container (auch gestoppte)
docker ps -a

Mehrere Container aus einem Image

Das Entscheidende: Aus einem Image lassen sich beliebig viele Container starten — unabhängig voneinander, mit eigenen Daten, eigenen Ports, eigenem Status.

# Drei Nginx-Container gleichzeitig aus demselben Image
docker run -d --name web1 -p 8081:80 nginx
docker run -d --name web2 -p 8082:80 nginx
docker run -d --name web3 -p 8083:80 nginx

Alle drei laufen isoliert. Änderungen in web1 berühren web2 und web3 nicht — und das zugrundeliegende Image schon gar nicht.

Container löschen löscht kein Image

Ein häufiger Anfängerfehler: Container entfernen und erwarten, dass das Image weg ist.

docker rm web1          # Container löschen
docker rmi nginx        # Image löschen (nur wenn kein Container mehr darauf verweist)

Container und Image sind unabhängige Objekte. docker rm entfernt Instanzen, docker rmi entfernt Blueprints.

Zusammenfassung

| | Image | Container |
|---|---|---|
| Zustand | unveränderlich | veränderlich |
| Analogie | Klasse | Objekt |
| Befehl | docker images | docker ps |
| Erstellen | docker build | docker run |
| Löschen | docker rmi | docker rm |