Docker Compose Anleitung 2025 – Multi-Container-Apps professionell betreiben
Diese Docker Compose Anleitung zeigt Ihnen, wie Sie Multi-Container-Anwendungen definieren, starten und in der Produktion betreiben. Docker Compose ist das Standard-Tool um mehrere Docker-Container als zusammengehörigen Stack zu verwalten – eine Konfigurationsdatei, ein Befehl, alles läuft.
Als IT-Dienstleister containerisieren wir Anwendungen für Unternehmenskunden täglich. Diese Docker Compose Anleitung basiert auf echten Produktions-Setups und zeigt sowohl Grundlagen als auch fortgeschrittene Techniken.
Inhaltsverzeichnis
- Docker Compose Anleitung: Was ist Docker Compose?
- Installation und Voraussetzungen
- Docker Compose Anleitung: Die docker-compose.yml erklärt
- Services, Images und Builds
- Docker Compose Anleitung: Netzwerke konfigurieren
- Volumes: Daten persistent speichern
- Docker Compose Anleitung: Umgebungsvariablen und Secrets
- Die wichtigsten Docker-Compose-Befehle
- Docker Compose Anleitung: Praxisbeispiel WordPress + MySQL + Redis
- Praxisbeispiel: JTL-Shop-Entwicklungsumgebung
- Docker Compose Anleitung: Health Checks
- Logging konfigurieren
- Docker Compose Anleitung: Produktions-Best-Practices
- Häufige Fehler und Lösungen
- Fazit
1. Docker Compose Anleitung: Was ist Docker Compose?
Laut dieser Docker Compose Anleitung ist Docker Compose ein Tool um Multi-Container-Docker-Anwendungen zu definieren und auszuführen. Sie beschreiben alle Services, Netzwerke und Volumes Ihrer Anwendung in einer YAML-Datei (docker-compose.yml) und starten alles mit einem einzigen Befehl: docker compose up.
Ohne Docker Compose müssten Sie für jeden Container manuell docker run-Befehle mit allen Parametern ausführen – und das in der richtigen Reihenfolge, mit den richtigen Netzwerken und Volumes. Docker Compose automatisiert genau das und macht komplexe Setups reproduzierbar.
Docker Compose vs Docker Swarm vs Kubernetes
- Docker Compose: Für Single-Host-Deployments, Entwicklung und kleine Produktionsumgebungen – diese Anleitung
- Docker Swarm: Für Multi-Host-Deployments mit einfacherem Orchestrierungs-Bedarf
- Kubernetes: Für große, komplexe Produktionsumgebungen mit Tausenden von Containern
Für die meisten KMU-Anwendungsfälle ist Docker Compose die richtige Wahl. Diese Docker Compose Anleitung deckt genau diese Szenarien ab.
2. Installation und Voraussetzungen
Docker Compose ist seit Docker Desktop (Windows/macOS) und Docker Engine 20.10+ als Plugin integriert. Keine separate Installation nötig.
# Docker Compose Version prüfen
docker compose version
# → Docker Compose version v2.x.x
# Ältere docker-compose (v1) Syntax:
docker-compose version # veraltet, nicht mehr empfohlen
Hinweis: Diese Docker Compose Anleitung verwendet die neue docker compose (v2) Syntax ohne Bindestrich. Alte Tutorials nutzen noch docker-compose (v1) – beides funktioniert, aber v2 ist der aktuelle Standard.
3. Docker Compose Anleitung: Die docker-compose.yml erklärt
Die docker-compose.yml ist das Herzstück jeder Docker Compose Anleitung. Hier ein vollständig annotiertes Beispiel:
version: '3.8' # Compose-Format-Version (3.8 ist aktueller Standard)
services: # Alle Container werden hier definiert
webserver: # Name des Service (frei wählbar)
image: nginx:1.25 # Docker-Image mit Tag (IMMER spezifisch, nie :latest in Produktion!)
container_name: mein-nginx # Optionaler Name des Containers
restart: unless-stopped # Neustart-Policy: immer neustarten außer bei manuellem Stop
ports:
- "8080:80" # Host-Port:Container-Port
volumes:
- ./html:/usr/share/nginx/html:ro # :ro = read-only
- nginx_logs:/var/log/nginx
networks:
- frontend # Netzwerk dem dieser Service angehört
depends_on:
php:
condition: service_healthy # Startet erst wenn php-Service gesund ist
environment:
- NGINX_HOST=localhost
php:
build: # Image aus lokalem Dockerfile bauen
context: . # Build-Kontext (Verzeichnis mit Dockerfile)
dockerfile: Dockerfile.php
restart: unless-stopped
volumes:
- ./app:/var/www/html
networks:
- frontend
- backend # Zugriff auf beide Netzwerke
healthcheck:
test: ["CMD", "php-fpm", "-t"]
interval: 30s
timeout: 10s
retries: 3
volumes: # Named Volumes
nginx_logs: # Leer = Docker verwaltet den Storage
networks: # Benutzerdefinierte Netzwerke
frontend:
driver: bridge
backend:
driver: bridge
4. Services, Images und Builds
In dieser Docker Compose Anleitung sind Services die Kernelemente. Jeder Service wird entweder von einem fertigen Image gestartet oder aus einem lokalen Dockerfile gebaut.
Image von Docker Hub
services:
mysql:
image: mysql:8.0 # Immer spezifischen Tag angeben
redis:
image: redis:7-alpine # alpine = kleineres Image (gute Praxis)
Eigenes Image bauen
services:
app:
build:
context: ./app # Wo das Dockerfile liegt
dockerfile: Dockerfile # Standard-Name, kann weggelassen werden
args:
PHP_VERSION: "8.2" # Build-Argumente für das Dockerfile
cache_from:
- myapp:latest # Cache von vorherigem Build nutzen
Restart Policies – Produktions-Standard
no: Nie neustarten (Standard, für Entwicklung)always: Immer neustarten, auch nach manuellem Stopunless-stopped: Neustarten außer bei manuellem Stop (empfohlen für Produktion)on-failure: Nur bei Fehler neustarten (mit optionalem max_attempts)
5. Docker Compose Anleitung: Netzwerke konfigurieren
Netzwerke in Docker Compose sind entscheidend für Sicherheit und Struktur. Diese Docker Compose Anleitung empfiehlt immer explizite Netzwerk-Definitionen.
networks:
frontend: # Webserver, Reverse Proxy
driver: bridge
backend: # Datenbank, Cache – KEIN Zugriff von außen
driver: bridge
internal: true # Kein Internet-Zugang für dieses Netzwerk
Durch Netzwerk-Segmentierung kann der Webserver mit der Datenbank kommunizieren, aber die Datenbank ist nicht direkt aus dem Internet erreichbar. Das ist eine wichtige Sicherheits-Maßnahme in produktiven Setups.
6. Volumes: Daten persistent speichern
Container sind ephemer – Daten gehen verloren wenn der Container gelöscht wird. Volumes lösen dieses Problem. Die Docker Compose Anleitung unterscheidet drei Typen:
Named Volumes (empfohlen für Datenbankdaten)
volumes:
mysql_data: # Docker verwaltet den Speicherort
redis_data:
services:
mysql:
volumes:
- mysql_data:/var/lib/mysql
Bind Mounts (empfohlen für Code in Entwicklung)
services:
app:
volumes:
- ./src:/var/www/html # Lokales Verzeichnis → Container
- ./config:/etc/app:ro # :ro = read-only
tmpfs Mounts (für temporäre Daten im RAM)
services:
app:
tmpfs:
- /tmp
- /run
7. Docker Compose Anleitung: Umgebungsvariablen und Secrets
Passwörter und API-Keys gehören nie direkt in die docker-compose.yml. Diese Docker Compose Anleitung zeigt den richtigen Umgang.
.env-Datei für Variablen
# .env Datei (NICHT ins Git-Repository!):
MYSQL_ROOT_PASSWORD=geheimespasswort123
MYSQL_DATABASE=meinshop
REDIS_PASSWORD=nochmehrgeheim
# docker-compose.yml:
services:
mysql:
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
Docker Secrets (für sensible Produktionsdaten)
secrets:
db_password:
file: ./secrets/db_password.txt
services:
mysql:
secrets:
- db_password
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_password
8. Die wichtigsten Docker-Compose-Befehle
# Services starten (Hintergrund):
docker compose up -d
# Status aller Services:
docker compose ps
# Logs aller Services:
docker compose logs -f
# Logs eines Services:
docker compose logs -f mysql
# In Container einsteigen:
docker compose exec mysql bash
# Services stoppen (Container bleiben erhalten):
docker compose stop
# Services stoppen und Container löschen:
docker compose down
# Services stoppen + Container + Volumes löschen:
docker compose down -v
# Images neu bauen:
docker compose build --no-cache
# Einzelnen Service neustarten:
docker compose restart nginx
# Konfiguration validieren:
docker compose config
9. Docker Compose Anleitung: WordPress + MySQL + Redis
Dieses vollständige Beispiel aus der Docker Compose Anleitung zeigt einen produktionsreifen WordPress-Stack:
version: '3.8'
services:
wordpress:
image: wordpress:6.4-php8.2-fpm
container_name: wordpress
restart: unless-stopped
environment:
WORDPRESS_DB_HOST: mysql:3306
WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
WORDPRESS_DB_USER: ${MYSQL_USER}
WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- wordpress_data:/var/www/html
- ./php.ini:/usr/local/etc/php/conf.d/custom.ini:ro
networks: [frontend, backend]
depends_on:
mysql:
condition: service_healthy
nginx:
image: nginx:1.25-alpine
container_name: nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- wordpress_data:/var/www/html:ro
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl:ro
networks: [frontend]
depends_on: [wordpress]
mysql:
image: mysql:8.0
container_name: mysql
restart: unless-stopped
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/conf.d/custom.cnf:ro
networks: [backend]
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
container_name: redis
restart: unless-stopped
command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru
volumes: [redis_data:/data]
networks: [backend]
volumes:
wordpress_data:
mysql_data:
redis_data:
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true
10. Docker Compose Anleitung: Produktions-Best-Practices
Diese Docker Compose Anleitung schließt mit den wichtigsten Regeln für Produktionsumgebungen:
- Immer spezifische Image-Tags:
nginx:1.25.3stattnginx:latest– verhindert unerwartete Updates - .env-Datei nie in Git: Immer in
.gitignoreaufnehmen, stattdessen.env.examplemit Platzhaltern bereitstellen - Health Checks für alle Services:
depends_onmitcondition: service_healthyverhindert Race Conditions beim Start - Ressourcen-Limits setzen:
mem_limit: 512mundcpus: '0.5'verhindern dass ein Container den Host lahmlegt - Netzwerk-Segmentierung: Backend-Services (Datenbank, Cache) immer mit
internal: trueisolieren - Logging-Driver konfigurieren: Standardmäßig wachsen Container-Logs unbegrenzt – immer
max-sizesetzen - Named Volumes für persistente Daten: Bind Mounts nur für Konfigurationsdateien und Entwicklungs-Code
11. Häufige Fehler in Docker Compose
Fehler: „depends_on wartet nicht bis der Service bereit ist“
depends_on wartet nur bis der Container gestartet ist, nicht bis der Service bereit ist. Lösung: Health Checks definieren und condition: service_healthy verwenden.
Fehler: Volumes werden bei docker compose down -v gelöscht
Der -v Flag löscht auch Named Volumes! Niemals in Produktion verwenden wenn Daten erhalten bleiben sollen. Für Produktions-Resets: Volumes manuell mit docker volume rm entfernen.
Fehler: Container können sich nicht gegenseitig erreichen
Stellen Sie sicher dass beide Services im selben Netzwerk sind. Container erreichen sich per Service-Name (nicht Container-Name) als Hostname.
TOSMedia hilft Ihnen bei der Docker-Containerisierung Ihrer Anwendungen – von der ersten Docker Compose Anleitung bis zum vollständigen produktiven Deployment. Sprechen Sie uns an.
Docker Compose Anleitung: Traefik als Reverse Proxy
Eine vollständige Docker Compose Anleitung für produktive Umgebungen kommt nicht ohne Reverse Proxy aus. Traefik ist der empfohlene Reverse Proxy für Docker-Compose-Setups, da er sich automatisch mit Docker integriert.
version: '3.8'
services:
traefik:
image: traefik:v3.0
container_name: traefik
restart: unless-stopped
ports:
- "80:80"
- "443:443"
command:
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.email=admin@ihreseite.de"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- letsencrypt_data:/letsencrypt
networks: [proxy]
wordpress:
image: wordpress:6.4-php8.2-fpm
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.wordpress.rule=Host('ihreseite.de')"
- "traefik.http.routers.wordpress.entrypoints=websecure"
- "traefik.http.routers.wordpress.tls.certresolver=letsencrypt"
networks: [proxy, backend]
volumes:
letsencrypt_data:
networks:
proxy:
driver: bridge
backend:
internal: true
Mit Traefik erhalten Sie automatisches SSL über Let’s Encrypt und müssen Nginx oder Apache als Reverse Proxy nicht separat konfigurieren – Traefik liest Docker-Labels und konfiguriert sich automatisch.
Docker Compose Anleitung: Monitoring mit Prometheus und Grafana
Diese Docker Compose Anleitung zeigt wie Sie Monitoring direkt in Ihren Stack integrieren:
services:
prometheus:
image: prom/prometheus:v2.48.0
container_name: prometheus
restart: unless-stopped
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_data:/prometheus
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.retention.time=30d"
networks: [monitoring]
grafana:
image: grafana/grafana:10.2.0
container_name: grafana
restart: unless-stopped
environment:
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD}
GF_USERS_ALLOW_SIGN_UP: "false"
volumes:
- grafana_data:/var/lib/grafana
ports:
- "3000:3000"
depends_on: [prometheus]
networks: [monitoring]
node-exporter:
image: prom/node-exporter:v1.7.0
container_name: node-exporter
restart: unless-stopped
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- "--path.procfs=/host/proc"
- "--path.sysfs=/host/sys"
networks: [monitoring]
Docker Compose Anleitung: Ressourcen-Limits setzen
In einer professionellen Docker Compose Anleitung dürfen Ressourcen-Limits nicht fehlen. Ohne Limits kann ein Container alle Host-Ressourcen verbrauchen:
services:
app:
image: myapp:1.0
deploy:
resources:
limits:
cpus: '0.50' # Max 50% eines CPU-Kerns
memory: 512M # Max 512 MB RAM
reservations:
cpus: '0.25' # Garantierte CPU-Reservierung
memory: 256M # Garantierter RAM
Docker Compose Anleitung: Tipps für Windows und macOS
Diese Docker Compose Anleitung gilt primär für Linux, aber Entwickler nutzen Docker häufig auf Windows oder macOS. Wichtige Unterschiede:
- Performance Bind Mounts: Auf Windows und macOS sind Bind Mounts deutlich langsamer als auf Linux. Für Code-Verzeichnisse in der Entwicklung empfiehlt sich der Einsatz von Docker Volumes statt Bind Mounts, oder WSL2 auf Windows für bessere Performance.
- Datei-Berechtigungen: Unter Windows gibt es keine Unix-Datei-Berechtigungen.
:ro(read-only) und Berechtigungsprobleme verhalten sich anders als auf Linux. - Netzwerk:
host-Netzwerk funktioniert unter Docker Desktop (Windows/macOS) anders als unter Linux. - Docker Desktop Lizenz: Für Unternehmen mit mehr als 250 Mitarbeitern oder mehr als 10 Millionen Dollar Umsatz ist Docker Desktop kostenpflichtig (ab 21 $/Monat/User). Für Linux-Server (Production) ist Docker Engine weiterhin kostenlos.
Docker Compose Anleitung: Von Entwicklung zu Produktion
Eine gute Docker Compose Anleitung unterscheidet zwischen Entwicklungs- und Produktionskonfiguration. Nutzen Sie mehrere Compose-Dateien:
# docker-compose.yml – Basis (beide Umgebungen)
# docker-compose.dev.yml – Nur Entwicklung (Bind Mounts, Debug-Ports)
# docker-compose.prod.yml – Nur Produktion (Ressourcen-Limits, Logging)
# Entwicklung starten:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d
# Produktion starten:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
Docker Compose Anleitung: Für Entwicklungsteams
Diese Docker Compose Anleitung richtet sich auch an Entwicklungsteams, die lokale Entwicklungsumgebungen standardisieren wollen.
Onboarding neuer Entwickler vereinfachen
Mit Docker Compose dauert das Onboarding eines neuen Entwicklers Minuten statt Tage. Statt stundenlanger Installationsanleitungen für PHP, MySQL, Redis, Node.js und alle Abhängigkeiten genügt ein einziger Befehl: docker compose up -d. Die gesamte Entwicklungsumgebung läuft identisch auf dem Laptop des Entwicklers, auf dem CI/CD-Server und in der Produktion.
Das löst das klassische Problem: „Bei mir funktioniert es, aber auf dem Server nicht.“ Mit Docker Compose sind Entwicklungs-, Test- und Produktionsumgebung strukturell identisch.
Mehrere Projekte parallel auf einem Rechner
Ein großer Vorteil laut dieser Docker Compose Anleitung: Entwickler können mehrere Projekte mit unterschiedlichen PHP-Versionen, MySQL-Versionen oder Node.js-Versionen gleichzeitig auf demselben Rechner betreiben. PHP 7.4 für Projekt A und PHP 8.2 für Projekt B – kein Konflikt, kein manuelles Umschalten. Das ist mit nativem PHP auf dem Host-System kaum realisierbar.
Docker Compose in der CI/CD-Pipeline
Docker Compose kann direkt in GitLab CI/CD, GitHub Actions oder Jenkins genutzt werden. Die Test-Umgebung in der Pipeline ist identisch mit der lokalen Entwicklungsumgebung. Keine Überraschungen mehr wenn Tests lokal laufen, aber in der Pipeline fehlschlagen.
Datenbank-Migrationen automatisieren
Eine häufige Anforderung in dieser Docker Compose Anleitung ist das automatische Ausführen von Datenbank-Migrationen beim Start. Nutzen Sie dafür einen separaten Init-Container:
services:
migrate:
image: myapp:latest
command: php artisan migrate --force
depends_on:
mysql:
condition: service_healthy
restart: on-failure # Nochmal versuchen wenn Datenbank noch nicht bereit
app:
image: myapp:latest
depends_on:
migrate:
condition: service_completed_successfully
Der App-Container startet erst, wenn der Migrate-Container erfolgreich abgeschlossen hat.
Docker Compose Anleitung: Zusammenfassung und nächste Schritte
Diese Docker Compose Anleitung hat alle wichtigen Konzepte abgedeckt: von der grundlegenden YAML-Struktur über Netzwerk-Segmentierung und Volumes bis zu Produktions-Best-Practices und echten Stack-Beispielen.
Ihre nächsten Schritte: Beginnen Sie mit einem einfachen Stack (z. B. WordPress + MySQL) und erweitern Sie schrittweise. Fügen Sie Redis hinzu, dann einen Reverse Proxy, dann Monitoring. Mit jedem Schritt verstehen Sie Docker Compose tiefer und können komplexere Szenarien umsetzen.
Wenn Sie Unterstützung bei der Containerisierung Ihrer Anwendungen benötigen – TOSMedia hilft von der Planung bis zum produktiven Deployment. Wir containerisieren bestehende Anwendungen, erstellen optimierte Dockerfiles und richten CI/CD-Pipelines ein die Docker Compose nutzen.
Weiterführende Ressourcen zu dieser Docker Compose Anleitung: Docker Official Docs, Docker Hub für fertige Images, Awesome-Compose Repository auf GitHub mit professionellen Beispiel-Setups für dutzende Anwendungen.
Docker Compose Anleitung: Troubleshooting-Tipps
Diese Docker Compose Anleitung schließt mit den häufigsten Troubleshooting-Szenarien:
Container startet nicht: Prüfen Sie docker compose logs servicename für Fehlermeldungen. Oft ist es ein falsches Environment-Variable oder ein Volume-Berechtigungsproblem.
Services erreichen sich nicht: Stellen Sie sicher dass beide Services im selben Netzwerk sind. Testen Sie mit docker compose exec service1 ping service2.
Volumes enthalten alte Daten: Nach Schema-Änderungen an der Datenbank müssen Volumes ggf. gelöscht werden: docker compose down -v (Vorsicht: löscht alle Daten).
Image wird nicht neu gebaut: Nutzen Sie docker compose build --no-cache um den Build-Cache zu umgehen.
Docker Compose Anleitung: Migration von docker-compose v1 zu v2
Wenn Sie noch ältere Tutorials mit docker-compose (Bindestrich, v1) nutzen, hier die wichtigsten Änderungen für v2 laut dieser Docker Compose Anleitung: Der Befehl heißt jetzt docker compose ohne Bindestrich. Das version:-Feld in der docker-compose.yml ist optional geworden. Der links:-Parameter ist veraltet – nutzen Sie gemeinsame Networks. depends_on unterstützt jetzt condition: service_healthy. Mit docker compose convert können Sie prüfen, ob Ihre Konfiguration mit v2 kompatibel ist. Die Migration von v1 zu v2 ist in den meisten Fällen transparent – Ihre docker-compose.yml-Dateien funktionieren ohne Änderung weiter.
Benötigen Sie Unterstützung beim Containerisieren Ihrer Anwendungen nach dieser Docker Compose Anleitung? TOSMedia hilft.
Wer diese Docker Compose Anleitung konsequent umsetzt, profitiert dauerhaft von reproduzierbaren, wartbaren und skalierbaren Deployments. Docker Compose ist heute der Standard für containerisierte Anwendungen im KMU-Bereich und bleibt es auf absehbare Zeit. Die in dieser Docker Compose Anleitung gezeigten Patterns – Netzwerk-Segmentierung, Named Volumes, Health Checks, Ressourcen-Limits – gelten genauso für einfache Entwicklungsumgebungen wie für komplexe produktive Stacks. Starten Sie mit dem WordPress-Beispiel aus dieser Anleitung und passen Sie es auf Ihren Use-Case an.
Die konsequente Anwendung dieser Docker Compose Anleitung in allen Projekten schafft eine einheitliche Infrastruktur-Basis in Ihrem Team. Neue Entwickler verstehen das Deployment sofort, Ops-Teams können Services einfach überwachen, und Audits der Infrastruktur werden durch die deklarative YAML-Konfiguration deutlich einfacher.
→ Docker-Beratung anfragen | IT-Lösungen von TOSMedia | IT-Services | Docker Compose Dokumentation (offiziell) | Docker Hub

Christian Vetters


