Docker Compose für Anfänger 2026
Docker Compose ist das wichtigste Tool für Self-Hosting. Mehrere Container in einer Datei definieren, mit einem Befehl starten. Wir zeigen, wie es funktioniert — für Anfänger verständlich.
Was ist Docker Compose?
Docker Compose ist ein Tool, um Multi-Container-Anwendungen zu definieren und zu verwalten. Statt lange docker run-Befehle zu tippen, schreiben Sie eine einzige YAML-Datei.
Ohne Docker Compose:
``
bash
docker run -d \
--name nextcloud \
-p 8080:80 \
-v nextcloud_data:/var/www/html \
-e MYSQL_HOST=db \
nextcloud:latest
`Mit Docker Compose:
`yaml
services:
nextcloud:
image: nextcloud:latest
ports:
- "8080:80"
volumes:
- nextcloud_data:/var/www/html
environment:
- MYSQL_HOST=db
`Ein Befehl:
docker compose up -d. Fertig.Installation
Docker + Compose installieren (Linux)
`bash
Docker Engine installieren
curl -fsSL https://get.docker.com | sudo shBenutzer zur docker-Gruppe hinzufügen
sudo usermod -aG docker $USERAusloggen und wieder einloggen (oder: su - $USER)
Test
docker compose version
`Docker Compose ist ab Docker 20.10+ integriert — kein separates Paket mehr nötig.
Die docker-compose.yml: Aufbau
`yaml
services: # Pflicht: definiert alle Container
webapp: # Name des Service
image: nginx:alpine # Docker Image
ports:
- "80:80" # Port-Mapping (Host:Container)
volumes:
- ./html:/usr/share/nginx/html # Volume-Mapping
depends_on:
- db # Start-Reihenfolge
restart: unless-stopped # Neustart-Policy
environment:
- NGINX_HOST=localhost db:
image: mariadb:11
environment:
- MYSQL_ROOT_PASSWORD=geheim123
volumes:
- db_data:/var/lib/mysql
restart: unless-stopped
volumes: # Named Volumes
db_data:
`Die wichtigsten Schlüssel
| Schlüssel | Bedeutung | Beispiel |
|-----------|-----------|---------|
|
image | Docker Image | nginx:alpine |
| build | Image selbst bauen | build: ./myapp |
| ports | Port-Mapping | "8080:80" |
| volumes | Dateien/Verzeichnisse einbinden | ./data:/app/data |
| environment | Umgebungsvariablen | MYSQL_PASSWORD=geheim |
| depends_on | Start-Reihenfolge | depends_on: [db] |
| restart | Neustart-Policy | unless-stopped |
| networks | Netzwerk-Zuordnung | networks: [frontend] |
| healthcheck | Gesundheits-Check | test: ["CMD", "curl", "-f", "http://localhost"] |Praxis-Beispiel 1: Nextcloud + MariaDB
`yaml
services:
nextcloud:
image: nextcloud:latest
ports:
- "8080:80"
volumes:
- nextcloud_data:/var/www/html
environment:
- MYSQL_HOST=db
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=nc_password
depends_on:
- db
restart: unless-stopped db:
image: mariadb:11
volumes:
- db_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root_password
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=nc_password
restart: unless-stopped
volumes:
nextcloud_data:
db_data:
`Starten:
`bash
docker compose up -d
`Nextcloud ist unter
http://localhost:8080 erreichbar.Praxis-Beispiel 2: Pi-hole (DNS Ad-Blocker)
`yaml
services:
pihole:
image: pihole/pihole:latest
ports:
- "53:53/tcp"
- "53:53/udp"
- "80:80/tcp"
environment:
TZ: "Europe/Berlin"
WEBPASSWORD: "geheim123"
volumes:
- ./etc-pihole:/etc/pihole
- ./etc-dnsmasq.d:/etc/dnsmasq.d
restart: unless-stopped
`Praxis-Beispiel 3: Media-Stack (Jellyfin + Sonarr + Radarr)
`yaml
services:
jellyfin:
image: jellyfin/jellyfin:latest
ports:
- "8096:8096"
volumes:
- ./config/jellyfin:/config
- /mnt/media:/media
restart: unless-stopped sonarr:
image: lscr.io/linuxserver/sonarr:latest
ports:
- "8989:8989"
volumes:
- ./config/sonarr:/config
- /mnt/media:/tv
- /mnt/downloads:/downloads
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Berlin
restart: unless-stopped
radarr:
image: lscr.io/linuxserver/radarr:latest
ports:
- "7878:7878"
volumes:
- ./config/radarr:/config
- /mnt/media:/movies
- /mnt/downloads:/downloads
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Berlin
restart: unless-stopped
`Die wichtigsten Befehle
| Befehl | Bedeutung |
|--------|-----------|
|
docker compose up -d | Startet alle Services (im Hintergrund) |
| docker compose down | Stoppt und entfernt alle Container |
| docker compose down -v | Stoppt und LÖSCHT Volumes (Achtung: Datenverlust!) |
| docker compose ps | Zeigt laufende Services |
| docker compose logs -f | Zeigt Logs (live folgen) |
| docker compose logs -f nextcloud | Logs eines spezifischen Services |
| docker compose restart nextcloud | Startet einen Service neu |
| docker compose pull | Lädt neue Images herunter |
| docker compose up -d | Startet mit neuen Images neu |
| docker compose stop | Stoppt ohne zu entfernen |
| docker compose start | Startet gestoppte Services |
| docker compose exec nextcloud bash | Öffnet Shell im Container |Best Practices
1. .env-Datei für Secrets
`env
.env (im gleichen Verzeichnis)
MYSQL_ROOT_PASSWORD=mein_sicheres_passwort
NEXTCLOUD_ADMIN_PASSWORD=admin_passwort
``yaml
docker-compose.yml
services:
db:
image: mariadb:11
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
`Die
.env-Datei niemals in Git commiten! .gitignore anpassen.2. Restart-Policy setzen
`yaml
restart: unless-stopped
`Startet Container automatisch neu — außer Sie stoppen sie manuell.
3. Named Volumes statt Bind Mounts (für Datenbanken)
`yaml
volumes:
- db_data:/var/lib/mysql # Named Volume (empfohlen für DBs)
- ./config:/config # Bind Mount (für Config-Dateien)
`4. Networks isolieren
`yaml
services:
webapp:
networks: [frontend, backend]
db:
networks: [backend]networks:
frontend:
backend:
`5. Healthchecks nutzen
`yaml
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
`FAQ
Was ist der Unterschied zwischen Docker und Docker Compose?
Docker ist die Engine, die Container ausführt. Docker Compose ist ein Tool, um mehrere Container in einer YAML-Datei zu definieren und gemeinsam zu starten.Brauche ich Kubernetes statt Docker Compose?
Für Heimanwender und kleine Setups: nein. Docker Compose reicht völlig. Kubernetes (oder k3s) ist für größere Deployments (10+ Server, Auto-Scaling) relevant.Kann ich Docker Compose-Dateien versionieren?
Ja, und das sollten Sie! Die docker-compose.yml in Git commiten. So haben Sie Ihre gesamte Infrastruktur als Code.Wo speichert Docker die Daten?
Named Volumes: /var/lib/docker/volumes/
Bind Mounts: Dort, wo Sie sie definieren (z. B. ./data)
Container-Daten (ephemeral): Werden beim down gelöschtKann ich mehrere docker-compose.yml haben?
Ja. Pro Projekt/Verzeichnis eine eigene Datei. Mit docker compose -p projektname up -d können Sie Projektnamen setzen.Fazit
Docker Compose ist das wichtigste Tool für Self-Hosting. Eine
docker-compose.yml definiert Ihre gesamte Infrastruktur. Ein Befehl (docker compose up -d) startet alles. Nutzen Sie .env-Dateien für Secrets, restart: unless-stopped` für Zuverlässigkeit und Named Volumes für wichtige Daten. Mit dieser Basis können Sie hunderte Services selbst hosten — Nextcloud, Jellyfin, Pi-hole, Home Assistant und vieles mehr.