Docker Compose: Multi-Container Apps (Artikel 038)
Verwaltung komplexer Applikations-Stacks mit Docker Compose. Erstellung von YAML-Konfigurationen, Vernetzung von Containern und automatisierte Bereitstellung.
# Docker Compose: Das Orchester für Microservices
TL;DR / Management Summary Niemand will komplexe Applikationen mit 20-zeiligen
docker runBefehlen starten. Docker Compose erlaubt es, die gesamte Infrastruktur einer Applikation (Webserver, Datenbank, Cache, Worker) in einer einzigen YAML-Datei deklarativ zu beschreiben. Es automatisiert die Erstellung von Netzwerken, das Mounten von Volumes und stellt sicher, dass Abhängigkeiten (z.B. “DB muss vor Web starten”) eingehalten werden.
# 1. Einführung & Konzepte
Deklarativ statt Imperativ.
Statt Befehle nacheinander einzutippen, beschreiben wir den Zielzustand. Docker Compose sorgt dafür, dass dieser Zustand erreicht wird.
# Die drei Säulen (Mermaid)
graph TD
A[docker-compose.yml] --> B[Services: The Containers]
A --> C[Networks: Communication]
A --> D[Volumes: Persistence]
B -->|Depends on| B
# 2. Die Anatomie der YAML-Datei
Ein praxisnahes Beispiel.
Wir bauen einen klassischen Stack: Nginx Webserver + MariaDB Datenbank.
Datei: docker-compose.yml
version: '3.8'
services:
db:
image: mariadb:10.6
restart: always
environment:
MYSQL_ROOT_PASSWORD: secret_pass
MYSQL_DATABASE: myapp
volumes:
- db_data:/var/lib/mysql
web:
image: nginx:latest
restart: always
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
volumes:
db_data:
# 3. Management-Befehle
Das tägliche Handwerkszeug.
Seit Docker V2 (Plugin) wird Compose ohne Bindestrich aufgerufen: docker compose.
# Stack im Hintergrund starten
docker compose up -d
# Status der Container im aktuellen Verzeichnis
docker compose ps
# Logs aller Services live verfolgen
docker compose logs -f
# Stack stoppen und Container entfernen
docker compose down
# 4. Day-2 Operations: Skalierung & Updates
Den Stack am Laufen halten.
# Updates einspielen
Wenn Sie ein neues Image ziehen wollen:
docker compose pull
docker compose up -d
Docker erkennt, ob sich das Image geändert hat und startet nur die betroffenen Container neu.
# Horizontale Skalierung
# Startet 3 Instanzen des 'web' Services (Vorsicht: Port-Konflikte beachten!)
docker compose up -d --scale web=3
# 5. Troubleshooting & “War Stories”
Wenn der Stack nicht spricht.
# Story 1: “Der Hostname-Irrtum”
Symptom: Die Web-App kann die Datenbank nicht finden, obwohl sie db in der Config nutzt.
Ursache: Docker Compose erstellt ein eigenes Netzwerk. Container können sich gegenseitig über ihren Service-Namen erreichen. Wenn ein Container aber im host Netzwerk-Modus läuft, funktioniert dieses DNS nicht.
Lösung: Nutzen Sie immer das Standard-Bridge-Netzwerk von Compose und verlassen Sie sich auf die Service-Namen (db, redis, etc.) statt auf IP-Adressen.
# Story 2: “Datenverlust nach ‘down’”
Symptom: Alle Datenbank-Inhalte sind nach docker compose down verschwinden.
Ursache: Es wurden keine Volumes definiert oder die Pfade waren falsch. Ohne Volume sind Daten innerhalb eines Containers flüchtig.
Lösung: Nutzen Sie benannte Volumes (volumes: [data:/var/lib/mysql]) oder Bind-Mounts für Persistenz.
# 6. Best Practices
- Versionierung: Checken Sie Ihre
docker-compose.ymlin Git ein. - Env-Files: Trennen Sie Passwörter vom Code. Nutzen Sie eine
.envDatei im gleichen Verzeichnis.
In der YAML dann:# .env DB_PASSWORD=mein_geheimnispassword: ${DB_PASSWORD}. - Ressourcen: Limitieren Sie RAM und CPU pro Service, um “Noisy Neighbor” Effekte zu verhindern.
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Syntax-Check | docker compose config |
| Einzelnen Service neu starten | docker compose restart web |
| Befehl im Container ausführen | docker compose exec db mariadb -u root -p |
| Unbenutzte Images entfernen | docker image prune |
| Nur stoppen (ohne Entfernen) | docker compose stop |