Docker hat das Self-Hosting radikal vereinfacht: Was früher einen Abend Installationsarbeit kostete, startet heute mit einer Konfigurationsdatei und einem Befehl. Die Installation selbst ist in zehn Minuten erledigt – vorausgesetzt, du nutzt das offizielle Repository und kennst eine tückische Falle, über die selbst erfahrene Admins stolpern: Docker ignoriert deine Firewall.
Voraussetzungen
Du brauchst einen Server mit Root-Zugriff und Debian oder Ubuntu; 2 GB RAM genügen für die ersten Dienste. Wichtig ist die Virtualisierung: Auf einem echten KVM-Server läuft Docker nativ und ohne Einschränkungen – auf Container-basierten vServern (LXC/OpenVZ) dagegen oft nur mit Verrenkungen oder gar nicht.
Schritt 1: Docker aus dem offiziellen Repository installieren
Die Docker-Pakete der Distributionen hängen häufig Monate zurück. Installiere deshalb aus dem offiziellen Docker-Repository – das liefert aktuelle Versionen und saubere Updates über apt. Die folgenden Befehle richten es unter Debian ein (für Ubuntu ersetzt du in beiden URLs debian durch ubuntu):
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/debian $(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
Ob alles läuft, zeigt der Testcontainer:
sudo docker run hello-world
Erscheint „Hello from Docker!", ist die Installation komplett – inklusive Docker Compose, das heute als Plugin (docker compose, ohne Bindestrich) mitkommt.
Schritt 2: Docker ohne sudo nutzen (optional)
Damit du nicht vor jeden Befehl sudo setzen musst, kannst du deinen Benutzer in die Docker-Gruppe aufnehmen und dich einmal neu anmelden:
sudo usermod -aG docker $USER
Sei dir dabei über eine Konsequenz im Klaren: Mitglieder der Docker-Gruppe können über Container faktisch Root-Rechte erlangen. Auf einem Server, den du allein administrierst, ist das üblich und vertretbar – Gruppenmitgliedschaften für weitere Nutzer solltest du dagegen wie Root-Zugänge behandeln.
Schritt 3: Der erste echte Dienst mit Docker Compose
Statt lange docker run-Befehle zu tippen, beschreibst du Dienste in einer compose.yaml – nachvollziehbar, versionierbar, mit einem Befehl startbar. Als praktisches erstes Projekt bietet sich Uptime Kuma an, ein selbst gehostetes Monitoring mit Weboberfläche. Lege dafür einen Ordner mit dieser Datei an:
services:
uptime-kuma:
image: louislam/uptime-kuma:1
restart: unless-stopped
ports:
- "127.0.0.1:3001:3001"
volumes:
- ./data:/app/data
Dann im selben Ordner:
docker compose up -d
Docker lädt das Image und startet den Dienst im Hintergrund; docker compose logs -f zeigt, was passiert. Dank restart: unless-stopped überlebt der Container auch einen Server-Reboot. Warum der Port oben bewusst an 127.0.0.1 gebunden ist, klärt der nächste Abschnitt – er ist der wichtigste dieses Beitrags.
Die Falle: Docker umgeht deine Firewall
Wer seinen Server mit UFW abgesichert hat, erwartet: Was nicht freigegeben ist, ist zu. Docker bricht diese Erwartung. Ein veröffentlichter Port (ports: "3001:3001") wird von Docker direkt in die iptables-Regeln geschrieben – an UFW vorbei. Der Dienst ist dann aus dem Internet erreichbar, obwohl deine Firewall ihn scheinbar blockt. So landen ungewollt Datenbanken und Admin-Panels im öffentlichen Netz.
Die robuste Lösung ist das Muster von oben: Ports nur an 127.0.0.1 binden. Damit lauscht der Container ausschließlich lokal, und du entscheidest, was nach außen geht – sauber über einen Reverse Proxy mit TLS oder für den Eigenbedarf über einen SSH-Tunnel:
ssh -L 3001:127.0.0.1:3001 benutzer@server-ip
Anschließend erreichst du die Oberfläche lokal unter http://localhost:3001 – verschlüsselt durch SSH, unsichtbar für den Rest des Internets.
Faustregel: Veröffentliche Container-Ports grundsätzlich als
127.0.0.1:PORT:PORT. Öffentlich wird ein Dienst erst durch deine bewusste Entscheidung – nicht durch einen Docker-Default.
Updates und Aufräumen
Container aktualisierst du in zwei Befehlen: docker compose pull holt neue Images, docker compose up -d startet die Dienste damit neu. Alte Images bleiben dabei liegen und füllen mit der Zeit die Platte – docker system prune räumt Ungenutztes auf (prüfe vorher mit docker system df, was weg kann). Ein gelegentlicher Blick auf df -h gehört beim Container-Hosting zur Routine.
Fazit
Offizielles Repository, Compose statt langer Einzelbefehle und Ports konsequent an 127.0.0.1 – mit diesen drei Gewohnheiten ist dein Docker-Setup sauber, wartbar und sicher. Nach dem ersten Dienst wächst so ein Server erfahrungsgemäß schnell; wie viel CPU und RAM ein Multi-Container-Setup braucht, kalkuliert der Ratgeber zur Server-Dimensionierung. Und wenn es mehr werden soll: Die AMD-EPYC-Server liefern mit vielen Kernen und NVMe genau das Profil, von dem parallele Container profitieren.