··Bearbeitet:

Docker Compose Tutorial: Multi-Container-Apps einfach verwalten

Lerne Docker Compose von Grund auf - Dieses Tutorial erklärt, wie du Multi-Container-Anwendungen mit einer einzigen YAML-Datei verwaltest und warum Docker Compose für Selfhosting unverzichtbar ist.
Docker Compose Tutorial: Multi-Container-Apps einfach verwalten

Docker Compose Tutorial für Einsteiger

Im letzten Artikel haben wir uns angesehen, wie Docker unter der Haube funktioniert. Wir haben gelernt, was Images sind, wie der Daemon arbeitet und wie man einen einzelnen Container startet.

Aber mal ehrlich: Moderne Webanwendungen sind selten Einzelgänger.

Eine typische App besteht oft aus einem Frontend, einem Backend-Service, einer Datenbank wie PostgreSQL und vielleicht noch einem Caching-Layer wie Redis. Wenn du versuchst, das alles mit einzelnen docker run-Befehlen im Terminal zu jonglieren, verlierst du schnell den Überblick. Du müsstest Netzwerke manuell anlegen, IP-Adressen verwalten und die Startreihenfolge beachten.

Genau hier kommt Docker Compose ins Spiel.

Was ist Docker Compose?

Docker Compose ist ein Tool für Multi-Container-Anwendungen. Wenn das Dockerfile das Rezept für eine einzelne Komponente ist (zum Beispiel den Kuchen), dann ist Docker Compose die Speisekarte für das gesamte 3-Gänge-Menü.

Mit einer einzigen Datei, der docker-compose.yml, beschreibst du deine komplette Infrastruktur. Das Geniale: Du kannst deine gesamte Umgebung mit einem einzigen Befehl hochfahren.

Warum ist das gerade für Selfhosting wichtig?

Wenn du auf einem VPS deine eigenen Services hosten willst, brauchst du eine Lösung, die mehrere Container gleichzeitig verwaltet. Ohne Docker Compose wird das schnell unübersichtlich. Mit Docker Compose hast du alles im Griff. Eal ob du Nextcloud, GitLab oder eine WordPress-Instanz betreibst.

Die Anatomie der docker-compose.yml

Docker Compose nutzt YAML. Das ist ein Format, welches sowohl für Menschen als auch für Maschinen gut lesbar ist. Schauen wir uns die wichtigsten Bausteine an.

Services: Die einzelnen Container

Unter services definierst du die Container, die laufen sollen. Jeder Service bekommt einen Namen (zum Beispiel web oder db), den du später auch für die interne Kommunikation nutzen kannst.

Networks: Einfache Vernetzung

Früher war die Vernetzung von Containern kompliziert. Mit Docker Compose ist sie fast schon magisch. Services im gleichen Netzwerk können sich gegenseitig über ihren Service-Namen erreichen. Du musst keine IP-Adressen mehr hardcoden. Dein Backend ruft einfach db:5432 auf, und Docker leitet es an den Datenbank-Container weiter.

Volumes: Persistente Daten

Container sind vergänglich. Wenn du einen Datenbank-Container löschst, sind die Daten weg. Außer du nutzt Volumes. In der Compose-Datei definierst du, wo Daten persistent auf deinem Host-System gespeichert werden.

Hier ist ein praktisches Beispiel für ein Setup mit Web-App und Datenbank:

version: '3.8'

services:
  webapp:
    build: ./app
    ports:
      - '8080:80'
    depends_on:
      - database
    environment:
      - DB_HOST=database
      - DB_USER=${DB_USER}
      - DB_PASS=${DB_PASSWORD}
    restart: unless-stopped

  database:
    image: postgres:15-alpine
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
    restart: unless-stopped

volumes:
  db_data:

Hinweis: Die Variablen wie ${DB_USER} sind Umgebungsvariablen. Dazu gleich mehr.

Die wichtigsten Docker Compose Befehle

Docker Compose macht deinen Workflow extrem effizient. Statt langer Shell-Scripte brauchst du nur eine Handvoll Befehle:

Container starten:

docker-compose up -d

Dieser Befehl liest deine Konfiguration, lädt die nötigen Images, erstellt Netzwerke und startet alle Container im Hintergrund (-d für detached).

Status checken:

docker-compose ps

Zeigt dir sofort, welche Services laufen, welche Ports belegt sind und ob ein Container abgestürzt ist.

Logs ansehen:

docker-compose logs -f

Wichtig fürs Debugging. Hiermit siehst du die Log-Ausgaben aller Services gebündelt in einem Stream.

Container stoppen:

docker-compose down

Stoppt die Container und räumt die Netzwerke auf. Sauber und ordentlich.

Container neu bauen:

docker-compose up -d --build

Wenn du Änderungen am Code gemacht hast, baut dieser Befehl die Images neu und startet die Container.

Umgebungsvariablen und Sicherheit

Im Code-Beispiel oben haben wir ${DB_PASSWORD} verwendet. Hardcodierte Passwörter in einer yml-Datei sind ein Sicherheitsrisiko – besonders wenn du den Code auf GitHub pushst.

Docker Compose unterstützt .env-Dateien automatisch. Leg eine Datei namens .env im gleichen Ordner an und pflege die Variablen:

DB_USER=admin
DB_PASSWORD=supergeheim

Wichtig für die Sicherheit:

  • Füge .env zu deiner .gitignore hinzu
  • Nutze auf dem Produktionsserver andere Passwörter als lokal
  • Vergib niemals Standard-Passwörter wie "admin123"

Docker Compose für Selfhosting auf deinem VPS

Warum ist Docker Compose perfekt für Selfhosting?

1. Einfaches Setup auf einem VPS Du loggst dich per SSH auf deinen Hetzner-Server ein, lädst deine docker-compose.yml hoch und startest mit einem Befehl deine komplette Infrastruktur.

2. Reproduzierbare Umgebungen Deine lokale Entwicklung sieht genauso aus wie dein Produktionsserver. Kein "Auf meinem Rechner läuft es aber!"-Problem mehr.

3. Einfache Updates Neue Version deiner App? Ändere das Image-Tag in der docker-compose.yml, führe docker-compose pull und docker-compose up -d aus – fertig.

4. Ressourcen-Effizienz Auf einem VPS mit 4GB RAM kannst du locker 5-10 kleinere Services gleichzeitig hosten, dank der schlanken Container-Architektur.

Praxis-Beispiel: WordPress mit MySQL auf Hetzner

Hier ein komplettes Beispiel, wie du WordPress selbst hosten kannst:

version: '3.8'

services:
  wordpress:
    image: wordpress:latest
    ports:
      - '80:80'
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: ${DB_USER}
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress_data:/var/www/html
    depends_on:
      - db
    restart: unless-stopped

  db:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql
    restart: unless-stopped

volumes:
  wordpress_data:
  db_data:

So startest du es auf deinem Server:

# Docker Compose Datei hochladen
scp docker-compose.yml root@dein-server.de:/opt/wordpress/

# Auf dem Server
ssh root@dein-server.de
cd /opt/wordpress
echo "DB_USER=wpuser" > .env
echo "DB_PASSWORD=sicheres-passwort" >> .env
echo "DB_ROOT_PASSWORD=noch-sichereres-passwort" >> .env

# Starten
docker-compose up -d

Häufige Probleme und Lösungen

Problem: Container startet nicht

docker-compose logs service-name

Schau dir die Logs an. Meist fehlt eine Umgebungsvariable oder ein Volume-Pfad existiert nicht.

Problem: Port schon belegt Ändere in der docker-compose.yml den Port links vom Doppelpunkt: "8080:80" statt "80:80"

Problem: Container kann nicht auf andere Services zugreifen Prüfe, ob alle Services im gleichen Netzwerk sind und ob die Service-Namen richtig geschrieben sind.

Best Practices für Docker Compose

  1. Nutze immer restart: unless-stopped Damit starten deine Container nach einem Server-Neustart automatisch
  2. Trenne Entwicklung und Produktion Nutze separate Compose-Dateien: docker-compose.yml für Entwicklung, docker-compose.prod.yml für Produktion
  3. Verwalte Secrets sicher Nutze .env-Dateien für lokale Entwicklung und Docker Secrets oder Umgebungsvariablen für Produktion
  4. Verwende Healthchecks Damit Docker automatisch prüft, ob deine Services wirklich laufen
  5. Limitiere Ressourcen Besonders auf kleineren VPS wichtig – verhindert, dass ein Container alle Ressourcen frisst

Von lokal zu produktiv: Der Deployment-Workflow

So sieht ein typischer Workflow aus:

  1. Lokal entwickeln
docker-compose up -d
# Code ändern, testen
docker-compose restart webapp
  1. Auf Server deployen
# Code zum Server pushen (Git, rsync, scp)
ssh user@server
docker-compose pull
docker-compose up -d --build
  1. Überwachen
    docker-compose logs -f
    docker-compose ps
    

Fazit: Docker Compose für Selfhosting

Docker Compose verwandelt das Chaos einzelner Container in ein gut organisiertes System. Es ist das Tool, das dich vom "Rumspielen mit Docker" zum "Betreiben echter Produktivumgebungen" bringt.

Die wichtigsten Vorteile:

  • Alles an einem Ort: Die gesamte Konfiguration liegt in einer Datei
  • Isolierte Umgebungen: Du kannst mehrere Projekte parallel auf einem Server laufen lassen
  • Einfache Vernetzung: Container kommunizieren über DNS-Namen
  • Perfekt für Selfhosting: Ideal für VPS-Hosting auf dem Anbieter deiner Wahl

Ob du nun einen Blog, eine Cloud-Speicher-Lösung oder ein Monitoring-System hosten willst, Docker Compose macht es einfach, wartbar und reproduzierbar.

Nächste Schritte:

  • Schnapp dir einen günstigen VPS
  • Installiere Docker und Docker Compose
  • Starte mit einem einfachen Hobby-Projekt
  • Erweitere Schritt für Schritt deine Infrastruktur

Möchtest du mehr über Deployment-Strategien und Selfhosting erfahren? Schau dir unsere Hosting-Lösungen auf lowcloud.io an – optimiert für Docker und moderne Container-Workflows.