Docker im Homelab: Container-Setup für Anfänger
Docker installieren, Container starten und Services mit Docker Compose verwalten
Docker ist das Herzstück jedes modernen Homelabs. Statt Software direkt auf deinem Server zu installieren, verpackst du alles in isolierte Container. Das Ergebnis: Sauberes System, einfache Updates und du kannst in wenigen Minuten neue Services aufsetzen.
In diesem Guide lernst du alles von der Installation bis zum fertigen Multi-Container-Setup mit Docker Compose. Am Ende läuft Portainer und Pi-hole auf deinem Homelab.
Was ist Docker?
Docker ist eine Container-Plattform. Ein Container ist wie eine Mini-VM, nur viel leichter und schneller. Jeder Container hat seine eigene isolierte Umgebung mit allen Abhängigkeiten, die er braucht.
Warum Docker im Homelab?
- Isolation: Jeder Service läuft unabhängig. Wenn Pi-hole abstürzt, läuft Nextcloud weiter
- Einfache Installation: Statt 20 Befehle einzutippen, startest du einen Container mit einer Zeile
- Portabilität: Container laufen überall gleich -- egal ob Mini-PC, VPS oder Raspberry Pi
- Sauberes System: Kein Dependency-Chaos. Deinstallieren heißt Container löschen, fertig
- Einfache Updates: Neues Image ziehen, Container neu starten. Dauert Sekunden
Gut zu wissen: Docker Container teilen sich den Kernel des Host-Systems. Sie sind deshalb viel ressourcenschonender als echte virtuelle Maschinen. Ein Mini-PC mit 8 GB RAM kann locker 10-20 Container gleichzeitig laufen lassen.
Docker installieren (Ubuntu/Debian)
Die folgende Anleitung funktioniert auf Ubuntu 22.04/24.04 und Debian 11/12. Wir installieren Docker aus dem offiziellen Docker-Repository, nicht die veraltete Version aus den Standard-Paketquellen.
Noch keinen Server? Für Docker-Setups mit 5–10 Containern reicht ein günstiger VPS. IONOS vServer (Affiliate-Link) startet bei 3 €/Monat im ersten Jahr, voll-virtualisiert und mit Root-Zugriff — perfekt zum Lernen und für kleine Homelab-Stacks.
1. System aktualisieren und Abhängigkeiten installieren
sudo apt update && sudo apt upgrade -y
sudo apt install ca-certificates curl gnupg lsb-release -y
2. Docker GPG-Key und Repository hinzufügen
# Docker GPG-Key hinzufügen
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Repository hinzufügen
echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Für Debian ersetzt du ubuntu in der URL durch debian.
3. Docker installieren
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
4. Docker ohne sudo nutzen
Damit du nicht jedes Mal sudo vor Docker-Befehle schreiben musst:
sudo usermod -aG docker $USER
Danach einmal ab- und wieder anmelden (oder newgrp docker ausführen), damit die
Gruppenzugehörigkeit aktiv wird.
5. Installation prüfen
docker --version
Die Ausgabe sollte so ähnlich aussehen:
Docker version 27.x.x, build xxxxxxx
Erster Container starten
Jetzt wird es spannend. Wir starten unseren ersten Container.
Hello World
docker run hello-world
Docker lädt das hello-world-Image herunter, startet einen Container und gibt eine
Willkommensnachricht aus. Wenn du "Hello from Docker!" siehst, funktioniert alles.
Nginx Webserver starten
Etwas Nützlicheres: Ein Nginx-Webserver in einem Container.
docker run -d --name mein-nginx -p 8080:80 nginx
Was passiert hier?
-d-- Container läuft im Hintergrund (detached)--name mein-nginx-- Gibt dem Container einen Namen-p 8080:80-- Port 8080 auf deinem Rechner wird auf Port 80 im Container gemapptnginx-- Das Docker-Image, das verwendet wird
Öffne jetzt http://deine-ip:8080 im Browser. Du siehst die Nginx-Willkommensseite.
Ein ganzer Webserver in einem einzigen Befehl.
Container wieder stoppen und entfernen:
docker stop mein-nginx
docker rm mein-nginx
Docker Compose installieren
Einzelne Container per Hand starten funktioniert, aber im Homelab willst du meistens mehrere Services gleichzeitig betreiben. Dafür gibt es Docker Compose.
Mit Docker Compose definierst du alle Container in einer einzigen YAML-Datei und startest sie mit einem Befehl. Konfiguration als Code -- versionierbar, reproduzierbar, teilbar.
Hinweis: Wenn du Docker nach der obigen Anleitung installiert hast, ist
Docker Compose bereits enthalten (als Plugin docker compose). Du brauchst nichts
extra zu installieren. Der Befehl lautet docker compose (mit Leerzeichen, nicht
docker-compose).
Prüfe die Version:
docker compose version
Ausgabe:
Docker Compose version v2.x.x
Erstes Docker Compose Setup: Portainer + Pi-hole
Jetzt bauen wir ein echtes Setup auf: Portainer als Docker-Management-UI und Pi-hole als
netzwerkweiten Werbeblocker. Die folgende docker-compose.yml kannst du direkt
kopieren und verwenden.
Projektverzeichnis anlegen
mkdir -p ~/homelab && cd ~/homelab
docker-compose.yml erstellen
Erstelle die Datei ~/homelab/docker-compose.yml mit folgendem Inhalt:
version: "3.8"
services:
# Portainer - Docker Management UI
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: unless-stopped
ports:
- "9443:9443"
- "9000:9000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
environment:
- TZ=Europe/Berlin
# Pi-hole - Netzwerkweiter Werbeblocker
pihole:
image: pihole/pihole:latest
container_name: pihole
restart: unless-stopped
ports:
- "53:53/tcp"
- "53:53/udp"
- "8080:80/tcp"
volumes:
- pihole_etc:/etc/pihole
- pihole_dnsmasq:/etc/dnsmasq.d
environment:
- TZ=Europe/Berlin
- WEBPASSWORD=dein-sicheres-passwort
- FTLCONF_LOCAL_IPV4=192.168.1.100
dns:
- 127.0.0.1
- 1.1.1.1
volumes:
portainer_data:
pihole_etc:
pihole_dnsmasq:
Wichtig: Ersetze dein-sicheres-passwort durch ein echtes Passwort
für das Pi-hole Web-Interface. Ersetze 192.168.1.100 durch die IP-Adresse deines
Homelab-Servers.
Container starten
docker compose up -d
Docker lädt jetzt die Images herunter und startet beide Container im Hintergrund. Das dauert beim ersten Mal ein paar Minuten.
Zugriff auf die Services:
- Portainer:
https://deine-ip:9443(beim ersten Zugriff erstellst du einen Admin-Account) - Pi-hole:
http://deine-ip:8080/admin(Passwort wie oben gesetzt)
Alle Container stoppen
# Stoppen (Container bleiben erhalten)
docker compose stop
# Stoppen und Container entfernen (Daten in Volumes bleiben erhalten)
docker compose down
Wichtige Docker-Befehle
Diese Befehle wirst du ständig brauchen. Am besten ausdrucken oder bookmarken.
Container verwalten
# Alle laufenden Container anzeigen
docker ps
# Alle Container anzeigen (auch gestoppte)
docker ps -a
# Container stoppen
docker stop container-name
# Container starten
docker start container-name
# Container neustarten
docker restart container-name
# Container entfernen (muss gestoppt sein)
docker rm container-name
# Container stoppen und sofort entfernen
docker rm -f container-name
Images verwalten
# Alle heruntergeladenen Images anzeigen
docker images
# Image herunterladen (ohne Container zu starten)
docker pull nginx:latest
# Unbenutzte Images aufräumen
docker image prune -a
Logs und Debugging
# Logs eines Containers anzeigen
docker logs container-name
# Logs live verfolgen (wie tail -f)
docker logs -f container-name
# Letzte 50 Zeilen anzeigen
docker logs --tail 50 container-name
# In einen laufenden Container "einsteigen"
docker exec -it container-name /bin/bash
# Einen Befehl im Container ausführen
docker exec container-name ls /var/log
Aufräumen
# Alles aufräumen (gestoppte Container, unbenutzte Images, Netzwerke)
docker system prune -a
# Speicherverbrauch von Docker anzeigen
docker system df
Volumes und Persistente Daten
Container sind vergänglich. Wenn du einen Container löschst, sind normalerweise alle Daten weg. Volumes lösen dieses Problem -- sie speichern Daten unabhängig vom Container.
Es gibt zwei Wege, Daten persistent zu speichern:
1. Named Volumes (empfohlen)
Docker verwaltet den Speicherort selbst. Einfach und sicher:
# In docker-compose.yml
services:
nextcloud:
image: nextcloud:latest
volumes:
- nextcloud_data:/var/www/html
volumes:
nextcloud_data:
# Volumes anzeigen
docker volume ls
# Details eines Volumes anzeigen
docker volume inspect nextcloud_data
2. Bind Mounts (lokale Ordner)
Du bestimmst den Speicherort selbst. Praktisch für Configs oder wenn du direkt auf die Dateien zugreifen willst:
# In docker-compose.yml
services:
nginx:
image: nginx:latest
volumes:
- ./nginx/html:/usr/share/nginx/html
- ./nginx/conf:/etc/nginx/conf.d
Tipp: Für wichtige Daten (Datenbanken, Nextcloud-Dateien) nutze Named Volumes. Für Config-Dateien, die du oft bearbeiten willst, nutze Bind Mounts. Und ganz wichtig: Mach Backups deiner Volumes!
# Backup eines Named Volumes erstellen
docker run --rm -v nextcloud_data:/data -v $(pwd):/backup \
alpine tar czf /backup/nextcloud-backup.tar.gz -C /data .
Nützliche Container für das Homelab
Hier sind die beliebtesten Services, die Homelab-Betreiber als Docker-Container laufen lassen. Alle lassen sich einfach per Docker Compose hinzufügen.
Portainer
Docker-Management mit Web-UI
- Grafische Oberfläche für Container, Images, Volumes und Netzwerke
- Container starten, stoppen, Logs ansehen -- alles per Klick
- Perfekt für Einsteiger, die nicht alles in der Kommandozeile machen wollen
Pi-hole
Netzwerkweiter Werbeblocker
- Blockt Werbung und Tracker für alle Geräte im Netzwerk
- DNS-basiert: Funktioniert auch auf Smart-TVs und Smartphones
- Detaillierte Statistiken über DNS-Anfragen
Nextcloud
Eigene Cloud-Lösung (Dropbox-Alternative)
- Dateien synchronisieren, Kalender, Kontakte, Notizen
- Apps für Desktop und Smartphone verfügbar
- Volle Kontrolle über deine Daten
Jellyfin
Medienserver (Netflix-Alternative)
- Filme, Serien, Musik und Fotos streamen
- Kostenlos und Open Source (im Gegensatz zu Plex)
- Apps für Smart-TV, Smartphone, Fire TV Stick
Uptime Kuma
Service-Monitoring
- Überwacht, ob deine Services online sind
- Benachrichtigungen per Telegram, Discord, E-Mail
- Schicke Status-Seite für deine Services
Homepage
Dashboard für dein Homelab
- Zeigt alle deine Services auf einer übersichtlichen Seite
- Widgets für Docker-Status, System-Infos, Wetter etc.
- Komplett per YAML konfigurierbar
Schnellstart: Alle Services auf einen Blick
# Uptime Kuma
docker run -d --name uptime-kuma -p 3001:3001 \
-v uptime-kuma:/app/data --restart unless-stopped \
louislam/uptime-kuma:latest
# Jellyfin
docker run -d --name jellyfin -p 8096:8096 \
-v jellyfin-config:/config -v /pfad/zu/medien:/media \
--restart unless-stopped jellyfin/jellyfin:latest
# Homepage Dashboard
docker run -d --name homepage -p 3000:3000 \
-v homepage-config:/app/config \
--restart unless-stopped ghcr.io/gethomepage/homepage:latest
Tipps und Best Practices
Container aktuell halten
Docker-Images werden regelmäßig aktualisiert (Sicherheitspatches, neue Features). So updatest du deine Container:
# Neue Images herunterladen
docker compose pull
# Container mit neuen Images neu starten
docker compose up -d
# Alte, unbenutzte Images aufräumen
docker image prune -a
Tipp: Tools wie Watchtower können deine Container automatisch updaten. Für ein Homelab sehr praktisch, für Produktivsysteme eher nicht empfohlen.
Logging richtig einrichten
Docker-Logs können schnell viel Speicherplatz verbrauchen. Begrenze die Log-Größe global in der Docker-Daemon-Konfiguration:
# /etc/docker/daemon.json erstellen oder bearbeiten
sudo nano /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
# Docker Daemon neu starten
sudo systemctl restart docker
Damit wird jede Log-Datei maximal 10 MB groß und es werden maximal 3 Dateien pro Container aufbewahrt.
Docker-Netzwerke nutzen
Standardmäßig können sich alle Container gegenseitig erreichen. Für mehr Sicherheit und Übersicht erstelle eigene Netzwerke:
# In docker-compose.yml
services:
nextcloud:
image: nextcloud:latest
networks:
- frontend
- backend
db:
image: mariadb:latest
networks:
- backend
networks:
frontend:
backend:
In diesem Beispiel kann nextcloud auf die Datenbank zugreifen, aber die Datenbank
ist nicht direkt aus dem Frontend-Netzwerk erreichbar. So isolierst du Services voneinander.
Backup nicht vergessen
- Sichere deine
docker-compose.ymlDateien (am besten in einem Git-Repository) - Erstelle regelmäßige Backups deiner Volumes
- Teste die Wiederherstellung -- ein Backup das nicht funktioniert ist kein Backup
Ressourcen begrenzen
Verhindere, dass ein einzelner Container alle Ressourcen frisst:
# In docker-compose.yml
services:
nextcloud:
image: nextcloud:latest
deploy:
resources:
limits:
memory: 1G
cpus: "1.0"
Zusammenfassung
Das hast du in diesem Guide gelernt:
- Docker auf Ubuntu/Debian installieren
- Container starten und verwalten
- Docker Compose für Multi-Container-Setups nutzen
- Portainer und Pi-hole aufsetzen
- Volumes für persistente Daten verwenden
- Wichtige Docker-Befehle für den Alltag
- Best Practices für ein stabiles Homelab
Docker ist der Einstieg in eine ganz neue Welt. Sobald du das Prinzip verstanden hast, wirst du kaum noch Software direkt auf dem Host installieren wollen. Fang mit Portainer und Pi-hole an, und erweitere dein Setup Schritt für Schritt.
Viel Spaß beim Experimentieren! Und keine Sorge -- wenn etwas schiefgeht, löschst du den Container einfach und fängst neu an. Das ist das Schöne an Docker.
Wenn du Docker-Container auch außerhalb des Heimnetzes erreichbar machen willst, sind günstige VPS hilfreich — die aktuellen Codes findest du bei HostDealHero.