Zum Inhalt

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

Thema Link
podman compose github.com/containers/podman compose
Compose Spec compose-spec.io