Docker Compose
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.
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.
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
Docker installieren (falls nicht vorhanden)
$ curl -fsSL https://get.docker.com | sh $ sudo usermod -aG docker $USER $ newgrp docker
Compose Plugin installieren (Linux)
$ sudo apt-get update $ sudo apt-get install docker-compose-plugin
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.
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:
Tipps für die Arbeit mit Compose
- Working Directory:
docker composesucht automatisch nachdocker-compose.ymlim aktuellen Verzeichnis - Mehrere Files:
docker compose -f base.yml -f override.yml upfür Environment-spezifische Overrides - Projekt-Name:
docker compose -p myproject upsetzt den Projekt-Namen (sonst Verzeichnis-Name) - Dry-Run:
docker compose configvalidiert 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.
WordPress + MySQL
Komplettes CMS mit Datenbank. Ideal für Blogs und Webseiten.
Nextcloud + MariaDB
Private Cloud mit Datei-Sync, Kalender und Kontakten.
Prometheus + Grafana
Monitoring-Stack mit Metrik-Sammlung und Dashboards.
MERN Stack
MongoDB, Express, React, Node.js – Full-Stack JavaScript.
Traefik Reverse Proxy
Automatischer Reverse Proxy mit Let's Encrypt TLS-Zertifikaten.
7. Best Practices
- Named Volumes für persistente Daten verwenden
- Restart-Policy
alwaysoderunless-stopped - Umgebungsvariablen statt Hardcoded Secrets
- Healthchecks für alle Services definieren
- Spezifische Image-Tags (nicht
:latestin Production) - Netzwerke explizit definieren (nicht default bridge)
- Resource Limits (CPU/RAM) setzen
.env-Datei für sensible Daten verwenden- YAML mit
docker compose configvalidieren
- Passwörter im YAML im Klartext (nutze
.envoder 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)
:latestTag – nicht reproduzierbar- Zu viele Services in einer Compose-Datei (modularisieren)
- Keine
depends_onbei Services mit Abhängigkeiten
8. Docker Compose vs. Alternativen
| Feature | Docker Compose | Kubernetes | Docker Swarm | Nomad |
|---|---|---|---|---|
| Zielgruppe | Dev, Single-Host | Enterprise, Multi-Host | Kleine Cluster | Hybrid |
| Komplexität | Niedrig | Hoch | Mittel | Mittel |
| Multi-Host | ✗ (nur Single) | ✓ | ✓ | ✓ |
| Auto-Scaling | ✗ | ✓ HPA/VPA | ✓ Basic | ✓ |
| Self-Healing | ✗ | ✓ Ausgezeichnet | ✓ Gut | ✓ Gut |
| Lernkurve | Sehr flach | Steil | Moderat | Moderat |
| Setup | Minuten | Tage/Wochen | Stunden | Stunden |
| Best für | Dev, Testing, Homelab | Production, Enterprise | Kleine Produktion | Hybrid |
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
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.
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.
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).
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).
Der empfohlene Workflow:
- Images ziehen:
docker compose pull(holt neueste Versionen) - Services neu starten:
docker compose up -d(erstellt Container mit neuen Images neu) - 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.
Schritt-für-Schritt Debugging:
- Status prüfen:
docker compose ps– zeigt, ob Container läuft oder exited ist - Logs ansehen:
docker compose logs [service]– zeigt Fehlermeldungen - Logs im Follow-Mode:
docker compose logs -f [service]– live verfolgen - Config validieren:
docker compose config– prüft YAML-Syntax - Container manuell starten:
docker compose run --rm [service] sh– öffnet Shell - 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
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.
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
Kubernetes, Docker Swarm, Nomad – Orchestration im Detail.
Zur OrchestrationVMs vs. Container, Hypervisor, Docker-Grundlagen.
Zur VirtualisierungTerraform, Ansible, CloudFormation – Automatisierung.
Zu IaCContainer-Sicherheit, Image-Scanning, Netzwerk-Policies.
Zur Cloud-Sicherheit