Docker auf vServer installieren: Anleitung für Ubuntu und Debian, mit Compose und der Firewall-Falle

Docker auf dem vServer: prüfen, ob LXC oder KVM, Installation aus dem offiziellen Repository, erstes Compose-Projekt und wie du verhinderst, dass Docker deine Firewall umgeht.

Um Docker auf einem vServer zu installieren, richtest du unter Ubuntu oder Debian das offizielle Docker-Repository ein und installierst die Pakete docker-ce und docker-compose-plugin. Vorher solltest du prüfen, ob dein Server ein LXC-Container oder eine KVM-Maschine ist. Danach legst du fest, welche Ports nach außen gehen, denn Docker öffnet veröffentlichte Ports an einer klassischen Firewall wie ufw vorbei.

Diese Anleitung geht den ganzen Weg mit dir durch: Vorabcheck, Installation, ein erstes Compose-Projekt und die Einstellungen, die dir später Ärger mit vollen Festplatten und offenen Ports ersparen.

Läuft Docker auf jedem vServer?

Grundsätzlich ja, aber die Art der Virtualisierung macht einen Unterschied. Bei einer KVM-Maschine hast du einen eigenen Kernel. Docker verhält sich dort wie auf einem normalen Linux-Rechner, alle Funktionen stehen zur Verfügung.

Ein LXC-Container teilt sich den Kernel mit dem Host. Docker startet darin selbst wieder Container, also Container im Container. Das funktioniert, wenn der Anbieter verschachtelte Container (Nesting) erlaubt. Einzelne Dinge, die tief in den Kernel eingreifen, etwa eigene Kernelmodule oder bestimmte Netzwerk-Tricks, sind im LXC-Container nicht möglich. Für typische Anwendungen wie Webserver, Datenbanken, Monitoring oder kleine Web-Apps merkst du davon in der Regel nichts.

Wenn du die Unterschiede genauer verstehen willst, findest du im Beitrag LXC vs KVM: Welcher virtuelle Server passt zu deinem Projekt? eine ausführliche Gegenüberstellung.

So prüfst du, was du vor dir hast

Melde dich per SSH an und frag das System selbst:

systemd-detect-virt

Kommt lxc zurück, sitzt du in einem Container. Bei kvm hast du eine vollwertige virtuelle Maschine. Diese eine Zeile spart dir später viel Rätselraten, wenn eine Fehlermeldung auftaucht.

Vorbereitung: Was du vor der Installation erledigen solltest

Bevor Docker auf den Server kommt, lohnen sich drei kurze Schritte:

  • System aktualisieren mit sudo apt update && sudo apt upgrade.
  • Alte oder inoffizielle Docker-Pakete entfernen, falls vorhanden, etwa docker.io oder podman-docker. Sie kollidieren sonst mit den offiziellen Paketen.
  • Den Zugang absichern: SSH-Schlüssel statt Passwort, ein Benutzer mit sudo statt dauerhaft root.

Wie du dich per Schlüssel anmeldest und was du tust, wenn SSH mal nicht erreichbar ist, steht im Hilfeartikel Zugang zum Server: SSH, Schlüssel und Konsole. Die Browser-Konsole ist dabei dein Rettungsanker, falls du dich beim Basteln an der Firewall aussperrst.

sudo apt remove docker.io docker-compose docker-doc podman-docker containerd runc

Meldet apt, dass keines der Pakete installiert ist, ist das völlig in Ordnung.

Docker auf dem vServer installieren: Schritt für Schritt

Das Paket docker.io aus den Distributions-Quellen ist oft älter. Für aktuelle Versionen und das Compose-Plugin nimmst du das offizielle Repository von Docker. Die Befehle unten gelten für Ubuntu. Unter Debian ersetzt du in den URLs einfach ubuntu durch debian.

  1. Voraussetzungen installieren und Schlüssel einrichten:
    sudo apt update
    sudo apt 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
  2. Repository hinzufügen:
    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
  3. Docker und Compose installieren:
    sudo apt update
    sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  4. Dienst beim Systemstart aktivieren:
    sudo systemctl enable --now docker
  5. Testen:
    sudo docker run --rm hello-world
    Erscheint die Begrüßungsnachricht, läuft Docker.

Docker ohne sudo nutzen, aber mit Bedacht

Viele Anleitungen empfehlen, deinen Benutzer in die Gruppe docker aufzunehmen:

sudo usermod -aG docker $USER

Das ist bequem, aber sei dir bewusst: Wer Docker steuern darf, hat praktisch Root-Rechte auf dem Server. Er kann zum Beispiel das gesamte Dateisystem in einen Container einhängen. Füge also nur Benutzer hinzu, denen du auch root anvertrauen würdest. Nach dem Befehl einmal ab- und wieder anmelden, sonst greift die Gruppe nicht.

Wenn es im LXC-Container hakt

Startet der Docker-Dienst im Container nicht oder bricht hello-world mit Berechtigungsfehlern ab, schau dir zuerst die Logs an:

sudo journalctl -u docker --no-pager | tail -n 30
docker info | grep -i "storage driver"

Meldungen zu fehlenden Rechten deuten meist darauf hin, dass Nesting für den Container nicht freigegeben ist. Das kannst du von innen nicht ändern. In dem Fall fragst du beim Support nach oder nutzt, falls angeboten, einen vorbereiteten Docker-Installer im Panel.

Das erste Projekt mit Docker Compose

Einzelne docker run-Befehle sind zum Testen gut. Für alles, was dauerhaft laufen soll, nimmst du Docker Compose. Damit steht die komplette Konfiguration in einer Datei, die du sichern, versionieren und auf einen neuen Server mitnehmen kannst.

Als Beispiel ein kleiner Webserver mit nginx. Lege dafür einen Ordner an:

mkdir -p ~/apps/web && cd ~/apps/web
mkdir html
echo "Hallo vom vServer" > html/index.html

Dann die Datei compose.yaml:

services:
  web:
    image: nginx:stable
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro

Starten, Status prüfen, Logs ansehen:

docker compose up -d
docker compose ps
docker compose logs -f

Zwei Details sind hier bewusst gewählt. restart: unless-stopped sorgt dafür, dass der Container nach einem Neustart des Servers von selbst wieder hochkommt. Und die Portangabe beginnt mit 127.0.0.1, dazu gleich mehr.

Beachte außerdem: Der neue Befehl lautet docker compose mit Leerzeichen. Das alte docker-compose mit Bindestrich ist ein separates, inzwischen veraltetes Programm.

Die Firewall-Falle: Warum Docker-Ports trotz ufw offen sind

Das ist der Punkt, über den die meisten stolpern. Du hast ufw eingerichtet, nur SSH, HTTP und HTTPS erlaubt, startest einen Container mit -p 3306:3306 und wunderst dich, dass deine Datenbank aus dem Internet erreichbar ist.

Der Grund: Docker schreibt eigene iptables-Regeln, um Pakete an die Container weiterzuleiten. Diese Regeln greifen, bevor ufw überhaupt gefragt wird. Eine Port-Freigabe in Docker ist also gleichbedeutend mit einer offenen Tür, egal was in ufw steht.

So bleibst du auf der sicheren Seite

  • Nur an localhost binden: Alles, was nicht direkt öffentlich sein muss, veröffentlichst du mit 127.0.0.1:PORT:PORT. Davor setzt du einen Reverse Proxy, der als einziger Container die Ports 80 und 443 öffnet.
  • Gar nicht veröffentlichen: Container im selben Compose-Projekt erreichen sich über ihr internes Netzwerk und den Dienstnamen, etwa db:3306. Eine Datenbank braucht meistens überhaupt keinen ports-Eintrag.
  • Zweite Schicht nutzen: Eine Firewall, die du im Panel deines Anbieters pro Server pflegst, ist eine sinnvolle Ergänzung. Wie du dort Regeln anlegst, ohne dich selbst auszusperren, beschreibt der Artikel Netzwerk: Firewall-Regeln, rDNS und IPv6.

Und dann prüfst du von außen, nicht vom Server selbst. Von deinem eigenen Rechner aus zeigt dir zum Beispiel nmap, was tatsächlich erreichbar ist:

nmap -Pn DEINE-SERVER-IP

Taucht ein Port auf, den du nicht erwartet hast, schaust du auf dem Server mit docker ps nach, welcher Container ihn veröffentlicht. Weitere Grundregeln für einen frischen Server findest du in vServer absichern: Die ersten Schritte nach der Bereitstellung.

Speicherplatz und Logs im Griff behalten

Docker frisst still und leise Festplatte. Alte Images bleiben nach Updates liegen, und Container-Logs wachsen standardmäßig ohne Grenze. Auf einem kleinen vServer ist die Platte schneller voll, als man denkt.

Leg deshalb gleich zu Beginn eine Log-Rotation fest. Erstelle oder ergänze die Datei /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

Danach sudo systemctl restart docker. Die Einstellung gilt für neu erstellte Container. Bestehende erstellst du mit docker compose up -d --force-recreate neu.

Einen Überblick, wo der Platz hingeht, und das Aufräumen erledigst du mit:

docker system df
docker image prune -a

Vorsicht mit docker volume prune: Volumes enthalten oft deine eigentlichen Daten, etwa Datenbanken. Lösche sie nur, wenn du genau weißt, dass sie verwaist sind.

Auslastung im Blick

Docker selbst braucht nur wenig Arbeitsspeicher. Entscheidend ist, was in den Containern läuft. Mit docker stats siehst du live, welcher Container wie viel CPU und RAM verbraucht. Wird es knapp, kannst du einzelnen Diensten in der Compose-Datei mit mem_limit eine Obergrenze geben, damit nicht ein Dienst alle anderen ausbremst.

Updates und Backups für Container

Container aktualisieren sich nicht von selbst. Der übliche Weg im Projektordner:

docker compose pull
docker compose up -d
docker image prune -f

Für Backups gilt eine einfache Faustregel: Container sind austauschbar, Daten nicht. Sichere also die Compose-Dateien und alle eingehängten Ordner oder Volumes. Bei Datenbanken ist ein Dump zuverlässiger als das Kopieren der laufenden Datenbankdateien, zum Beispiel:

docker compose exec db mysqldump -u root -p --all-databases > backup.sql

Zusätzlich lohnt sich ein Snapshot des ganzen Servers vor größeren Umbauten. So kommst du mit einem Klick zurück, wenn ein Update schiefgeht.

Docker auf einem Server bei Hostleaf

Wenn du einen passenden Server suchst: Bei Hostleaf sind vServer LXC-Container, Rootserver sind KVM-Maschinen mit eigenem Kernel, beide in Rechenzentren in Deutschland und den Niederlanden und mit DDoS-Schutz. Für LXC-vServer gibt es einen Auto-Installer, der unter anderem Docker per Klick einrichtet. Im Panel kannst du außerdem Firewall-Regeln pro Server pflegen und Backups anlegen. Brauchst du volle Kernel-Kontrolle, ist ein KVM-Rootserver die passendere Wahl. Die Anleitung oben funktioniert aber genauso bei jedem anderen Anbieter.

FAQ

Kann ich Docker in einem LXC-Container installieren?

Ja, sofern der Anbieter verschachtelte Container (Nesting) für deinen Container erlaubt. Gängige Anwendungen laufen dann problemlos. Nicht möglich sind Dinge, die eigene Kernelmodule oder tiefe Kernel-Eingriffe brauchen. Dafür nimmst du eine KVM-Maschine.

Brauche ich für Docker einen Rootserver mit KVM?

Nicht zwingend. Für Webanwendungen, Datenbanken, Monitoring oder kleine Tools reicht ein vServer im LXC-Container meist aus. KVM lohnt sich, wenn du spezielle Kernel-Funktionen, eigene Netzwerk-Setups oder Windows-Container-Experimente brauchst.

Warum ist mein Docker-Container erreichbar, obwohl ufw den Port blockiert?

Docker legt eigene iptables-Regeln an, die vor ufw greifen. Veröffentliche Ports deshalb nur an 127.0.0.1, verzichte bei internen Diensten ganz auf ports und prüfe von außen mit nmap, was wirklich offen ist.

Was ist der Unterschied zwischen docker-compose und docker compose?

docker-compose ist die alte, eigenständige Version. docker compose ist das aktuelle Plugin, das mit dem Paket docker-compose-plugin installiert wird. Die Compose-Dateien sind weitgehend kompatibel, neue Projekte solltest du mit dem Plugin starten.

Weitere Beiträge