Anleitungen

Docker installieren auf Ubuntu 24.04 und Debian 12/13

Docker und Compose aus dem offiziellen Repository auf Ubuntu 24.04 oder Debian 12/13 installieren, ohne sudo nutzen und die Firewall nicht umgehen.

Veröffentlicht ~10 Min. Lesezeit

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.

Ubuntu 24.04 · 22.04 · Debian 12 · 13
# 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 version

Gibt 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).

  1. 1Konkurrierende Pakete entfernen

    Ubuntus docker.io, docker-compose-v2, containerd und runc stehen Dockers eigenen Paketen im Weg. Images und Volumes in /var/lib/docker bleiben 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
  2. 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.asc

    Der Schlüssel liegt in /etc/apt/keyrings und wird nur von Dockers Quelle referenziert, kann also für kein anderes Repository bürgen. Das ist der moderne Ersatz für das veraltete apt-key add.

  3. 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
    EOF

    Das ist das deb822-Format, das Ubuntu 24.04 für seine eigenen Quellen verwendet. Die einzeilige Alternative in /etc/apt/sources.list.d/docker.list funktioniert genauso gut; nimm eine der beiden, nicht beide. Auf einer Ableitung wie Linux Mint ersetzt du VERSION_CODENAME durch UBUNTU_CODENAME.

  4. 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
  5. 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:

Debian 12 · 13 — nach der Entfernung aus Schritt 1
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-ce zieht das iptables-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 ubuntu auf einer Debian-Maschine nennt (oder umgekehrt). Prüfe mit cat /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:

Rocky Linux 9
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-world

Auf 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:

Docker ohne sudo
sudo usermod -aG docker $USER
# abmelden und wieder anmelden (oder: newgrp docker nur für diese Shell)
docker run --rm hello-world

Warum 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:

von deinem eigenen PC
nc -zv 203.0.113.10 8080          # "succeeded" = aus dem Internet erreichbar

1. 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.

compose.yaml
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-Netzwerk

Bei 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:

Port 8080 nur von 203.0.113.7 erlauben
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 DROP

Von 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:

/etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
anwenden
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 Einstellungen

Existiert 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:

wo ist der Plattenplatz hin?
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-Cache

Ist 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:

aktualisieren
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 upgrade

Ein 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.

deinstallieren
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.asc

Was 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.

Kostenloses SSL-Zertifikat mit Let's Encrypt: Nginx-Reverse-Proxy mit HTTPS einrichten

Ein kostenloses SSL-Zertifikat von Let's Encrypt holen: App hinter Nginx legen, mit certbot HTTPS einrichten und WebSockets korrekt durchreichen.

Debian vs. Ubuntu für einen Server: was wirklich unterschiedlich ist

Beide laufen mit APT und systemd. Was auf einem Server zählt: Release- und Support-Dauer, sudo bei der Neuinstallation, Snap und Paketaktualität.

Permission denied while trying to connect to the Docker daemon socket: add your user to the docker group(engl.)

Your user cannot open /var/run/docker.sock. Add it to the docker group safely, fix snap, rootless Docker and CI runners — and why chmod 666 is wrong.

ERR_CONNECTION_REFUSED: why your server says no, and how to fix it(engl.)

ERR_CONNECTION_REFUSED means the server said no: nothing listens on the port, the app is bound to 127.0.0.1 or a firewall rejects it. How to fix each one.

curl: command not found — how to fix it on any Linux distribution(engl.)

curl is simply not installed. Fix: sudo apt install curl on Debian and Ubuntu, apk add curl on Alpine, dnf install curl on RHEL. Plus sudo, Docker and PATH.

Open WebUI and Ollama on a VPS: a private, self-hosted chat UI(engl.)

Run Ollama and Open WebUI together with Docker Compose on a VPS for a private, ChatGPT-style interface. Honest sizing for CPU-only hosting and no-GPU model limits.

Docker commands cheat sheet: containers, images, Compose and cleanup(engl.)

docker ps, rm, rmi, compose up -d and system prune — the Docker commands used daily, grouped by containers, images, Compose and freeing up disk space.