Docker und Docker Compose auf Linux installieren (Ubuntu/Debian): die Self-Hosting-Grundlage
Docker und das Compose-Plugin sind die Basis für jedes Self-Hosting-Projekt. Diese Anleitung zeigt die saubere Installation aus dem offiziellen Docker-Repo auf Ubuntu und Debian: GPG-Key, apt-Quelle, docker-ce mit Compose-Plugin, docker-Gruppe und ein erster Compose-Stack als Test.
Geprüft am 29.09.2026 · für uptime-kuma 2.5.5
WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Mehr dazu

Wer Dienste wie Nginx Proxy Manager, Vaultwarden, Immich oder Pi-hole selbst hosten will, braucht eine solide Grundlage: Docker. Mit Containern läuft jede Anwendung samt ihrer Abhängigkeiten isoliert, lässt sich in Sekunden starten, aktualisieren oder wieder entfernen, ohne das restliche System zu verschmutzen. Diese Anleitung richtet sich an alle, die einen Linux-Server, eine VM oder einen Homeserver mit Ubuntu oder Debian betreiben und Docker zusammen mit dem Compose-Plugin sauber aus dem offiziellen Docker-Repository installieren wollen. Am Ende läuft ein erster Beispiel-Stack über docker compose, und Sie haben die Basis für jedes weitere Self-Hosting-Projekt.
Was ist Docker und Docker Compose?
Docker (genauer: die Docker Engine) ist eine Container-Laufzeit. Sie packt eine Anwendung mit allen benötigten Bibliotheken in ein portables Image und startet daraus laufende Container. Anders als bei einer vollwertigen virtuellen Maschine teilen sich alle Container den Kernel des Hosts, sind dadurch leichtgewichtig und starten nahezu sofort.
Docker Compose beschreibt einen kompletten Verbund aus mehreren Containern, Netzwerken und Volumes in einer einzigen YAML-Datei. Statt lange docker run-Befehle zu tippen, definieren Sie den gewünschten Zustand einmal in der compose.yml und steuerst alles mit kurzen Kommandos. Wichtig: Compose v2 ist heute ein Plugin der Docker CLI. Der Befehl lautet deshalb docker compose (mit Leerzeichen) und nicht mehr das alte, separate docker-compose.
Ein zweiter wichtiger Punkt vorab: Wir installieren bewusst nicht das Paket docker.io aus dem Ubuntu-/Debian-Repo. Das ist oft veraltet und bringt das Compose-Plugin nicht in der aktuellen Form mit. Stattdessen nutzen wir das offizielle Repo unter download.docker.com mit den Paketen docker-ce, docker-ce-cli, containerd.io, docker-buildx-plugin und docker-compose-plugin.
Voraussetzungen
- Ein Server, eine VM oder ein Homeserver mit Ubuntu LTS (22.04, 24.04 oder 26.04) oder Debian 13 Trixie bzw. 12 Bookworm, x86_64 oder ARM64.
- Hardware: Für Docker selbst und einen kleinen Stack wie Uptime Kuma reichen 1 CPU-Kern, 1 GB RAM und 10 GB freier Speicher. Für mehrere Dienste parallel planen Sie 2 Kerne, 4 GB RAM und 40 GB SSD-Speicher ein.
- Ein Benutzerkonto mit
sudo-Rechten. - Internetzugang für den Paketdownload.
- Die Pakete
curlundca-certificates(werden im ersten Schritt mit installiert). - Empfehlung: vorher ein vollständiges Systemupdate (
sudo apt update && sudo apt upgrade). - Falls bereits ein altes
docker.iooderdocker-composeinstalliert ist, vorher entfernen, um Konflikte zu vermeiden (siehe Schritt 1).
Schritt 1: Alte Pakete entfernen und System vorbereiten
Damit es keine Kollisionen mit Distributions-Paketen gibt, entfernen Sie eventuelle Altinstallationen. Der Befehl schadet nicht, wenn nichts davon installiert ist:
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
sudo apt-get remove -y $pkg
doneAnschließend bringen Sie die Paketquellen auf den neuesten Stand und installierst die Helfer für den Schlüssel-Download:
sudo apt-get update
sudo apt-get install -y ca-certificates curlVerifizieren: dpkg -l | grep -E 'docker.io|podman-docker' liefert keine Zeile mit Status ii mehr, und curl --version gibt eine Versionsnummer aus.
Schritt 2: Offiziellen GPG-Schlüssel von Docker hinterlegen
Der Schlüssel stellt sicher, dass die Pakete tatsächlich von Docker stammen. Legen Sie das Verzeichnis für Schlüsselbunde an und laden Sie den Key herunter:
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.ascWichtig für Debian: Ersetzen Sie in der URL ubuntu durch debian, also https://download.docker.com/linux/debian/gpg. Der Rest bleibt identisch.
Verifizieren: ls -l /etc/apt/keyrings/docker.asc zeigt eine Datei mit den Rechten -rw-r--r-- und einer Größe von einigen Kilobyte, nicht 0 Byte.
Schritt 3: Docker-Repository als apt-Quelle eintragen
Jetzt fügen Sie die passende Paketquelle hinzu. Der folgende Befehl liest Architektur und Codename automatisch aus und schreibt die fertige Zeile in die Quelldatei (Variante für Ubuntu):
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 updateFür Debian nutzen Sie dieselbe Befehlsstruktur, ersetzen aber beide Vorkommen von ubuntu durch debian. Wenn apt-get update ohne Fehler durchläuft, ist das Repo korrekt eingebunden. Die aktuelle Docker-Doku schreibt die Quelle inzwischen im deb822-Format nach /etc/apt/sources.list.d/docker.sources. Die hier gezeigte einzeilige docker.list funktioniert ebenso, verwenden Sie aber nur eine der beiden Varianten.
Verifizieren: apt-cache policy docker-ce zeigt als Kandidaten eine Version aus https://download.docker.com/linux/ubuntu (bzw. /debian) und nicht „(none)“.
Schritt 4: Docker Engine und Compose-Plugin installieren
Nun installieren Sie die Engine, die CLI, containerd sowie die Plugins für Buildx und Compose in einem Rutsch:
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginDer Dienst startet bei der Installation automatisch. Damit Docker auch nach einem Neustart von selbst hochfährt, aktivieren Sie ihn ausdrücklich:
sudo systemctl enable --now dockerEin erster Funktionstest mit dem offiziellen Testimage:
sudo docker run --rm hello-worldErscheint die Meldung „Hello from Docker!“, ziehen Engine und Image-Download sauber. Das Flag --rm räumt den Test-Container danach gleich wieder weg.
Verifizieren: systemctl is-enabled docker meldet enabled, systemctl is-active docker meldet active, und der hello-world-Test gibt „Hello from Docker!“ aus.
Schritt 5: Benutzer in die docker-Gruppe aufnehmen
Bisher mussten Sie jeden Docker-Befehl mit sudo ausführen. Wenn Sie Ihren Benutzer in die Gruppe docker aufnehmen, geht es ohne. Beachten Sie den Sicherheitsaspekt: Mitglieder der docker-Gruppe haben de facto root-Rechte auf dem Host. Vergeben Sie die Mitgliedschaft also nur an vertrauenswürdige Konten.
sudo usermod -aG docker $USERDie Gruppenmitgliedschaft wird erst nach einem neuen Login wirksam. Melden Sie sich also ab und wieder an (bzw. bauen Sie die SSH-Sitzung neu auf). Danach prüfen Sie, ob die Befehle ohne sudo funktionieren:
docker --version
docker compose version
docker run --rm hello-worldBeide Versions-Abfragen müssen eine Ausgabe liefern. Achten Sie darauf, dass docker compose version (mit Leerzeichen) etwas zurückgibt, denn genau diese Schreibweise nutzen Sie ab jetzt für alle Stacks.
Verifizieren: id -nG enthält docker, und docker compose version gibt ohne sudo eine Zeile wie „Docker Compose version v5.x“ aus.
Schritt 6: Erster Stack mit Docker Compose
Zum Abschluss bauen Sie einen kleinen, echten Stack. Als Beispiel dient Uptime Kuma, ein schlankes Self-Hosting-Monitoring mit Weboberfläche. Legen Sie zuerst ein Projektverzeichnis an:
mkdir -p ~/uptime-kuma
cd ~/uptime-kumaErstellen Sie darin die Datei compose.yml mit folgendem Inhalt:
services:
uptime-kuma:
image: louislam/uptime-kuma:2
container_name: uptime-kuma
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- ./data:/app/dataDie wichtigsten Bausteine im Überblick:
- image: Das verwendete Image samt Tag. Der Tag
2bindet die aktuelle Major-Version 2 (Stand 29.09.2026: 2.5.5) und vermeidet ungewollte Sprünge. Für den Produktivbetrieb empfiehlt es sich, auf eine konkrete Version zu pinnen. - restart: unless-stopped: Der Container startet nach einem Reboot automatisch wieder, solange Sie ihn nicht selbst gestoppt haben.
- ports:
"3001:3001"verbindet Host-Port 3001 mit dem Container-Port 3001 (SchemaHost:Container). - volumes: Der Bind-Mount
./datalegt die Daten im Projektordner ab, sodass sie ein Container-Neubau überlebt.
Jetzt starten Sie den Stack im Hintergrund:
docker compose up -dVerifizieren: docker compose ps zeigt den Dienst uptime-kuma mit Status Up und der Portzuordnung 0.0.0.0:3001->3001/tcp, im Projektordner ist das Verzeichnis data entstanden.
Schritt 7: Verifikation im Browser
Prüfen Sie zuerst, ob der Container läuft:
docker compose psIn der Spalte STATUS sollte Up stehen. Öffnen Sie anschließend im Browser die Adresse http://SERVER-IP:3001 (auf dem Server selbst http://localhost:3001). Beim ersten Aufruf fragt Uptime Kuma 2 nach der Datenbank (für den Einstieg reicht SQLite) und legt danach ein Administrator-Konto an. Klappt das, haben Sie Ihren ersten Compose-Stack erfolgreich ausgerollt. Die Logs lassen sich jederzeit live mitverfolgen:
docker compose logs -fMit Strg + C beenden Sie die Log-Ansicht, ohne den Container zu stoppen.
Verifizieren: curl -I http://localhost:3001 antwortet mit einem HTTP-Status 200 oder 302, und im Browser erscheint die Einrichtungsseite von Uptime Kuma.
Updates und Wartung
Ein Compose-Stack lässt sich in zwei kurzen Befehlen aktualisieren. Sie holen die neuen Images und ersetzen die laufenden Container im selben Verzeichnis:
docker compose pull
docker compose up -dCompose erkennt automatisch, welche Container ein neues Image haben, und startet nur diese neu. Nicht mehr benötigte alte Images räumen Sie gelegentlich auf:
docker image prune -fDen kompletten Stack stoppen und entfernen Sie mit:
docker compose downWichtig: down entfernt Container und Netzwerke, aber nicht den Bind-Mount-Ordner ./data. Ihre Daten bleiben also erhalten. Vollautomatische Updates sind möglich, können aber durch Breaking Changes Dienste lahmlegen. Das früher verbreitete Watchtower (containrrr/watchtower) ist seit Dezember 2025 archiviert, Alternativen beschreibt die Anleitung Docker-Container automatisch aktualisieren nach dem Watchtower-Aus. Für wichtige Stacks ist ein bewusstes, manuelles Update meist die sicherere Wahl.
Backup-Hinweis
Der gesamte Zustand eines Stacks steckt in zwei Dingen: der compose.yml und den Bind-Mount-Ordnern (hier ./data). Sichern Sie konsequent das komplette Projektverzeichnis, zum Beispiel mit einem nächtlichen Tar-Archiv oder einem Backup-Tool wie restic. Legen Sie Stacks am besten einheitlich unter /opt/<app> oder ~/<app> ab, dann haben Sie einen einzigen, klaren Pfad für Ihr Backup. Datenbanken (z. B. Postgres in größeren Stacks) sollten Sie zusätzlich mit einem Dump sichern, da ein reiner Dateikopie-Snapshot bei laufender Datenbank inkonsistent sein kann.
Troubleshooting
- „permission denied“ beim docker-Befehl ohne sudo: Sie haben sich nach
usermod -aG docker $USERnicht neu angemeldet. Sitzung beenden und neu anmelden, dann erneut testen. - „docker: command not found“: Schritt 4 ist fehlgeschlagen oder das Repo aus Schritt 3 wurde nicht eingebunden. Prüfen Sie die Datei
/etc/apt/sources.list.d/docker.listund wiederholen Sieapt-get update. - „docker-compose: command not found“: Das ist erwartet. Nutzen Sie die Plugin-Schreibweise
docker composemit Leerzeichen. - Port schon belegt („address already in use“): Ein anderer Dienst nutzt den Host-Port. Ändern Sie im Stack die linke Zahl der Port-Zuordnung, etwa
"3002:3001". - GPG-Fehler bei apt-get update: Der Schlüssel aus Schritt 2 fehlt oder hat falsche Rechte. Den Download wiederholen und sicherstellen, dass
signed-byauf/etc/apt/keyrings/docker.asczeigt.
Optional: Rootless-Modus
Standardmäßig läuft der Docker-Daemon als root. Wer die Angriffsfläche reduzieren will, kann Docker im Rootless-Modus betreiben, also komplett ohne root-Rechte des Daemons. Das bringt zusätzliche Isolation, hat aber Einschränkungen, etwa bei Ports unter 1024 und beim Netzwerk. Für einen klassischen Homeserver-Einstieg ist die hier gezeigte Standardinstallation völlig ausreichend. Die Details zu Rootless finden Sie in der offiziellen Docker-Dokumentation.
Fazit
Mit dem offiziellen Docker-Repo, dem Compose-Plugin und einem Benutzer in der docker-Gruppe steht das Fundament für Ihr Self-Hosting. Sie kennen jetzt den kompletten Lebenszyklus eines Stacks: docker compose up -d zum Starten, logs -f zum Beobachten, pull plus up -d zum Aktualisieren und down zum Abbauen. Auf dieser Basis lassen sich praktisch alle gängigen Self-Hosting-Apps in wenigen Minuten ausrollen, von einem Reverse Proxy über einen Passwortmanager bis zur eigenen Foto-Cloud. Jeder weitere Dienst ist von nun an nur noch eine weitere compose.yml.
Passende nächste Schritte: Docker Compose: Multi-Container-Stacks aufbauen und Docker Compose absichern: Secrets, Healthchecks, Non-Root und Read-Only.
Weitere Anleitungen in den Kategorien Synology / NAS und Docker.
Quellen: Docker Docs: Install Docker Engine on Ubuntu, Docker Docs: Install Docker Engine on Debian, Uptime Kuma auf GitHub


