Voraussetzungen
Bevor Sie beginnen, sollten die folgenden Punkte erfüllt sein:
- Per Schlüssel abgesicherter SSH-Zugang: SSH-Schlüssel-Anleitung
- Konfigurierte UFW-Firewall: UFW-Anleitung (lesen Sie auch den Abschnitt Docker und UFW weiter unten, bevor Sie Ports freigeben)
- Ein Non-Root-Benutzer mit sudo-Rechten oder direkter Root-Zugang
- Betriebssystem: Debian 13 (Trixie) oder Ubuntu 24.04 LTS
Schritt 1: Das offizielle Docker-Repository hinzufügen
Installieren Sie nicht das von Debian/Ubuntu bereitgestellte Paket docker.io: Es hinkt den offiziellen Versionen hinterher. Verwenden Sie das Repository von Docker Inc., um docker-ce zu erhalten, die aktiv gepflegte Version.
Unter Debian 13
Quelle: docs.docker.com/engine/install/debian/
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
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update Unter Ubuntu 24.04
Quelle: docs.docker.com/engine/install/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/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update Schritt 2: Docker Engine und Docker Compose installieren
sudo apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin Dieser Befehl installiert gleichzeitig:
- docker-ce: die Docker Engine
- docker-ce-cli: die Kommandozeilenschnittstelle
- containerd.io: die Container-Laufzeitumgebung
- docker-buildx-plugin: das Plugin für plattformübergreifende Builds
- docker-compose-plugin: Docker Compose v2 (Befehl
docker compose, ohne Bindestrich)
Überprüfen Sie die Installation:
docker --version
docker compose version Wichtiger Hinweis zu Docker Compose: Das v2-Plugin heißt docker compose (zwei Wörter, ohne Bindestrich). Das alte Standalone-Binary docker-compose (mit Bindestrich) ist die Version v1, seit Juli 2023 veraltet und wird hier nicht installiert. Quelle: docs.docker.com/compose/migrate/
Aktivieren Sie Docker beim Systemstart:
sudo systemctl enable docker.service
sudo systemctl enable containerd.service Quelle: docs.docker.com/engine/install/linux-postinstall/
Schritt 3: Non-Root-Zugriff konfigurieren
Den Benutzer zur docker-Gruppe hinzufügen
Standardmäßig erfordern Docker-Befehle sudo. Um sie ohne sudo auszuführen, fügen Sie den Benutzer zur docker-Gruppe hinzu:
sudo usermod -aG docker $USER
newgrp docker Der Befehl newgrp docker übernimmt die Änderung in der aktuellen Sitzung, ohne dass Sie sich abmelden müssen. Quelle: docs.docker.com/engine/install/linux-postinstall/
Sicherheitshinweis zur docker-Gruppe
Schritt 4: Erster Testcontainer
Überprüfen Sie mit dem offiziellen hello-world-Image, dass die Installation funktioniert:
docker run hello-world Docker lädt das Image von Docker Hub herunter, falls es lokal nicht vorhanden ist, startet einen Container, zeigt eine Bestätigungsmeldung an und beendet sich. Eine Ausgabe mit "Hello from Docker!" bestätigt, dass die Installation einsatzbereit ist.
Docker und UFW: die Falle, die Sie kennen sollten
Was konkret passiert
Wenn Sie einen Container mit docker run -p 8080:80 nginx starten, wird Port 8080 auf allen Netzwerkschnittstellen des VPS geöffnet, einschließlich der öffentlichen IP, selbst wenn UFW diesen Port nicht erlaubt. Quelle: docs.docker.com/engine/network/packet-filtering-firewalls/
Die bewährte Praxis: an 127.0.0.1 binden
Um einen Port nur lokal freizugeben (erreichbar vom VPS aus, aber nicht aus dem Internet), binden Sie ihn an die Loopback-Schnittstelle:
# Befehl docker run
docker run -p 127.0.0.1:8080:80 nginx
# In einer compose.yml
ports:
- "127.0.0.1:8080:80" Port 8080 ist dann nur vom VPS selbst aus erreichbar (zum Beispiel über einen Nginx-Reverse-Proxy) und nicht von außen.
Für Ports, die öffentlich bleiben müssen
Verwenden Sie die iptables-Kette DOCKER-USER, um den Datenverkehr zu filtern, bevor Docker ihn verarbeitet. Fügen Sie eine Regel in /etc/ufw/after.rules hinzu oder konfigurieren Sie iptables direkt. Die offizielle Dokumentation beschreibt diesen Ansatz im Detail: Restrict connections to the Docker host.
Praktische Empfehlung
Für einen VPS, der Webdienste über Docker hostet:
- Binden Sie standardmäßig alle Container an
127.0.0.1 - Setzen Sie einen Nginx-Reverse-Proxy davor (die Ports 80 und 443 werden von Nginx verwaltet, nicht direkt von Docker)
- Öffnen Sie in UFW nur die Ports 80 und 443 (UFW-Anleitung)
- Exponieren Sie niemals Datenbank-Ports (3306, 5432, 6379) direkt auf der öffentlichen IP
Wartung der Container
Ungenutzte Ressourcen bereinigen
Docker sammelt Images, gestoppte Container, verwaiste Volumes und Netzwerke an. Bereinigen Sie regelmäßig:
# Alle gestoppten Container, ungenutzten Images und verwaisten Netzwerke entfernen
docker system prune
# Auch ungenutzte Volumes einbeziehen (Achtung: endgültige Löschung)
docker system prune --volumes Die Logs eines Containers einsehen
# Logs des Containers anzeigen
docker logs container_name
# Verfolgung in Echtzeit
docker logs -f container_name
# Anzahl der angezeigten Zeilen begrenzen
docker logs --tail 100 container_name Docker Engine aktualisieren
sudo apt update
sudo apt upgrade docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin Ein Docker-Image aktualisieren
# Die neueste Version des Images herunterladen
docker pull image_name:tag
# Den Container mit dem neuen Image neu erstellen
docker compose pull
docker compose up -d Welche VPS-Konfiguration für Docker?
| Einsatzzweck | Empfohlener RAM | OuiHeberg-Angebot |
|---|---|---|
| 1 bis 3 leichte Container (Website, Bot, API) | 4 GB | VPS Linux 04G: 7,00 € inkl. MwSt./Monat |
| Kompletter Stack (App + Datenbank + Cache) | 8 GB | Die Linux-VPS-Reihe ansehen |
| Mehrere Projekte oder ressourcenintensive Dienste | 16 GB+ | Die Linux-VPS-Reihe ansehen |
Diese Schätzungen gehen von Containern im Standard-Produktivbetrieb aus. Der Bedarf variiert je nach verwendeten Images und gleichzeitigem Datenverkehr.
Häufige Fragen
Was ist der Unterschied zwischen docker.io und docker-ce?
docker.io ist das Docker-Paket aus den Debian/Ubuntu-Repositories. Es hinkt den offiziellen Versionen oft hinterher und erhält Updates nicht so schnell. docker-ce (Community Edition) ist das Paket, das direkt von Docker Inc. über das offizielle Repository gepflegt wird. Diese Anleitung verwendet docker-ce.
Ist Docker Compose v2 mit alten docker-compose.yml-Dateien kompatibel?
Ja. Das Format der Dateien compose.yml (oder docker-compose.yml) ist zwischen v1 und v2 kompatibel. Der einzige sichtbare Unterschied ist der Befehl: docker compose (v2, Plugin) ersetzt docker-compose (v1, Standalone-Binary). Die Syntax der Dateien bleibt für die große Mehrheit der Anwendungsfälle identisch.
Wie überprüfen Sie nach einem Neustart des VPS, ob Docker läuft?
sudo systemctl status docker Wenn Docker mit systemctl enable docker.service konfiguriert wurde, startet es automatisch. Prüfen Sie auch, ob die Container in der compose.yml mit der passenden Neustart-Richtlinie konfiguriert sind: restart: unless-stopped oder restart: always.
Kann Docker ohne Root-Zugriff verwendet werden?
Ja, über den Rootless-Modus. Docker kann vollständig ohne Root-Privilegien laufen, was die Angriffsfläche reduziert. Die Einrichtung ist aufwendiger und hier dokumentiert: docs.docker.com/engine/security/rootless/
Wie schützen Sie den Docker-Daemon zusätzlich?
Ein erster Schritt ist die Konfiguration von Fail2ban zum Schutz des SSH-Zugangs zum VPS: siehe die Fail2ban-Anleitung. Für Docker selbst gilt: Exponieren Sie niemals den Docker-Socket (/var/run/docker.sock) gegenüber nicht vertrauenswürdigen Containern und aktivieren Sie die Docker-TCP-API nicht ohne beidseitiges TLS.
Docker ist installiert? Gehen Sie vor dem Produktivbetrieb die Absicherung Ihres VPS von A bis Z durch.
