Ob man ein kleines Heimnetzwerk betreibt oder ein ausgewachsenes Homelab - Docker bietet mit Docker Compose eine flexible und saubere Möglichkeit, Dienste zu betreiben, zu vernetzen und zu verwalten.
Als ich vor einigen Jahren meinen ersten Docker-Container gestartet habe, hätte ich nicht gedacht, dass sich daraus ein zentrales Fundament meines Homelabs entwickeln würde. Anfangs war Docker für mich nur ein praktisches Tool, um schnell einen einzelnen Dienst bereitzustellen.
Heute laufen bei mir dutzende Services. Sie sind verteilt auf vier Linux-Systeme, organisiert und gesteuert mit Docker Compose und verbunden in einem eigenen Docker-Netzwerk.
Docker ist inzwischen so tief in meinen Alltag integriert, dass ich viele meiner Dienste nicht mehr anders betreiben möchte. Es macht Deployments reproduzierbar, Updates kontrollierbar und das Management deutlich einfacher - egal ob auf einem Mini-PC, einem Server im Rack oder einer kleinen virtuellen Maschine.
Docker installieren auf unterschiedlichen Linux-Systemen
Einer der Gründe, warum ich Docker so gerne nutze, ist die Flexibilität bei der Installation. In meinem Homelab setze ich verschiedene Linux-Distributionen ein - und Docker läuft überall:
- Alpine Linux: Ideal für minimalistische Setups, Installation über
apk
in wenigen Sekunden. - Arch Linux: Dank
pacman
und dem offiziellen docker-Paket ist die Installation schnell erledigt. - Debian / Ubuntu: Über das Docker-Repository bekomme ich aktuelle Versionen direkt per
apt
.
Zusätzlich installiere ich Docker Compose, damit ich alle Systeme mit der gleichen Syntax steuern kann.
Hinweis: In meinen Beispielen nutze ich unter Alpine Linux den Befehl
doas
(ähnlich wiesudo
), da Alpine standardmäßigsudo
nicht mitbringt. Auf allen anderen Systemen verwende ichsudo
.
Alpine Linux
doas apk add docker docker-compose
Den Docker-Dienst automatisch beim Boot starten lassen und den Benutzer zur Gruppe docker
hinzufügen:
doas rc-update add docker default
doas /etc/init.d/docker start
doas addgroup $USER docker
Arch Linux
sudo pacman -S docker docker-compose
Debian / Ubuntu
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# Install the Docker packages
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Unter Arch Linux und Ubuntu startet der Docker-Dienst automatisch aber mit folgendem Befehl kann er manuell gestartet werden:
sudo systemctl start docker
Und auch hier sollte der Benutzer der Gruppe docker
hinzugefügt werden:
sudo usermod -aG docker $USER
Nach der Installation können einmal folgende Befehle ausprobiert werden, um zu sehen, ob alles geklappt hat:
docker info
docker ps
Datenorganisation und Volumes
Einer meiner Grundsätze im Homelab: Trenne Konfiguration und Daten vom Container. Ich strukturiere meine Volumes klar nach Diensten, z. B.:
# Konfiguration
~/docker-compose/
├── traefik/
├── komodo/
├── jellyfin/
├── frigate/
# Daten und Volumes
~/docker/
├── traefik/
├── komodo/
├── jellyfin/
├── frigate/
So kann ich nicht nur schnell Backups erstellen, sondern auch Dienste verschieben oder neu aufsetzen, ohne dass Daten verloren gehen.
Zum Thema Backup werde ich noch einen separaten Artikel schreiben, in dem Restic die Hauptrolle spielen wird.
Docker Networking - das unsichtbare Rückgrat
Einer der größten Gamechanger für mich war Docker Networking.
Anstatt dass jeder Dienst irgendwo zufällig im Netzwerk hängt, habe ich ein eigenes internes Netzwerk für meine Container erstellt. Dienste können so direkt miteinander sprechen, ohne dass Ports unnötig nach außen offen sind.
In Kombination mit Traefik (mehr dazu im nächsten Artikel) kann ich jeden Dienst bequem über eine Subdomain erreichen - egal ob komodo.meinedomain.com
oder jellyfin.meinedomain.com
.
Für mich bedeutet das: Keine wilden Portnummern mehr merken und ein sauberes, zentrales Routing.
Macvlan oder IPvlan für Docker einrichten
Ich habe mich letztendlich für IPvlan entschieden und mir damit mein Docker-Netzwerk aufgebaut. Mehr Details darüber wird es sicherlich im Traefik Blogpost geben, aber hier einmal die Befehle zum Erstellen des Proxy Netzwerks:
sudo docker network create -d ipvlan --subnet 192.168.x.x/24 --gateway 192.168.x.x -o parent=enp1s0f0 proxy
Den Namen von der Netzwerkkarte des Servers herausfinden mit:
ip address show
Die Netzwerkkarte des sumpfgeist.lan
Servers heißt enp1s0f0
und diesen Namen nutzte ich zur Konfiguration für das Docker IPvlan.
Eine wichtige Information bei der Verwendung dieser Konfiguration:
Ich vergebe meine IP-Adressen für die Docker Container alle manuell in den docker-compose.yaml
Dateien, damit es nicht zu IP-Adressen Konflikten kommt, weil Docker würde ansonsten einfach die IP-Adressen vergeben ohne Rücksicht auf meinen DHCP-Server.
Hier mal ein Beispiel von einer einfachen Meshtastic Webanwendung mit manuell vergebener IP Adresse und Labels für den Traefik Reverse-Proxy mit Nutzung des externen proxy
IPvlan Netzwerk:
services:
meshtastic-web:
image: ghcr.io/meshtastic/web
container_name: meshtastic
restart: unless-stopped
networks:
proxy:
ipv4_address: 192.168.x.x
labels:
- "traefik.enable=true"
- "traefik.http.routers.meshtastic.entrypoints=http"
- "traefik.http.routers.meshtastic.rule=Host(`meshtastic.techlab.icu`)"
- "traefik.http.middlewares.meshtastic-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.meshtastic.middlewares=meshtastic-https-redirect"
- "traefik.http.routers.meshtastic-secure.entrypoints=https"
- "traefik.http.routers.meshtastic-secure.rule=Host(`meshtastic.techlab.icu`)"
- "traefik.http.routers.meshtastic-secure.tls=true"
- "traefik.http.routers.meshtastic-secure.service=meshtastic"
- "traefik.http.services.meshtastic.loadbalancer.server.port=8080"
- "traefik.docker.network=proxy"
networks:
proxy:
external: true
Das Docker-Netzwerk habe ich auch auf anderen Servern eingerichtet, wie beispielsweise auf dem eq14.lan
mit Alpine Linux:
doas docker network create -d ipvlan --subnet 192.168.x.x/24 --gateway 192.168.x.x -o parent=eth0 proxy
Warum ich IPvlan statt Macvlan nutze
Einer der entscheidenden Gründe war die Netzwerk Kompatibilität:
- Nur eine MAC-Adresse pro physischer Schnittstelle - bei Macvlan bekommt jeder Container eine eigene MAC-Adresse. Das kann bei manchen Switches, Routern oder insbesondere bei Consumer-Geräten zu Problemen führen, weil sie mehrere MACs an einem Port nicht sauber unterstützen.
- Einfachere Layer-2-Handhabung - IPvlan arbeitet aus Sicht des Netzwerks wie eine einzige Schnittstelle und verteilt die IP-Adressen intern weiter. Dadurch sinkt die Gefahr von Broadcast- oder ARP-Problemen.
- Bessere Performance in manchen Szenarien - IPvlan umgeht die virtuelle Netzwerktreiber-Schicht, die Macvlan oft bremst, und kann deshalb gerade bei vielen Containern effizienter arbeiten.
- Kompatibler mit Firewalls und VLANs - manche Sicherheits- oder Management-Systeme verhalten sich zuverlässiger, wenn nur eine MAC-Adresse pro Port genutzt wird.
Management: CLI statt Klick-Interface
Obwohl es Tools wie Komodo gibt, mit denen ich meine vier Docker-Hosts zentral im Blick habe, passiert meine eigentliche Arbeit fast ausschließlich im Terminal.
Ich bevorzuge die direkte Kontrolle beispielsweise mit:
docker ps
docker compose up -d
docker compose down
Jeder Dienst hat seine eigene docker-compose.yaml
Konfigurationsdatei und das hält Konfigurationen nachvollziehbar und übersichtlich.
Außerdem liebe ich mein Terminal und bevorzuge daher bewusst die CLI-Befehle (docker
& docker compose
) für Skripte, Automatisierung, Backups, SSH-Zugriff usw.
Warum ich Komodo statt Portainer nutze
Viele setzen im Homelab auf Portainer, um Container über eine Weboberfläche zu verwalten. Für meinen Workflow reicht mir jedoch Komodo völlig aus - ein leichtgewichtiges, Open-Source-Dashboard, das mir den Status aller eingebundenen Systeme auf einen Blick zeigt.
Die eigentliche Verwaltung erledige ich ohnehin über das Terminal, sodass Komodo für mich genau die richtige Balance aus Übersicht und Minimalismus bietet.
Vorteile von Docker Compose im Homelab
- Schnell einsetzbar: Neuer Service?
docker compose up
und er läuft. - Weniger Chaos: Keine Paketkonflikte oder Abhängigkeiten auf dem Host.
- Portabilität: Container können leicht auf andere Systeme umziehen.
- Konsistenz: Egal ob auf Arch, Debian oder Alpine - die Dienste verhalten sich identisch.
Ausblick
In einem kommenden Artikel werde ich tiefer auf Traefik eingehen. Das ist mein zentraler Reverse Proxy, der mein Docker-Netzwerk mit der Außenwelt verbindet.
Die Außenwelt bekommt unter anderem den Zugang über einen Cloudflare Tunnel oder Twingate, beides ebenfalls als Docker Container im Netzwerk und sicherlich auch ein eigenes Thema hier auf meinem Blog wert.
Außerdem plane ich einen Beitrag über Backups mit Restic, damit auch im Homelab kein Datenverlust droht. Das Backup läuft bei mir automatisiert über ein Skript per Cronjob.
Container-Strategie: So verteile ich meine Docker-Services im Homelab
Zum Abschluss vielleicht eine kleine Liste, was bei mir aktuell als Docker Container im Homelab läuft:
- Traefik (2x)
- Frigate
- Meshtastic
- Komodo Core
- Komodo Periphery (4x)
- Searxng
- Twingate
- Mixpost
- Cloudflare Tunnel
- Gluetun
- Linkwarden
- PeaNUT
- Baikal
- IT-Tools
- Home Assistant
- Synapse
- Gotify
- Stirling PDF
- Glance
- Uptime Kuma
- Wordpress
- n8n
- Wiki.js
- Jellyfin
Alle hier aufgelisteten Container laufen rund um die Uhr, verteilt auf mehrere Systeme wie zum Beispiel:
- Synology NAS: Jellyfin (Mediaserver) - optimal, weil die Medien ohnehin dort liegen.
- EQ14 Mini-PC mit zwei LAN-Schnittstellen: Frigate (NVR), separater Traefik Reverse-Proxy - hier sind die dedizierten Netzwerkports und die zusätzliche Rechenleistung ideal für KI-gestützte Videoverarbeitung.
- Lenovo ThinkCentre M715q: Alle anderen produktiven Dienste wie Mixpost, Wiki.js, Searxng, Home Assistant, etc.
- Vierter Host: Wird nur bei Bedarf für zeitlich begrenzte Container-Tests oder Spezialprojekte gestartet.
Anfangs lief Frigate auch auf dem ThinkCentre, was zwar funktional war, jedoch mehr Ressourcen beanspruchte. Durch die Auslagerung auf den EQ14 bleibt der Hauptserver nun deutlich entlastet. Zu meinem Frigate Blogpost geht’s hier.
Einen Docker Swarm habe ich bewusst nicht eingesetzt - bei meiner überschaubaren Anzahl an Hosts ist die Kombination aus gezielter Container-Verteilung und einem zweiten Traefik-Proxy auf dem EQ14 eine einfachere und robustere Lösung aber wer weiß was die Zukunft noch bringt?
Fazit
Docker Compose ist für mich längst mehr als nur ein Tool - es ist das Fundament meines Homelabs. Mit klarer Organisation, sauberem Networking und ein bisschen Automatisierung lässt sich damit eine robuste, flexible und leicht wartbare Umgebung aufbauen, die den Alltag enorm erleichtert.
Nutzt ihr Docker oder Docker Compose im Homelab? Schreibt mir gern in die Kommentare, wie ihr eure Container organisiert!
Hardware-Empfehlungen
- EQ14 Mini-PC auf Amazon - kompakter und stromsparender Rechner für Docker
- Lenovo ThinkCentre M715q bei RAM-KÖNIG - gebrauchter Tiny PC als Server für Docker
Da es sich teilweise um Affiliate-Links handelt, hier der Hinweis: Als Amazon-Partner verdiene ich an qualifizierten Verkäufen.
Verwendete Tools: