Block 6 – Compose (Optional)
Dauer: ca. 20 Minuten
Ziel: Compose-Dateien lesen, verstehen und einen Stack debuggen.
⚡ Dieser Block ist optional – er wird durchgeführt wenn Zeit vorhanden ist.
6.1 Was ist Compose?
Compose erlaubt es, mehrere Container gemeinsam zu definieren, zu starten und zu verwalten – in einer einzigen Datei.
"Compose ist wie ein Shell-Skript das alle
podman run-Befehle für dich ausführt – aber deklarativ und reproduzierbar."
Ohne Compose: Mit Compose:
podman network create netz podman compose up
podman run -d \
--name nginx \
--network netz \
-p 8100:80 \
-v ~/web:/usr/share/nginx/html \
nginx
podman run -d \
--name backend \
--network netz \
httpd
6.2 compose.yaml lesen
# compose.yaml
services:
nginx: # Service-Name = Container-Name
image: docker.io/library/nginx:latest
ports:
- "8100:80" # Host:Container
volumes:
- ./webroot:/usr/share/nginx/html:ro
networks:
- app-netz
depends_on:
- backend # Erst backend starten
backend:
image: docker.io/library/httpd:latest
networks:
- app-netz
environment:
- APP_ENV=production
volumes:
- app-data:/var/www/html # Named Volume
networks:
app-netz: # Custom Netzwerk
volumes:
app-data: # Named Volume
Was lese ich hier?
| Element | Bedeutung |
|---|---|
services |
Container die gestartet werden |
image |
Welches Image |
ports |
Port-Forwarding |
volumes |
Bind Mounts oder Named Volumes |
networks |
In welchem Netzwerk |
environment |
Umgebungsvariablen |
depends_on |
Startreihenfolge |
6.3 Compose-Befehle
# Stack starten (im Verzeichnis mit compose.yaml)
podman compose up -d # -d = im Hintergrund
# Stack stoppen
podman compose down
# Logs des ganzen Stacks
podman compose logs
podman compose logs -f # Live
# Logs eines bestimmten Services
podman compose logs nginx
# Status
podman compose ps
# Einzelnen Service neu starten
podman compose restart nginx
# In Service einsteigen
podman compose exec nginx bash
6.4 Compose debuggen
Häufige Fehler und wie man sie findet:
# Stack startet nicht – zuerst Logs
podman compose up # Ohne -d um Output zu sehen
podman compose logs
# Einzelner Service läuft nicht
podman compose ps # Status prüfen
podman compose logs backend # Logs des Services
# Netzwerk-Probleme
podman compose exec nginx curl http://backend
# Volumes prüfen
podman volume ls
podman volume inspect app-data
Übung 6 – Stack analysieren und debuggen (optional)
Aufgabe 6a – Compose-Datei erstellen und starten
mkdir -p ~/compose-demo && cd ~/compose-demo
mkdir -p webroot
echo "<h1>Compose Demo</h1>" > webroot/index.html
cat > compose.yaml << 'EOF'
services:
nginx:
image: docker.io/library/nginx:latest
ports:
- "8100:80" # deinen Port hier eintragen (aus ~/.kurs-info)
volumes:
- ./webroot:/usr/share/nginx/html:ro
networks:
- demo-netz
depends_on:
- backend
backend:
image: docker.io/library/httpd:latest
networks:
- demo-netz
networks:
demo-netz:
EOF
podman compose up -d
podman compose ps
curl http://localhost:${PORT}
Aufgabe 6b – Stack debuggen
Ersetze die compose.yaml mit dieser fehlerhaften Version und finde den Fehler:
services:
nginx:
image: docker.io/library/nginx:latest
ports:
- "8100:80" # deinen Port hier eintragen (aus ~/.kurs-info)
volumes:
- ./webroot:/usr/share/nginx/html:ro
networks:
- demo-netz
backend:
image: docker.io/library/httpd:latest
networks:
- anderes-netz # ← Fehler hier
networks:
demo-netz:
podman compose down
podman compose up -d
podman compose exec nginx curl http://backend
# → Was passiert?
Musterlösung 6b
podman compose exec nginx curl http://backend
# curl: Could not resolve host: backend
# Ursache: nginx ist in demo-netz, backend in anderes-netz
# → Kein gemeinsames Netzwerk → kein DNS
# Fix: beide in demo-netz
Weiterführende Links
| Thema | Link |
|---|---|
| podman compose | github.com/containers/podman compose |
| Compose Spec | compose-spec.io |