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 ist DB_HOST: db korrekt 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_healthy wartet tatsächlich auf einen bestandenen Healthcheck – die übliche Falle ist depends_on ohne 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_healthy und für sichtbaren Status.
  • secrets und configs: Geheimnisse werden als Datei in den Container gemountet statt als Umgebungsvariable – so tauchen sie nicht in docker inspect oder in Prozesslisten auf.
  • profiles: optionale Dienste, die nur mit --profile gestartet werden. Praktisch für Werkzeuge wie Adminer, Mailpit oder einen Debug-Sidecar.
  • override-Dateien: compose.override.yaml wird 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.