Containerisierung

Docker: der ganze Stack als Code, pro Kunde klonbar.

Jeder Dienst läuft isoliert in seinem eigenen Container; ein Befehl bringt alles in definierter Reihenfolge hoch. Warum wir containerisieren, was Docker ausmacht und wie ein docker compose up den Stack startet – ephemer im Prozess, persistent im Volume.

01

Warum Docker

Reproduzierbar · isoliert · portabel

Ohne Container installiert man Dienste direkt auf den Host – mit kollidierenden Abhängigkeiten, „works on my machine“ und einem Zustand, der sich kaum sauber klonen lässt. Container drehen das um: Jeder Dienst bringt seine eigene Umgebung mit, der ganze Stack wird zu Code und lässt sich identisch auf dem Mac, auf Hetzner und beim Kunden hochfahren.

Direkt auf dem Host

Ein Python für dbt, ein anderes für Dagster – Versionskonflikte. Jede Umgebung leicht anders, der Zustand vermischt sich mit dem System.

Container (Docker)

Jeder Dienst isoliert mit eigenen Abhängigkeiten. Der Stack ist eine Datei, identisch überall – und pro Engagement klonbar.

Reproduzierbar

Der Stack als eine Datei

Eine compose.yml beschreibt alle Dienste. Identisch auf jeder Maschine – das Fundament des Clone-per-Client-Modells.

Isoliert

Kein Abhängigkeits-Konflikt

Jeder Container hat seine eigenen Bibliotheken und Versionen. Was in dem einen läuft, stört den anderen nicht.

Deklarativ

Ein Befehl, definierte Reihenfolge

docker compose up bringt alles hoch – mit depends_on und Healthchecks in der richtigen Reihenfolge.

Overlay

Security steckt an, ohne den Core zu ändern

Ein docker-compose.override.yml legt Authentik & Co. über den Core. Der Kern bleibt portabel und perimeter-agnostisch.

Ehrlich · was Docker nicht löst

Docker ist keine Skalierungs-Silberkugel – echtes Auto-Scaling über viele Hosts ist Kubernetes-Territorium. Das Netzwerk hat Tücken: Docker umgeht die Host-Firewall via iptables, deshalb müssen Dienste bewusst an 127.0.0.1 gebunden werden. Und Zustand braucht Planung – er gehört in Volumes, nicht in den Container.

02

Was ist Docker

Build-Zeit · Laufzeit

Eine Container-Plattform. Ein Image ist ein unveränderliches Bündel aus App und Abhängigkeiten, in gecachten Layern gebaut. Ein Container ist eine laufende, isolierte Instanz davon. Compose beschreibt mehrere Container deklarativ als Services – der Docker-Daemon führt alles aus.

Build-Zeit

Artefakte

DockerfileRezept: wie das Image Schritt für Schritt gebaut wird.ImageUnveränderliches Artefakt – App + Abhängigkeiten.LayerGecachte Bau-Schichten; nur Geändertes wird neu gebaut.RegistryWo Images liegen – Docker Hub, GHCR.BuildDer Vorgang: Dockerfile → Image.
Laufzeit

Orchestrierung

ContainerLaufende, isolierte Instanz eines Images – ephemer.VolumePersistenter Speicher außerhalb des Container-Lebenszyklus.NetworkVirtuelles Netz; Container erreichen sich per Service-Namen.ComposeMehrere Services deklarativ – compose.yml + override.ServiceEin Dienst in Compose, aus einem Image instanziiert.Engine / Daemondockerd – führt Builds und Container aus.
03

Wie der Stack hochfährt

läuft · Endlosschleife

docker compose up verschmilzt Core- und Overlay-Datei, legt Network und Volume an und startet die Container in Abhängigkeitsreihenfolge: erst die Persistenz (Postgres am Volume), dann die App-Container. Jeder ist unabhängig – fällt einer aus, laufen die anderen weiter.

engine · dockerdnetwork · ngo_default
Container · ephemerisoliert · austauschbar · kein State
Service
Dagster127.0.0.1:3000
Service
dbtgRPC intern
Service
Metabase127.0.0.1:3001
Service · Overlay
Authentik127.0.0.1:9000
Persistenz · überlebt down / upProzess ephemer · Daten im Volume
Service
PostgreSQL127.0.0.1:5432
Volumepgdatapersistent · optional externe DB je Profil
iptables-Gotcha
Docker umgeht ufw über eigene iptables-Regeln. Alle Dienste sind an 127.0.0.1 gebunden – sonst wären sie trotz Firewall von außen offen. Nach außen published nur der Ingress.
compose filesCore
# docker-compose.yml · Core
services:
  postgres   # volume: pgdata
  dagster
  dbt
  metabase

# docker-compose.override.yml · Overlay
services:
  authentik   → Security-Overlay

# = effective config  ✓ 5 services
$ docker compose up -d0 / 5
gestopptstartinghealthydepends_on

Container sind ephemer – Volumes bleiben.

— Prozess vs. State