software

Docker Compose für Anfänger 2026

Docker Compose Tutorial 2026: Mehrere Container definieren, starten und verwalten. Praxis-Anleitung mit Beispielen für Heimanwender.

von Ultrion Redaktion2026-08-075 Min Lesezeit
Werbung (AdSense — In-Article)


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 sh

Benutzer zur docker-Gruppe hinzufügen


sudo usermod -aG docker $USER

Ausloggen 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öscht
  • Kann 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.

    Werbung (AdSense — In-Article Bottom)

    Verwandte Artikel