linux-ubuntu-debian container docker compose orchestration

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 run Befehlen 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.yml in Git ein.
  • Env-Files: Trennen Sie Passwörter vom Code. Nutzen Sie eine .env Datei im gleichen Verzeichnis.
    # .env
    DB_PASSWORD=mein_geheimnis
    In der YAML dann: password: ${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