Docker für Selbsthoster: Die beste Entscheidung für deinen Server
Back
Ein Leitfaden für alle, die ihre Dienste endlich einfach verwalten wollen
Ihr habt einen Server. Vielleicht einen Raspberry Pi, einen alten PC oder eine leistungsstarke Maschine im Keller. Und ihr wollt Dienste darauf betreiben – Nextcloud, Pi-hole, Jellyfin, was auch immer. Aber immer wieder stößt ihr auf das gleiche Problem: Abhängigkeiten, Konflikte, komplizierte Installationen.
Die Lösung heißt Docker. Und wer einmal damit angefangen hat, will nie wieder zurück.
Was ist Docker überhaupt?
Stellt euch vor, jeder eurer Dienste lebt in seiner eigenen abgeschotteten Wohnung. Eigene Möbel, eigene Versionen, eigene Abhängigkeiten. Und alle Wohnungen teilen sich nur die Grundversorgung – in diesem Fall den Linux-Kernel des Host-Systems.
Das ist Docker. Container statt virtuelle Maschinen. Leicht, schnell, isoliert.
Ein Container ist kein vollständiges Betriebssystem. Er teilt sich den Kernel mit dem Host, hat aber eigene Dateien, eigene Prozesse und eigene Netzwerk-Ports. Das macht ihn extrem schlank. Ein Container startet in Sekunden, nicht Minuten. Er verbraucht nur wenig zusätzlichen Speicher. Und er lässt sich genauso einfach löschen, wenn man ihn nicht mehr braucht.
Warum Docker für Selbsthoster die beste Wahl ist
1. Keine Abhängigkeitshölle mehr
Kennt ihr das? Dienst A braucht PHP 7.4, Dienst B braucht PHP 8.1. Geht nicht? Mit Docker geht's doch. Jeder Container bringt seine eigene Umgebung mit. Nextcloud bekommt seinen eigenen PHP-Interpreter, sein eigenes Apache, seine eigenen Bibliotheken. Pi-hole läuft völlig separat daneben. Keine Konflikte, keine Kompatibilitätsprobleme, kein Drama.
2. Installation in Minuten
Ohne Docker müsst ihr herunterladen, entpacken, den Webserver konfigurieren, eine Datenbank einrichten, Berechtigungen setzen, testen, debuggen.
Mit Docker sieht das so aus:
bash
docker run -d -p 8080:80 nextcloud
Das war's. Der Dienst läuft.
Natürlich braucht es für produktive Setups ein bisschen mehr – Volumes für persistente Daten, Umgebungsvariablen für Passwörter, vielleicht ein Reverse Proxy. Aber der Kern bleibt: Was früher Stunden dauerte, ist heute in Minuten erledigt.
3. Updates ohne Angst
Jeder Selbsthoster kennt das mulmige Gefühl vor einem Update. Funktioniert danach alles? Oder muss ich stundenlang debuggen?
Mit Docker ist das anders. Ihr zieht das neue Image, stoppt den alten Container, startet den neuen. Wenn etwas nicht läuft, startet ihr einfach den alten Container neu. Rollback in Sekunden, ohne Datenverlust, ohne Systemstress.
4. Aufräumen ohne Spuren
Einen Dienst getestet und nicht überzeugt? Container löschen, Image löschen – weg. Keine verwaisten Konfigurationsdateien in /etc, keine übriggebliebenen Bibliotheken, keine Einträge in Cron-Tabellen. Das System bleibt sauber.
5. Portabilität
Ihr habt euer Setup auf einem Raspberry Pi laufen und wollt auf einen richtigen Server umziehen? Docker macht's möglich. Sichert die Volumes, kopiert die docker-compose.yml auf den neuen Rechner, startet – und alles läuft genau gleich. Kein Neuinstallieren, kein Nachkonfigurieren.
Die Grundlagen: Images, Container, Volumes
Images – Die Baupläne
Ein Docker-Image ist wie eine ISO-Datei oder ein Bauplan. Es enthält alles, was ein Dienst braucht: Betriebssystem-Basis, Software, Konfiguration. Images werden aus einer Datei namens Dockerfile gebaut. Aber ihr müsst nicht selbst bauen – auf Docker Hub gibt es tausende fertige Images für fast jeden Dienst.
Container – Die laufenden Instanzen
Startet ihr ein Image, entsteht ein Container. Das ist die laufende Instanz eures Dienstes. Ihr könnt mehrere Container aus dem gleichen Image starten – zum Beispiel mehrere Nextcloud-Instanzen für verschiedene Zwecke.
Volumes – Die persistenten Daten
Container sind flüchtig. Wenn ihr einen Container löscht, sind alle darin gespeicherten Daten weg. Deshalb gibt es Volumes: Bereiche auf eurer Festplatte, die ihr in den Container einhängt. Die Datenbankdateien von MariaDB, die Uploads von Nextcloud, die Konfiguration von Pi-hole – alles kommt in Volumes. So überleben eure Daten jeden Container-Neustart.
bash
docker run -d -p 8080:80 -v nextcloud_data:/var/www/html nextcloud
Hier wird das Volume nextcloud_data in den Container eingehängt. Alles, was Nextcloud unter /var/www/html speichert, landet in diesem Volume und bleibt erhalten, selbst wenn der Container gelöscht wird.
Docker Compose: Mehrere Dienste perfekt orchestriert
Einzelne Container sind schön und gut. Aber wer mehrere Dienste betreibt, wird schnell Docker Compose lieben. Mit einer einzigen YAML-Datei definiert ihr alle eure Container, ihre Netzwerke, ihre Volumes, ihre Abhängigkeiten.
Eine typische docker-compose.yml für Nextcloud mit MariaDB:
yaml
version: '3'
services:
nextcloud:
image: nextcloud:latest
container_name: nextcloud
ports:
- 8080:80
volumes:
- nextcloud_data:/var/www/html
environment:
- MYSQL_HOST=db
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=geheimes_passwort
depends_on:
- db
restart: unless-stopped
db:
image: mariadb:latest
container_name: nextcloud_db
volumes:
- db_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root_password
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=geheimes_passwort
restart: unless-stopped
volumes:
nextcloud_data:
db_data:
Ein Befehl startet alles:
bash
docker-compose up -d
Ein Befehl stoppt alles:
bash
docker-compose down
Und wenn ihr Updates macht, könnt ihr mit einem Befehl alle neuen Images ziehen und die Container neu starten. Das ist Effizienz.
Die wichtigsten Docker-Befehle für den Alltag
| Befehl | Was es tut |
|---|---|
docker ps |
Zeigt laufende Container |
docker ps -a |
Zeigt alle Container (auch gestoppte) |
docker images |
Zeigt heruntergeladene Images |
docker pull image:tag |
Lädt ein Image herunter |
docker run image |
Startet einen Container aus einem Image |
docker stop container |
Stoppt einen Container sauber |
docker start container |
Startet einen gestoppten Container |
docker restart container |
Startet einen Container neu |
docker rm container |
Löscht einen Container |
docker rmi image |
Löscht ein Image |
docker logs container |
Zeigt die Logs eines Containers |
docker exec -it container bash |
Öffnet eine Shell im Container |
docker-compose up -d |
Startet alle Dienste aus der Compose-Datei |
docker-compose down |
Stoppt alle Dienste |
docker-compose pull |
Lädt neue Images für alle Dienste |
docker-compose logs |
Zeigt Logs aller Dienste |
Typische Docker-Setups für Selbsthoster
Pi-hole – Werbeblocker fürs ganze Netz
yaml
version: '3'
services:
pihole:
container_name: pihole
image: pihole/pihole:latest
ports:
- "53:53/tcp"
- "53:53/udp"
- "8053:80/tcp"
environment:
TZ: 'Europe/Berlin'
WEBPASSWORD: 'admin_password'
volumes:
- './etc-pihole:/etc/pihole'
- './etc-dnsmasq.d:/etc/dnsmasq.d'
restart: unless-stopped
Jellyfin – Der eigene Medienserver
yaml
version: '3'
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
ports:
- "8096:8096"
volumes:
- ./config:/config
- ./cache:/cache
- /pfad/zu/medien:/media
restart: unless-stopped
Portainer – Docker grafisch verwalten
yaml
version: '3'
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
ports:
- "9000:9000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
restart: unless-stopped
volumes:
portainer_data:
Portainer gibt euch eine Weboberfläche für eure Docker-Umgebung. Ideal für alle, die nicht ständig im Terminal arbeiten wollen.
Best Practices für den produktiven Einsatz
1. Immer mit Volumes arbeiten
Nichts ist ärgerlicher als ein verlorener Container mitsamt aller Daten. Gewöhnt euch an, für jeden Dienst Volumes anzulegen. Datenbanken, Uploads, Konfigurationen – alles muss persistent sein.
2. Restart-Policies setzen
Mit restart: unless-stopped stellt ihr sicher, dass eure Dienste nach einem Neustart des Servers automatisch wieder hochkommen. Und dass sie bei einem Crash neu starten.
3. Netzwerke isolieren
Docker kann interne Netzwerke anlegen, in denen Container miteinander kommunizieren können, ohne nach außen sichtbar zu sein. Das ist nicht nur sicherer, sondern auch sauberer.
yaml
networks:
intern:
driver: bridge
Dann weist ihr jedem Container sein Netzwerk zu. Der Datenbank-Container muss nur im internen Netzwerk sein, nicht nach außen.
4. Umgebungsvariablen für Geheimnisse
Passwörter und API-Keys gehören nicht in die docker-compose.yml, wenn diese Datei vielleicht irgendwann öffentlich wird. Nutzt .env-Dateien oder echte Secrets-Verwaltung.
yaml
environment:
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
In einer .env-Datei neben der docker-compose.yml steht dann:
text
MYSQL_PASSWORD=geheimes_passwort
5. Regelmäßige Updates
Container sind nicht automatisch sicher. Holt euch regelmäßig neue Images und startet die Container neu. Ein Skript, das einmal pro Woche docker-compose pull && docker-compose up -d ausführt, ist schnell geschrieben.
6. Logs im Auge behalten
Container produzieren Logs. Mit docker logs container seht ihr sie euch an. Mit einem zentralen Logging-System könnt ihr alle Logs sammeln und durchsuchen.
Häufige Fehler und wie ihr sie vermeidet
Fehler 1: :latest blind vertrauen
:latest ist praktisch, aber nicht immer stabil. Wenn ein Update etwas kaputtmacht, steht ihr da. Besser: Feste Versionen verwenden und gezielt updaten.
Fehler 2: Container als root laufen lassen
Viele Images laufen standardmäßig als root. Das ist ein Sicherheitsrisiko. Sucht nach Images, die einen Nicht-root-User verwenden, oder konfiguriert es selbst.
Fehler 3: Keine Ressourcenlimits
Ein durchgehender Container kann die ganze CPU fressen oder den ganzen RAM. Setzt Limits:
yaml
services:
nextcloud:
...
deploy:
resources:
limits:
cpus: '2'
memory: 2G
Fehler 4: Port-Konflikte ignorieren
Zwei Dienste können nicht den gleichen Port auf dem Host nutzen. Plant eure Ports oder nutzt einen Reverse Proxy, der die Verteilung übernimmt.
Fehler 5: Docker-Socket weitergeben
Manche Container (wie Portainer) brauchen Zugriff auf den Docker-Socket, um andere Container zu verwalten. Das ist praktisch, aber auch gefährlich. Wer den Socket hat, kann den ganzen Host kontrollieren. Gebt ihn nur weiter, wenn es wirklich nötig ist.
Docker oder Podman? Ein kurzer Ausflug
In letzter Zeit hört man viel von Podman. Die Alternative zu Docker verspricht mehr Sicherheit durch rootlose Container und bessere Integration in Systemd.
Für die meisten Selbsthoster ist Docker aber völlig ausreichend. Die Community ist riesig, die Dokumentation exzellent, und fast jedes Tutorial nutzt Docker. Wenn ihr nicht gerade aus Sicherheitsgründen auf rootlose Container angewiesen seid, bleibt bei Docker.
Fazit: Docker ist die Superkraft für Selbsthoster
Wer Docker einmal verstanden hat, will nicht mehr zurück. Die Installation neuer Dienste wird zum Kinderspiel, Updates verlieren ihren Schrecken, und das System bleibt sauber und wartbar.
Natürlich gibt es eine Lernkurve. Aber sie ist nicht so steil, wie viele denken. Und wer einmal die ersten Schritte gemacht hat, wird schnell merken: Docker ist die beste Entscheidung, die man als Selbsthoster treffen kann.
Unser Tipp: Fangt klein an. Installiert einen Dienst mit Docker, der euch interessiert – Pi-hole zum Beispiel, oder eine Test-Instanz von Nextcloud. Spielt damit, versteht die Konzepte. Und dann wandelt nach und nach alle eure Dienste auf Docker um.
Ihr werdet euch fragen, warum ihr nicht früher damit angefangen habt.
More blog articles
Du suchst nach einem neuen Server oder Webhosting und wirst von günstigen Lockangeboten überschüttet? Vorsicht – was auf den ersten Blick wie ein Schnäppchen aussieht, kann langfristig zu einer teuren Überraschung werden. Wir zeigen d...
Was ist eigentlich... Webspace? Einfach erklärt (nicht nur für Oma!) Hast du schon mal von Webspace gehört und gedacht: "Was soll das sein?" Keine Sorge, du bist nicht allein. Viele Leute wissen nicht, was das ist - dabei nutzen sie es jeden Tag....
Du hast bereits erste Erfahrungen mit Minecraft Servern gesammelt und möchtest jetzt deinen eigenen, professionellen Server aufsetzen? Egal ob du mit Mods, Plugins oder im klassischen Vanilla-Stil spielen willst – dieser Guide führt dich durch die wichtigsten...