Docker Compose ist ein Werkzeug, um mehrere zusammengehörige Container mit einer einzigen Konfigurationsdatei zu beschreiben und gemeinsam zu starten. Es ist der Standardweg für lokale Entwicklungsumgebungen und für kleine Produktivdienste, bei denen ein Kubernetes-Cluster deutlich zu viel wäre.
Aufbau der Datei
services:
web:
image: registry.example.org/team/app:1.4.0
build: .
ports:
- "8080:8080"
environment:
DB_HOST: db
DB_USER: app
depends_on:
db:
condition: service_healthy
restart: unless-stopped
db:
image: postgres:17-alpine
environment:
POSTGRES_DB: app
POSTGRES_PASSWORD_FILE: /run/secrets/db_pw
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app"]
interval: 10s
retries: 5
volumes:
pgdata:
secrets:
db_pw:
file: ./secrets/db_pw.txt
Die wichtigsten Bausteine
- services: jeder Container mit Image oder
build, Ports, Volumes und Umgebung. Innerhalb des Compose-Netzes erreichen sich Dienste über ihren Dienstnamen – deshalb istDB_HOST: dbkorrekt und keine IP nötig. - volumes: benannte Volumes für persistente Daten. Ohne Volume ist der Datenbankinhalt beim Entfernen des Containers weg.
- networks: Compose legt automatisch ein Netz an; mehrere Netze erlauben die Trennung von Frontend und Backend.
- depends_on mit condition: steuert nur die Reihenfolge.
service_healthywartet tatsächlich auf einen bestandenen Healthcheck – die übliche Falle istdepends_onohne Bedingung: Der abhängige Dienst startet, bevor die Datenbank annimmt, und scheitert. - healthcheck: beschreibt, wie die Bereitschaft eines Dienstes geprüft wird. Grundlage für
service_healthyund für sichtbaren Status. - secrets und configs: Geheimnisse werden als Datei in den Container gemountet statt als Umgebungsvariable – so tauchen sie nicht in
docker inspectoder in Prozesslisten auf. - profiles: optionale Dienste, die nur mit
--profilegestartet werden. Praktisch für Werkzeuge wie Adminer, Mailpit oder einen Debug-Sidecar. - override-Dateien:
compose.override.yamlwird automatisch zusätzlich geladen. Damit lassen sich Entwicklungsanpassungen getrennt halten, ohne die Basiskonfiguration zu verändern.
Befehle
docker compose up -d # im Hintergrund starten
docker compose ps # Status
docker compose logs -f web # Logs verfolgen
docker compose exec web sh # im Container arbeiten
docker compose build --pull # Images neu bauen
docker compose pull # Images aktualisieren
docker compose up -d --force-recreate # neu erzeugen
docker compose down # stoppen und entfernen
docker compose down -v # zusätzlich Volumes löschen (Vorsicht!)
docker compose config # aufgelöste Konfiguration anzeigen
Grenzen
Compose läuft auf einem Host. Für mehrere Knoten braucht es einen Schwarm (Docker Swarm) oder Kubernetes. Rollback kennt Compose nicht – die Version steht im image-Feld, und ein Zurückrollen bedeutet, den Tag zu ändern und neu zu erzeugen. Ein Ausrollen ohne Unterbrechung ist ebenfalls nicht vorgesehen: up -d ersetzt Container, die kurz nicht verfügbar sind. Für Entwicklung, Testumgebungen und kleine Dienste ist Compose aber das schlankste Werkzeug, das zuverlässig funktioniert – die aufgelöste Konfiguration lässt sich zudem mit docker compose config prüfen, was Fehlersuche erheblich vereinfacht.
Verwandte Grundlagen: Docker, Container, Dockerfile, Docker-Grundlagen.