🐳 Visuelle ErklÀrung

Docker – wie es innen funktioniert

Vom Befehl docker run bis zum laufenden Prozess: Client, Daemon, containerd und runc, Images aus Schichten, Isolation durch Namespaces und cgroups, Netze, Volumes – und Docker Compose. Alles interaktiv, Schritt fΓΌr Schritt.

πŸ—οΈAufbau: wer macht was?

Docker besteht aus mehreren Programmen, die sich die Arbeit teilen. Die CLI redet nur mit dem Daemon, der Daemon delegiert an containerd, und erst runc erzeugt den isolierten Prozess.
Linux-Host⌨️ docker (CLI)Client☁️ Registrydocker.io Β· ghcr.io β€¦πŸ³ dockerdDaemon Β· REST-API🧱 Image-SpeicherLayer Β· SnapshotsπŸ“‹ containerdContainer-Verwaltung🌐 Netzdocker0 Β· veth Β· NATπŸͺ shimcontainerd-shim-runc-v2βš™οΈ runcOCI-RuntimeπŸ“¦ Container (nginx)Namespaces + cgroup + rootfs

Auf einen Baustein klicken, um ihn zu erklΓ€ren.

🐳

dockerd

dockerd ist der Daemon: Er verwaltet Images, Container, Netze und Volumes, bietet die REST-API und kΓΌmmert sich um Build (BuildKit), Pull/Push, Port-VerΓΆffentlichung und Logs. Die eigentliche Container-AusfΓΌhrung gibt er an containerd weiter.

  • β–ΈKonfiguration: /etc/docker/daemon.json
  • β–ΈNetze ΓΌber die Bibliothek libnetwork
  • β–ΈLogs der Container ΓΌber Log-Treiber (json-file, journald …)

πŸ†šContainer oder virtuelle Maschine?

πŸ–₯️ Virtuelle Maschine

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  App A  β”‚β”‚  App B  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Gast-OS β”‚β”‚ Gast-OS β”‚  ← je ein eigener Kernel
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚     Hypervisor     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚Host-Betriebssystem β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Starke Trennung durch Hardware-Virtualisierung, aber Gigabytes pro Gast und Startzeiten im Sekundenbereich.

πŸ“¦ Container

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  App A  β”‚β”‚  App B  β”‚
β”‚ + Libs  β”‚β”‚ + Libs  β”‚  ← nur Dateien + Namespaces
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Docker / containerdβ”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Host-Kernel (Linux)β”‚  ← von allen geteilt
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Normale Prozesse mit eingeschrΓ€nkter Sicht: Megabytes statt Gigabytes, Start in Millisekunden – aber ein gemeinsamer Kernel.

🧭Kapitel