Um Docker auf Ubuntu 24.04 oder Debian 12/13 zu installieren, entfernst du zuerst die konkurrierenden Pakete der Distribution, fügst Dockers Signierschlüssel und dessen apt-Repository auf download.docker.com hinzu und installierst dann docker-ce mit der CLI, containerd.io sowie den Plugins Buildx und Compose. Der Daemon startet von selbst, und sudo docker run --rm hello-world bestätigt, dass alles funktioniert. Der folgende Block erledigt das komplett für Ubuntu 24.04 und 22.04 sowie für Debian 12 und 13: Er liest die Distribution und ihren Codenamen (noble, jammy, bookworm oder trixie) aus /etc/os-release.
# 1. konkurrierende Pakete entfernen
# ("not installed" und "Unable to locate package" sind harmlos)
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
sudo apt-get remove -y $pkg
done
# 2. Dockers Signierschlüssel
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
. /etc/os-release # setzt $ID (ubuntu oder debian) und $VERSION_CODENAME
sudo curl -fsSL https://download.docker.com/linux/$ID/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# 3. Dockers Repository
sudo tee /etc/apt/sources.list.d/docker.sources >/dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/$ID
Suites: $VERSION_CODENAME
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
# 4. Engine, CLI, containerd, Buildx und Compose
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 5. testen
sudo docker run --rm hello-world
docker --version && docker compose versionGibt hello-world „Hello from Docker!“ aus, läuft der Daemon. Die Abschnitte darunter erklären jeden Schritt, decken Rocky Linux ab und behandeln die drei Dinge, die auf einem frischen Server am häufigsten stolpern lassen: sudo, die Firewall und der Plattenplatz.
Welche Installationsmethode solltest du nehmen?
Es gibt drei gängige Wege, Docker auf einen Server zu bekommen, und sie sind nicht gleichwertig:
- Das
docker.io-Paket der Distribution (apt install docker.io). Docker Engine, von Ubuntu oder Debian selbst gebaut und gepflegt. Meist etwas hinter Dockers eigenen Releases, und Compose sowie Buildx kommen als separate Pakete. Für einen schnellen Test in Ordnung. - Dockers eigenes apt-Repository, der Weg in dieser Anleitung. Aktuelle Releases, jede Komponente aus einer Quelle, Updates zusammen mit dem Rest des Systems – die richtige Wahl für einen Server, den du länger behältst.
- Das Convenience-Skript von
get.docker.com. Es richtet dasselbe Repository in einem Befehl ein, ohne zu fragen. Docker empfiehlt es nicht für Produktionsserver.
Egal welche Methode: nur eine davon. docker.io und docker-ce stehen sich im Weg, deshalb entfernt Schritt 1 zuerst die Distributionspakete. Verzichte auf das Snap-Paket (snap install docker) auf einem Server: Es beschränkt den Dateizugriff auf dein Home-Verzeichnis und legt keine docker-Gruppe an.
Wie installiere ich Docker auf Ubuntu 24.04 oder 22.04?
Hier derselbe Ablauf mit ausgeschriebenen Ubuntu-URLs, damit du siehst, was jeder Schritt tut. Er funktioniert unverändert auf 24.04 (noble) und 22.04 (jammy).
- 1Konkurrierende Pakete entfernen
Ubuntus
docker.io,docker-compose-v2,containerdundruncstehen Dockers eigenen Paketen im Weg. Images und Volumes in/var/lib/dockerbleiben dabei unberührt.Ubuntu for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove -y $pkg done - 2Dockers Signierschlüssel hinzufügen
Ubuntu sudo apt-get update sudo apt-get 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.ascDer Schlüssel liegt in
/etc/apt/keyringsund wird nur von Dockers Quelle referenziert, kann also für kein anderes Repository bürgen. Das ist der moderne Ersatz für das veralteteapt-key add. - 3Repository hinzufügen
Ubuntu sudo tee /etc/apt/sources.list.d/docker.sources >/dev/null <<EOF Types: deb URIs: https://download.docker.com/linux/ubuntu Suites: $(. /etc/os-release && echo $VERSION_CODENAME) Components: stable Architectures: $(dpkg --print-architecture) Signed-By: /etc/apt/keyrings/docker.asc EOFDas ist das deb822-Format, das Ubuntu 24.04 für seine eigenen Quellen verwendet. Die einzeilige Alternative in
/etc/apt/sources.list.d/docker.listfunktioniert genauso gut; nimm eine der beiden, nicht beide. Auf einer Ableitung wie Linux Mint ersetzt duVERSION_CODENAMEdurchUBUNTU_CODENAME. - 4Pakete installieren
Ubuntu sudo apt-get update apt-cache policy docker-ce # der Kandidat muss von download.docker.com kommen sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin - 5Prüfen, dass alles läuft
Ubuntu systemctl status docker --no-pager # active (running), beim Boot aktiviert sudo docker run --rm hello-world sudo docker version # zeigt Client und Server
Wie installiere ich Docker auf Debian 12 und 13?
Genau wie auf Ubuntu, nur mit debian in beiden URLs. Docker veröffentlicht Pakete für Debian 12 (bookworm) und Debian 13 (trixie), sodass sich nur der Codename aus /etc/os-release ändert:
sudo apt-get update
sudo apt-get 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 >/dev/null <<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-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin- Kein sudo? Eine Debian-Installation mit Root-Passwort hat kein
sudo. Führe die Befehle als root ohne das Präfix aus, oder lies sudo: command not found (engl.). - iptables unter Debian 12 und 13.
docker-cezieht dasiptables-Paket nach sich, das auf beiden Releases auf nftables aufbaut. Docker nutzt es sofort für seine Regeln; nichts weiter zu konfigurieren. - „The repository … does not have a Release file“ bedeutet, dass Docker für diesen Codenamen keine Pakete hat, oder dass die URL
ubuntuauf einer Debian-Maschine nennt (oder umgekehrt). Prüfe mitcat /etc/apt/sources.list.d/docker.sources.
Wie installiere ich Docker auf Rocky Linux 9?
Auf Rocky, AlmaLinux und RHEL fügst du Dockers .repo-Datei mit dnf config-manager hinzu. Anders als bei Debian und Ubuntu startet der Dienst dabei nicht automatisch:
sudo dnf remove -y podman runc # nur falls vorhanden; sie kollidieren
sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo docker run --rm hello-worldAuf CentOS Stream 9 lautet der Repository-Pfad /linux/centos/docker-ce.repo. Die Firewall-Besonderheit weiter unten gilt auch für firewalld: Ports, die ein Container veröffentlicht, bleiben erreichbar, selbst wenn firewalld sie in seiner public-Zone nicht auflistet.
Wie führe ich Docker ohne sudo aus?
Füge deinen Benutzer zur Gruppe docker hinzu und starte eine neue Sitzung:
sudo usermod -aG docker $USER
# abmelden und wieder anmelden (oder: newgrp docker nur für diese Shell)
docker run --rm hello-worldWarum sind meine Container-Ports erreichbar, obwohl UFW sie blockiert?
Weil Docker eigene iptables-Regeln schreibt und der Traffic nie durch UFWs Regeln läuft. Wenn du einen Port veröffentlichst (-p 8080:80, oder ports: in Compose), fügt Docker eine NAT-Regel hinzu, die eingehende Pakete zur Adresse des Containers umleitet. Diese Pakete laufen dann durch die FORWARD-Kette des Kernels, nicht durch die INPUT-Kette, in der UFWs Erlauben- und Verbieten-Regeln stehen. Also ändert ufw deny 8080 nichts, ufw status zeigt den Port nicht einmal an, und eine Datenbank oder ein Admin-Panel, die so veröffentlicht wurden, stehen dem ganzen Internet offen.
Das ist der häufigste Docker-Fehler auf einem VPS. Teste von einer zweiten Maschine, nicht vom Server selbst:
nc -zv 203.0.113.10 8080 # "succeeded" = aus dem Internet erreichbar1. Interne Dienste nur auf 127.0.0.1 veröffentlichen, oder gar nicht. Ein an die Loopback-Adresse gebundener Port ist nur vom Server selbst erreichbar, zum Beispiel von einem Reverse-Proxy auf dem Host. Container im selben Compose-Projekt erreichen sich über den Dienstnamen im Projekt-Netzwerk und brauchen keinen veröffentlichten Port.
services:
app:
image: nginx
ports:
- "127.0.0.1:8080:80" # nur der Host erreicht das
db:
image: postgres:17
environment:
POSTGRES_PASSWORD: change-me
# kein "ports:" — app erreicht db als db:5432 im Compose-NetzwerkBei docker run ist das -p 127.0.0.1:8080:80. Als Sicherheitsnetz macht "ip": "127.0.0.1" in /etc/docker/daemon.json Loopback zum Standard für jeden veröffentlichten Port; ein wirklich öffentlicher Port muss das dann ausdrücklich sagen, etwa als 0.0.0.0:443:443.
2. In der DOCKER-USER-Kette filtern, wenn ein Port öffentlich bleiben muss, aber nur für bestimmte Adressen. Docker wertet diese Kette vor seinen eigenen Regeln aus und lässt, was du dort eintragst, unberührt:
ip route show default # dein öffentliches Interface, z. B. eth0 oder ens18
sudo iptables -I DOCKER-USER -i eth0 ! -s 203.0.113.7 -p tcp \
-m conntrack --ctorigdstport 8080 --ctdir ORIGINAL -j DROPVon Hand hinzugefügte Regeln sind nach einem Neustart weg. Um sie zu behalten, trage sie am Ende von /etc/ufw/after.rules ein und führe sudo ufw reload aus; das Open-Source-Tool ufw-docker automatisiert genau das.
Wie verhindere ich, dass Container-Logs die Platte füllen?
Begrenze sie in /etc/docker/daemon.json. Der Standard-Log-Treiber json-file behält alles, was ein Container auf stdout schreibt, ohne Größenlimit – ein geschwätziger Container kann so eine kleine Platte innerhalb von Wochen füllen. Rotation bei 10 MB mit drei Dateien begrenzt jeden Container auf rund 30 MB:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}sudo dockerd --validate --config-file=/etc/docker/daemon.json # "configuration OK"
sudo systemctl restart docker # stoppt Container; Restart-Policies holen sie zurück
docker compose up -d --force-recreate # je Compose-Projekt: alte Container behalten alte EinstellungenExistiert die Datei schon, füge die Schlüssel zusammen, statt sie zu überschreiben, und lass die Werte in Anführungszeichen. Die Limits gelten nur für Container, die nach der Änderung erstellt werden, deshalb erstellt die letzte Zeile sie neu. Wer Platz belegt, zeigen:
docker system df # Images, Container, Volumes, Build-Cache
sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail
docker image prune -a # ungenutzte Images (fragt nach)
docker builder prune # Build-CacheIst die Platte schon voll, beginne mit No space left on device (engl.).
docker compose oder docker-compose – was nutzen?
Nutze docker compose, mit Leerzeichen. Das ist Compose v2, ein Plugin der Docker-CLI, das das Paket docker-compose-plugin installiert. Das mit Bindestrich geschriebene docker-compose ist Compose v1, ein eigenständiges Python-Programm, das seit 2023 keine Updates mehr bekommt. Die YAML-Dateien sind dieselben; nur der Befehl hat sich geändert.
Wie aktualisiere oder deinstalliere ich Docker?
Docker-Updates kommen mit einem normalen Systemupdate, weil die Pakete aus einem apt-Repository stammen. Unattended Upgrades nehmen auf Debian und Ubuntu standardmäßig nur Pakete aus den eigenen Archiven der Distribution, Docker selbst wird also nicht automatisch aktualisiert. Führe das Update von Zeit zu Zeit selbst aus:
sudo apt-get update
sudo apt-get install --only-upgrade docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
# oder einfach: sudo apt-get upgradeEin Upgrade startet den Daemon neu und mit ihm jeden Container. Gib deinen Diensten eine Restart-Policy (restart: unless-stopped in Compose), damit sie von selbst zurückkommen.
sudo apt-get purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin \
docker-compose-plugin docker-ce-rootless-extras
sudo rm -rf /var/lib/docker /var/lib/containerd # löscht ALLE Images, Container und Volumes
sudo rm /etc/apt/sources.list.d/docker.sources /etc/apt/keyrings/docker.ascWas braucht ein VPS, um Docker auszuführen?
Einen eigenen Kernel. Docker setzt auf Namespaces, Cgroups, Overlay-Dateisysteme und Netfilter, und eine KVM-virtuelle-Maschine kontrolliert all das selbst, genau wie ein physischer Server. Bei containerbasierter Virtualisierung wie OpenVZ oder LXC startet Docker oft gar nicht oder braucht Workarounds. Der Daemon selbst ist leicht; was die Servergröße entscheidet, sind die Container, die du betreibst, plus Plattenplatz für ihre Images.
Bei VMHeaven nehmen die Vorlagen Ubuntu 24.04 und 22.04, Debian 13 und 12 sowie Rocky Linux 9 die Befehle oben unverändert an. Der Einstiegstarif Standard KVM mit 2 Kernen, 4 GB RAM und 20 GB Speicher ab 4,99 € im Monat in Amsterdam reicht für eine Handvoll kleiner Container wie einen Reverse-Proxy, eine Web-App und ihre Datenbank. Die Seiten Ubuntu VPS und Debian VPS listen die Tarife nach Distribution.
Häufige Fragen
Warum meldet apt „Paket docker-ce nicht gefunden“?
Das ist die deutsche Variante von „E: Unable to locate package docker-ce“: apt kennt das Docker-Repository noch nicht, oder du hast nach dem Hinzufügen kein sudo apt-get update ausgeführt. Prüfe /etc/apt/sources.list.d/docker.sources und ob apt-cache policy docker-ce als Kandidaten eine Version von download.docker.com zeigt.
Wie installiere ich Docker Compose unter Ubuntu?
Separat musst du nichts installieren: Das Paket docker-compose-plugin aus dem Docker-Repository kommt zusammen mit docker-ce und wird mit Leerzeichen aufgerufen, also docker compose. Das alte docker-compose mit Bindestrich ist Compose v1 und wird seit 2023 nicht mehr aktualisiert; die YAML-Dateien beider Versionen sind identisch.
Warum ist mein Container-Port offen, obwohl UFW ihn blockiert?
Docker schreibt eigene iptables-Regeln für veröffentlichte Ports. Eingehende Pakete werden zum Container umgeleitet und laufen durch die FORWARD-Kette, nicht durch die INPUT-Kette, in der UFWs Regeln stehen – UFW sieht sie also nie. Veröffentliche interne Dienste nur auf 127.0.0.1 (z. B. -p 127.0.0.1:8080:80) oder filtere öffentliche Ports in der DOCKER-USER-Kette.