Eine einzelne `docker run`-Zeile reicht schnell nicht mehr. Docker Compose definiert Multi-Container-Anwendungen als YAML – reproduzierbar, versionierbar und mit einem einzigen Befehl startbar.
YAMLServicesVolumesNetworksdocker compose up
Compose-Grundlagen: Services, Volumes, Networks
Eine `compose.yml` beschreibt den kompletten Stack. Jeder Service ist ein Container, Volumes persistieren Daten, Networks verbinden Container untereinander – isoliert vom Host.
Mit depends_on wird die Startreihenfolge definiert. Über den Service-Namen (`postgres`) kommunizieren Container direkt im internen Netzwerk – kein Port-Mapping zwischen ihnen nötig.
Umgebungsvariablen und Secrets sicher verwalten
Passwörter gehören nicht in die Compose-Datei. Die Lösung: `.env`-Datei neben der `compose.yml`, die Werte per `${VARIABLE}` eingebunden werden.
.env-Datei:DB_PASS=geheimespasswort – wird automatisch geladen, gehört in `.gitignore`
env_file: Pro Service eine separate Env-Datei – gut für komplexe Setups mit vielen Variablen
Docker Secrets: Für Produktivsysteme – Secrets werden als Dateien gemountet, nicht als Umgebungsvariablen exponiert
Auf Servern mit mehreren Projekten empfiehlt sich ein Verzeichnis pro Stack: `/opt/stacks/n8n/compose.yml` und `/opt/stacks/n8n/.env`. Übersichtlich, leicht zu deployen via Git.
Compose in der Praxis: Workflows und Tipps
Die wichtigsten Compose-Befehle für den Alltag:
docker compose up -d – Stack im Hintergrund starten
docker compose pull && docker compose up -d – Update auf neue Images
docker compose logs -f servicename – Live-Logs eines Services
docker compose exec servicename bash – Shell in laufenden Container
docker compose down -v – Stack stoppen und Volumes löschen (Vorsicht: Datenverlust!)
Für automatische Updates ohne manuellen Eingriff: Watchtower überwacht Images und startet Container bei neuen Versionen neu. Kombiniert mit Traefik als Reverse Proxy und CI/CD entsteht ein vollautomatischer Deploy-Workflow.
Häufige Fragen zu Docker Compose
Docker Compose V2 ist der aktuelle Standard – als Plugin direkt in Docker integriert. Befehl: `docker compose` (ohne Bindestrich). V1 (`docker-compose`) ist veraltet. Dateiname ist jetzt `compose.yml` statt `docker-compose.yml`, beides wird aber noch unterstützt.
Bei Compose: `docker compose pull servicename && docker compose up -d servicename`. Kurze Downtime ist unvermeidlich da der alte Container gestoppt wird. Für Zero-Downtime braucht man Swarm oder Kubernetes – für Heimserver aber oft überdimensioniert.
Ja – mit `-f`: `docker compose -f compose.yml -f compose.prod.yml up`. Werte in der zweiten Datei überschreiben die erste. Nützlich um eine Basis-Config mit produktionsspezifischen Overrides zu ergänzen (z.B. andere Port-Bindings, Logging-Treiber).
`depends_on` wartet nur bis der Container startet, nicht bis der Service ready ist. Lösung: `depends_on` mit `condition: service_healthy` und einem `healthcheck` in der Datenbank-Service-Definition. Alternativ: Retry-Logik in der Applikation einbauen.