Docker Compose

KAPITEL 08 · CLOUD & INFRASTRUKTUR

Docker Compose

Multi-Container-Anwendungen einfach definieren und orchestrieren. Docker Compose nutzt YAML-Dateien, um Services, Networks und Volumes deklarativ zu beschreiben – perfekt für Development und Production.

YAML-Syntax Multi-Service Networks Volumes Interaktive Tools

Inhaltsverzeichnis

Auf dieser Seite

  • Was ist Docker Compose? Multi-Container-Orchestration per YAML
  • Installation: Docker Compose V2 installieren
  • YAML-Syntax: Services, Networks, Volumes im Detail
  • Commands: up, down, ps, logs, exec, build
  • Interaktiver Generator: Compose YAML per Formular erstellen
  • Templates: Fertige Stacks für gängige Anwendungen
  • Best Practices: Production-Ready Compose-Dateien
  • Vergleich: Docker Compose vs. Alternativen
  • Häufige Fragen & Antworten: FAQ-Bereich

1. Was ist Docker Compose?

Definition

Docker Compose ist ein Tool zur Definition und Ausführung von Multi-Container-Docker-Anwendungen. Mit einer einfachen YAML-Datei (docker-compose.yml) konfigurieren Sie alle Services Ihrer Anwendung und starten sie mit einem einzigen Befehl.

Statt jeden Container manuell mit docker run zu starten, definieren Sie in der Compose-Datei alle Abhängigkeiten, Netzwerke, Volumes und Umgebungsvariablen – und Docker Compose kümmert sich um den Rest.

Typische Einsatzgebiete: Lokale Entwicklungsumgebungen, Test- und Staging-Systeme, Microservices-Architekturen, CI/CD-Pipelines und kleine bis mittlere Produktionsumgebungen.

Docker Compose vs. Kubernetes

Docker Compose ist ideal für lokale Entwicklung und einfache Deployments auf einem einzelnen Host. Kubernetes ist für produktive Cluster-Umgebungen mit Hochverfügbarkeit, Auto-Scaling und komplexen Orchestrierungsanforderungen konzipiert.

Einfachheit

Alle Services in einer YAML-Datei definieren. Kein manuelles Starten einzelner Container nötig.

Reproduzierbarkeit

Identische Umgebungen auf jedem Rechner. "Funktioniert bei mir" wird zu "Funktioniert überall".

Multi-Umgebungen

Entwicklung, Testing, Staging und Produktion mit unterschiedlichen Konfigurationen (.env-Dateien).

Versionierung

Compose-Dateien können in Git versioniert werden. Änderungen an der Infrastruktur sind nachvollziehbar.

Automatisierung

Perfekt für CI/CD-Pipelines. Automatische Tests und Deployments mit einem Befehl.

Isolation

Jedes Projekt hat sein eigenes Netzwerk und seine eigenen Volumes. Keine Konflikte zwischen Projekten.

Deklarative Konfiguration

Alle Services, Networks und Volumes in einer YAML-Datei definiert. Versionierbar mit Git.

Multi-Service Stacks

Webserver, Datenbank, Cache, Queue – alles in einem Stack. Abhängigkeiten automatisch aufgelöst.

One-Command Deployment

docker compose up startet alle Services. Kein manuelles Starten einzelner Container.

Automatische Networks

Services kommunizieren über ein internes Netzwerk. DNS-basierte Service-Discovery inklusive.

Persistente Volumes

Datenbanken und Dateisysteme überleben Container-Neustarts. Named Volumes für einfache Verwaltung.

Environment Variables

Konfiguration über .env-Dateien oder Umgebungsvariablen. Keine Hardcoded Secrets im YAML.

Docker Compose V1 vs. V2

  • V1 (Legacy): Eigenständiges Tool docker-compose (mit Bindestrich). In Python geschrieben, wird nicht mehr weiterentwickelt.
  • V2 (Aktuell): Integriert in Docker CLI als docker compose (ohne Bindestrich). In Go geschrieben, schneller, aktiv maintained.
  • Empfehlung: Immer V2 verwenden! V1 ist seit 2023 deprecated.

2. Installation

Docker Compose V2 ist in Docker Desktop (Windows/macOS) bereits integriert. Für Linux-Systeme:

Docker Compose V2 installieren

1
Docker installieren (falls nicht vorhanden)
$ curl -fsSL https://get.docker.com | sh
$ sudo usermod -aG docker $USER
$ newgrp docker
2
Compose Plugin installieren (Linux)
$ sudo apt-get update
$ sudo apt-get install docker-compose-plugin
3
Version prüfen
$ docker compose version
Docker Compose version v2.24.5

Hinweis für Docker Desktop Nutzer

Wenn du Docker Desktop (Windows oder macOS) verwendest, ist Docker Compose V2 bereits integriert. Du musst nichts zusätzlich installieren. Einfach docker compose im Terminal verwenden.

3. YAML-Syntax im Detail

Eine docker-compose.yml besteht aus drei Hauptbereichen: Services, Networks und Volumes.

# docker-compose.yml - Beispiel mit allen Hauptbereichen # Optional in V2, aber empfohlen version: "3.8" services: web: image: nginx:alpine container_name: my-webserver ports: - "8080:80" # Host:Container volumes: - ./html:/usr/share/nginx/html:ro environment: - NGINX_HOST=localhost depends_on: - db restart: unless-stopped networks: - frontend db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS} MYSQL_DATABASE: myapp volumes: - db_data:/var/lib/mysql networks: - backend networks: frontend: driver: bridge backend: driver: bridge volumes: db_data: driver: local

Wichtige Service-Optionen

Option Beschreibung Beispiel
image Docker-Image (Registry oder lokal) nginx:alpine
build Image aus Dockerfile bauen ./app
ports Port-Mapping (Host:Container) "8080:80"
volumes Volume-Mounts ./data:/app/data
environment Umgebungsvariablen - DB_HOST=db
depends_on Startreihenfolge - db
restart Restart-Policy unless-stopped
container_name Fester Container-Name my-webserver
command Override des Default-Commands nginx -g "daemon off;"
deploy Deployment-Optionen (Swarm) replicas: 3

4. Wichtige Commands

Docker Compose bietet eine Reihe von Befehlen zur Verwaltung deiner Stacks:

# Stack starten (im Hintergrund) $ docker compose up -d # Stack stoppen und Container entfernen $ docker compose down # Stack stoppen und Volumes löschen (!) $ docker compose down -v # Status der Services anzeigen $ docker compose ps # Logs eines Services anzeigen $ docker compose logs -f web # In einen laufenden Container executen $ docker compose exec web bash # Images neu bauen (nach Dockerfile-Änderung) $ docker compose build # Stack neu starten (Konfiguration neu laden) $ docker compose restart # Nur einen bestimmten Service starten $ docker compose up -d db # Alle nicht genutzten Ressourcen aufräumen $ docker system prune -a

Tipps für die Arbeit mit Compose

  • Working Directory: docker compose sucht automatisch nach docker-compose.yml im aktuellen Verzeichnis
  • Mehrere Files: docker compose -f base.yml -f override.yml up für Environment-spezifische Overrides
  • Projekt-Name: docker compose -p myproject up setzt den Projekt-Namen (sonst Verzeichnis-Name)
  • Dry-Run: docker compose config validiert die YAML ohne zu starten

5. Interaktiver Compose Generator

Erstelle Docker Compose YAMLs per Formular. Gib die Parameter ein und erhalte sofort den fertigen Code.

Docker Compose Generator

# Klicke auf "Generieren"

6. Compose-Vorlagen

Häufig verwendete Compose-Templates als Ausgangspunkt. Klicke auf eine Vorlage, um sie im Generator zu laden.

Nginx Webserver

Leichter Webserver / Reverse Proxy mit statischem Content-Volume.

nginx:alpine Port 80 Reverse Proxy
WordPress + MySQL

Komplettes CMS mit Datenbank. Ideal für Blogs und Webseiten.

wordpress:latest mysql:8.0 CMS
Nextcloud + MariaDB

Private Cloud mit Datei-Sync, Kalender und Kontakten.

nextcloud mariadb Cloud
Prometheus + Grafana

Monitoring-Stack mit Metrik-Sammlung und Dashboards.

prometheus grafana Monitoring
MERN Stack

MongoDB, Express, React, Node.js – Full-Stack JavaScript.

mongo node Full-Stack
Traefik Reverse Proxy

Automatischer Reverse Proxy mit Let's Encrypt TLS-Zertifikaten.

traefik:v3 HTTPS Auto-Discovery

7. Best Practices

Empfohlen
  • Named Volumes für persistente Daten verwenden
  • Restart-Policy always oder unless-stopped
  • Umgebungsvariablen statt Hardcoded Secrets
  • Healthchecks für alle Services definieren
  • Spezifische Image-Tags (nicht :latest in Production)
  • Netzwerke explizit definieren (nicht default bridge)
  • Resource Limits (CPU/RAM) setzen
  • .env-Datei für sensible Daten verwenden
  • YAML mit docker compose config validieren
Vermeiden
  • Passwörter im YAML im Klartext (nutze .env oder Docker Secrets)
  • Root-User im Container (nutze user: Directive)
  • Keine Volumes = Datenverlust bei Container-Neustart
  • Port-Konflikte durch feste Host-Ports (Range oder Proxy nutzen)
  • :latest Tag – nicht reproduzierbar
  • Zu viele Services in einer Compose-Datei (modularisieren)
  • Keine depends_on bei Services mit Abhängigkeiten

8. Docker Compose vs. Alternativen

Feature Docker Compose Kubernetes Docker Swarm Nomad
ZielgruppeDev, Single-HostEnterprise, Multi-HostKleine ClusterHybrid
KomplexitätNiedrigHochMittelMittel
Multi-Host✗ (nur Single)
Auto-Scaling✓ HPA/VPA✓ Basic
Self-Healing✓ Ausgezeichnet✓ Gut✓ Gut
LernkurveSehr flachSteilModeratModerat
SetupMinutenTage/WochenStundenStunden
Best fürDev, Testing, HomelabProduction, EnterpriseKleine ProduktionHybrid

Wann Docker Compose?

  • Development: Lokale Entwicklungsumgebung mit allen Abhängigkeiten
  • Testing: CI/CD-Pipelines mit Test-Datenbanken
  • Homelab: Private Server mit WordPress, Nextcloud, etc.
  • Single-Host Production: Kleine Anwendungen auf einem Server
  • NICHT geeignet: Multi-Host-Cluster, Auto-Scaling, High Availability

9. Häufige Fragen & Antworten

Häufige Fragen zu Docker Compose

Was ist der Unterschied zwischen docker compose und docker-compose?

docker compose (ohne Bindestrich) ist die moderne Version (V2), die als Docker-Plugin integriert ist. Sie ist schneller, besser in Docker integriert und wird aktiv weiterentwickelt.

docker-compose (mit Bindestrich) ist die Legacy-Version (V1), die als separates Python-Tool installiert wurde. Sie wird nicht mehr aktiv weiterentwickelt und sollte nicht mehr verwendet werden.

Empfehlung: Verwenden Sie immer docker compose (ohne Bindestrich). Die meisten modernen Docker-Installationen haben V2 bereits integriert.

Wie verwende ich Umgebungsvariablen in Docker Compose?

Es gibt mehrere Möglichkeiten:

  • Direkt in Compose: environment: - VAR=value
  • Aus .env-Datei: environment: - VAR=${VAR} (automatisch aus .env im gleichen Verzeichnis)
  • Explizite env_file: env_file: - .env.production
  • Shell-Variablen: VAR=$MY_VAR docker compose up

Best Practice: Sensible Daten (Passwörter, API-Keys) nie direkt in die Compose-Datei schreiben. Verwenden Sie .env-Dateien und fügen Sie diese zu .gitignore hinzu.

Wie kommunizieren Services miteinander?

Docker Compose erstellt automatisch ein Standard-Netzwerk für alle Services. Services können sich über ihren Service-Namen als Hostname erreichen.

Beispiel: Wenn Sie einen Service db definieren, können andere Services ihn unter db:5432 erreichen – nicht über localhost!

Custom Networks: Für komplexere Setups können Sie eigene Netzwerke definieren und Services zuweisen. Dies ermöglicht bessere Isolation (z.B. separates Frontend- und Backend-Netzwerk).

Was passiert mit meinen Daten, wenn ich docker compose down ausführe?

Standard (docker compose down):

  • Container werden gestoppt und entfernt
  • Netzwerke werden entfernt
  • Named Volumes bleiben erhalten (Daten sind sicher)
  • Bind Mounts bleiben erhalten

Mit -v Flag (docker compose down -v):

  • Container, Netzwerke und Volumes werden entfernt
  • Vorsicht: Alle Daten in Volumes werden gelöscht!
  • Bind Mounts bleiben erhalten (liegen außerhalb von Docker)

Empfehlung: Verwenden Sie -v nur, wenn Sie bewusst alle Daten löschen möchten (z.B. bei Tests).

Wie aktualisiere ich Images in Docker Compose?

Der empfohlene Workflow:

  1. Images ziehen: docker compose pull (holt neueste Versionen)
  2. Services neu starten: docker compose up -d (erstellt Container mit neuen Images neu)
  3. Alte Images aufräumen: docker image prune (entfernt ungenutzte Images)

Alternative: docker compose up -d --pull always zieht automatisch neueste Images vor dem Start.

Wichtig: Bei Custom-Images (mit build) müssen Sie docker compose build ausführen, bevor Sie up starten.

Wie debugge ich einen Service, der nicht startet?

Schritt-für-Schritt Debugging:

  1. Status prüfen: docker compose ps – zeigt, ob Container läuft oder exited ist
  2. Logs ansehen: docker compose logs [service] – zeigt Fehlermeldungen
  3. Logs im Follow-Mode: docker compose logs -f [service] – live verfolgen
  4. Config validieren: docker compose config – prüft YAML-Syntax
  5. Container manuell starten: docker compose run --rm [service] sh – öffnet Shell
  6. Events beobachten: docker compose events – zeigt alle Events

Häufige Probleme:

  • Port bereits belegt → anderen Port wählen
  • Volume-Pfad nicht vorhanden → Pfad prüfen
  • Umgebungsvariablen fehlen → .env-Datei prüfen
  • Abhängigkeit nicht bereit → healthcheck konfigurieren
Kann ich Docker Compose in Produktion verwenden?

Ja, aber mit Einschränkungen:

  • Geeignet für: Kleine bis mittlere Anwendungen, Single-Host-Deployments, interne Tools
  • Weniger geeignet für: Hochverfügbarkeits-Cluster, Auto-Scaling, komplexe Orchestrierung

Produktions-Checkliste:

  • Restart-Policies konfigurieren (restart: unless-stopped)
  • Healthchecks für alle Services
  • Resource Limits (CPU, Memory) definieren
  • Logging zu zentralem System (ELK, Loki)
  • Monitoring & Alerting einrichten
  • Backup-Strategie für Volumes
  • Regelmäßige Security-Updates

Alternative für Produktion: Für komplexe Anforderungen sollten Sie Kubernetes, Docker Swarm oder Cloud-native Lösungen (ECS, Cloud Run) in Betracht ziehen.

Wie skaliere ich Services mit Docker Compose?

Docker Compose unterstützt horizontale Skalierung auf einem einzelnen Host:

Befehl: docker compose up -d --scale web=3 startet 3 Instanzen des web Services.

Voraussetzungen:

  • Service muss stateless sein (keine lokalen Daten)
  • Keine festen Port-Mappings (verwenden Sie ports: - "8080" statt "8080:80")
  • Load Balancer vor den Instanzen (z.B. Nginx, Traefik)

Limitierung: Docker Compose skaliert nur auf einem Host. Für Multi-Host-Scaling benötigen Sie Docker Swarm oder Kubernetes.

Zusammenfassung

Wichtigste Punkte

  • Docker Compose: Multi-Container-Orchestration per YAML-Datei
  • V2 (aktuell): Integriert in Docker CLI als docker compose
  • YAML-Struktur: Services, Networks, Volumes
  • Wichtige Commands: up, down, ps, logs, exec, build
  • Interaktiver Generator: Compose YAML per Formular erstellen (auf dieser Seite)
  • Templates: Nginx, WordPress, Nextcloud, Prometheus, MERN, Traefik
  • Best Practices: Named Volumes, spezifische Tags, Healthchecks, .env-Dateien
  • Einsatz: Development, Testing, Homelab, Single-Host Production
  • Nicht geeignet: Multi-Host-Cluster, Auto-Scaling, High Availability

Weiterführende Themen

Container-Orchestration

Kubernetes, Docker Swarm, Nomad – Orchestration im Detail.

Zur Orchestration
Virtualisierung

VMs vs. Container, Hypervisor, Docker-Grundlagen.

Zur Virtualisierung
Infrastructure as Code

Terraform, Ansible, CloudFormation – Automatisierung.

Zu IaC
Cloud-Sicherheit

Container-Sicherheit, Image-Scanning, Netzwerk-Policies.

Zur Cloud-Sicherheit