Website-Suche

Wie man zu Rootless Docker in Debian und Ubuntu Linux migriert


Docker ist ein fantastisches Werkzeug, das es Ihnen ermöglicht, Anwendungen in sauberen, isolierten Boxen, sogenannten Containern, auszuführen. Dies macht die Entwicklung und den Versand von Software viel schneller und konsistenter. Aber es gibt einen kleinen Haken, den Sie kennen sollten. Standardmäßig läuft Docker oft mit 'Root'-Rechten, dem höchsten Zugriffslevel auf einem Linux-System. Dies kann ein Sicherheitsrisiko darstellen. Zum Glück gibt es eine viel sicherere Methode: Rootless Docker.

Dieser Leitfaden führt Sie durch alles, was Sie über die rootlose Docker-Migration wissen müssen. Wir erklären, warum Sie wechseln sollten, und zeigen Ihnen genau, wie Sie Ihre Rootful Docker-Einrichtung Schritt für Schritt auf Rootless Docker migrieren. Lassen Sie uns Ihre Container sicherer machen!

Was ist Rootless Docker?

Rootless-Modus in Docker ist genau das, wonach es klingt: Er ermöglicht es Ihnen, den Docker-Daemon und Ihre Container als normaler, nicht-root Benutzer auszuführen. Das ist ein großer Gewinn für die Sicherheit.

Hier ist, warum Docker ohne Root nützlich ist:

  • Es verhindert Sicherheitsprobleme: Das Ausführen als Nicht-Root-Benutzer schützt Sie vor potenziellen Schwachstellen in Docker oder der Container-Laufzeitumgebung. Wenn ein Sicherheitsproblem innerhalb eines Containers auftritt, kann es nicht leicht entkommen und Ihr gesamtes Hostsystem beeinträchtigen, da es keinen Root-Zugriff hat.
  • Sie benötigen kein 'sudo': Sie können Docker installieren und verwalten, ohne Root-Rechte zu benötigen. Dies ist ideal für Umgebungen, in denen Sie keinen Administratorzugang haben oder keinen verwenden möchten.

Die Magie hinter dem Rootless-Modus ist eine Linux-Funktion namens Benutzernamensräume. Man kann sich das vorstellen wie eine spezielle Blase für Ihren Benutzer zum Spielen. Innerhalb dieser Blase kann Ihr Benutzer wie ein Administrator agieren, aber er kann nichts außerhalb davon beeinflussen.

Dies unterscheidet sich von anderen Methoden, bei denen der Docker-Daemon selbst weiterhin als Root ausgeführt wird. Im Rootless-Modus laufen sowohl der Daemon als auch der Container sicher ohne Root-Rechte.

Rootless Docker vs. Docker mit Nicht-Root-Benutzer

Bitte beachten Sie, dass Docker als Nicht-Root-Benutzer auszuführen und Docker im rootlosen Modus auszuführen unterschiedlich sind.

Rootless Docker (Echt Rootless)

  • Der Docker-Daemon selbst läuft als Nicht-Root-Benutzer
  • Keine docker-Gruppe erforderlich
  • Verwendet Benutzernamensräume, um den Container-Root auf einen unprivilegierten Host-Benutzer abzubilden
  • Speicher im Home-Verzeichnis des Benutzers (~/.local/share/docker/)
  • Sicherer, aber mit Einschränkungen (keine privilegierten Operationen, einige Netzwerkbeschränkungen)

Docker mit Nicht-Root-Benutzer (Traditionell)

  • Der Docker-Daemon läuft immer noch als Root (dockerd-Prozess)
  • Reguläre Benutzer werden zur docker-Gruppe hinzugefügt
  • Benutzer können docker-Befehle ohne sudo ausführen
  • Container haben immer noch Root-Privilegien auf dem Host-System
  • Verwendet Standardorte wie /var/lib/docker/
  • Sicherheitsbedenken: Mitglied der docker-Gruppe zu sein, ist gleichbedeutend damit, Root-Zugriff zu haben

Ich hoffe, du verstehst den Unterschied zwischen diesen beiden.

Vorbereitung auf die Rootless-Docker-Einrichtung

Bevor wir anfangen, benötigen Sie nur ein paar Dinge. Der Ablauf ist reibungslos, wenn Sie diese Voraussetzungen bereit haben.

  • Ein Linux-System: Ubuntu wird vom Docker-Team sehr empfohlen, da sein Kernel eine hervorragende Unterstützung für den overlay2-Speichertreiber bietet, den der rootless-Modus benötigt. Docker funktioniert jedoch auf jeder Linux-Distribution einwandfrei. Ich habe dieses Setup auf Debian 13 und Ubuntu 24.04 LTS getestet, es funktioniert direkt nach der Installation.
  • Einige wichtige Pakete: Sie müssen uidmap installieren (das Werkzeuge namens newuidmap und newgidmap enthält) und dbus-user-session.
  • Benutzer-ID-Bereiche: Ihr System muss Ihrem Benutzer einen Block von Benutzer-IDs (UIDs) und Gruppen-IDs (GIDs) zur Nutzung für seine Container bereitstellen. Sie müssen dies in den Dateien /etc/subuid und /etc/subgid einrichten. Ein Block von 65.536 ist in der Regel für die meisten Anforderungen ausreichend.
  • Wichtige Daten sichern: Stellen Sie sicher, dass Sie alle wichtigen Daten gesichert haben, deren Verlust Sie sich nicht leisten können.

Schritt-für-Schritt-Anleitung zur Migration von Rootful Docker zu Rootless Docker

Ich gehe davon aus, dass Sie bereits Docker im Root-Modus installiert und ausgeführt auf Ihrem Linux-System haben. Wenn nicht, folgen Sie den angegebenen Links, um Docker auf Ihrem bevorzugten System einzurichten.

  • Docker und Docker Compose in Debian installieren
  • Docker und Docker Compose in Ubuntu installieren

Schritt 1: Stoppen und Deaktivieren Ihres alten Rootful-Docker-Setups

Zuerst das Wichtigste: Wenn Sie den standardmäßigen, systemweiten Docker ausführen (d.h. Rootful Docker), müssen Sie ihn stoppen und deaktivieren. Dies verhindert jegliche Konflikte.

Führen Sie diese Befehle in Ihrem Terminal aus:

sudo systemctl disable --now docker.service docker.socket
sudo rm /var/run/docker.sock

Dies stoppt Docker und entfernt seine alte Socket-Datei.

Schritt 2: Installieren Sie die notwendigen Werkzeuge

Als Nächstes installieren wir die Pakete, die wir zuvor erwähnt haben.

sudo apt install -y uidmap dbus-user-session systemd-container docker-ce-rootless-extras

Dieser einzelne Befehl installiert uidmap für die Benutzerzuordnung, dbus-user-session für die Verwaltung Ihrer Sitzung und docker-ce-rootless-extras, das ein hilfreiches Einrichtungstool enthält.

Schritt 3: Loggen Sie sich auf die richtige Weise ein (Das ist wichtig!)

Jetzt müssen Sie sich als der Benutzer anmelden, der Docker ohne Root-Rechte ausführen wird. Sie können einen neuen Benutzer erstellen oder Ihren vorhandenen verwenden.

Wichtiger ist, dass Sie sich mit einer Methode anmelden müssen, die pam_systemd unterstützt. Verwenden Sie nicht sudo su. Die richtige Methode richtet automatisch eine wichtige Umgebungsvariable namens $XDG_RUNTIME_DIR ein. Der einfachste Weg ist mit dem Befehl machinectl, den Sie im vorherigen Schritt installiert haben.

sudo machinectl shell $(whoami)@

Dies meldet Sie als Ihren aktuellen Benutzer auf einer neuen Shell an, auf die korrekte Weise.

Wenn Sie sich als anderer Benutzer anmelden möchten (z. B. senthil), geben Sie dies einfach wie unten gezeigt an:

sudo machinectl shell senthil@

Wenn Sie nach Ausführen des obigen Befehls die folgende Ausgabe sehen, sind Sie startklar:

Connected to the local host. Press ^] three times within 1s to exit session.

Schritt 4: Rootless Docker installieren

Sie sind jetzt als Ihr Benutzer eingeloggt und bereit zur Installation. Führen Sie das rootless Docker-Setup-Skript aus:

dockerd-rootless-setuptool.sh install

Das Skript richtet einen systemd-Dienst für Docker ein, der unter Ihrem Benutzerkonto ausgeführt wird.

Nach einer erfolgreichen rootless Docker-Migration erhalten Sie eine Ausgabe wie unten:

[...]
debian13desktop dockerd-rootless.sh[5760]: time="2025-09-05T18:28:28.173512284+05:30" level=info msg="API listen on /run/user/1001/docker.sock"
+ DOCKER_HOST=unix:///run/user/1001/docker.sock /usr/bin/docker version
Client: Docker Engine - Community
 Version:           28.4.0
 API version:       1.51
 Go version:        go1.24.7
 Git commit:        d8eb465
 Built:             Wed Sep  3 20:57:38 2025
 OS/Arch:           linux/amd64
 Context:           default
Server: Docker Engine - Community
 Engine:
  Version:          28.4.0
  API version:      1.51 (minimum version 1.24)
  Go version:       go1.24.7
  Git commit:       249d679
  Built:            Wed Sep  3 20:57:38 2025
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.27
  GitCommit:        05044ec0a9a75232cad458027ca83437aae3f4da
 runc:
  Version:          1.2.5
  GitCommit:        v1.2.5-0-g59923ef
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
 rootlesskit:
  Version:          2.3.4
  ApiVersion:       1.1.1
  NetworkDriver:    slirp4netns
  PortDriver:       builtin
  StateDir:         /run/user/1001/dockerd-rootless
 slirp4netns:
  Version:          1.2.1
  GitCommit:        09e31e92fa3d2a1d3ca261adaeb012c8d75a8194
+ systemctl --user enable docker.service
Created symlink '/home/ostechnix/.config/systemd/user/default.target.wants/docker.service' \u2192 '/home/ostechnix/.config/systemd/user/docker.service'.
[INFO] Installed docker.service successfully.
[INFO] To control docker.service, run: `systemctl --user (start|stop|restart) docker.service`
[INFO] To run docker.service on system startup, run: `sudo loginctl enable-linger ostechnix`
[INFO] Creating CLI context "rootless"
Successfully created context "rootless"
[INFO] Using CLI context "rootless"
Current context is now "rootless"
[INFO] Make sure the following environment variable(s) are set (or add them to ~/.bashrc):
export PATH=/usr/bin:$PATH
[INFO] Some applications may require the following environment variable too:
export DOCKER_HOST=unix:///run/user/1001/docker.sock

Schritt 5: Aktualisieren Sie Ihre Umgebung

Nachdem die Installation abgeschlossen ist, zeigt das Skript Ihnen ein paar Zeilen, die Sie zu der Startdatei Ihrer Shell hinzufügen sollen, wie ~/.bashrc.

Diese Zeilen setzen die Umgebungsvariablen PATH und DOCKER_HOST, damit Ihr Terminal den neuen rootless Docker-Daemon finden und mit ihm kommunizieren kann.

In meinem Fall habe ich die folgenden Umgebungsvariablen hinzugefügt:

echo 'export PATH=/usr/bin:$PATH' >> ~/.bashrc
echo 'export DOCKER_HOST=unix:///run/user/1001/docker.sock' >> ~/.bashrc

Nachdem Sie sie zu Ihrer ~/.bashrc-Datei hinzugefügt haben, führen Sie den folgenden Befehl aus, um die Änderungen sofort anzuwenden:

source ~/.bashrc

Schritt 6: Starten und Verwalten Ihres neuen Rootless Docker

Herzlichen Glückwunsch, alles ist eingerichtet! Die Verwaltung Ihres rootlosen Dockers ist etwas anders.

Um den rootlosen Docker-Daemon zu starten und zu aktivieren, führen Sie Folgendes aus:

systemctl --user enable docker
systemctl --user start docker

Beachten Sie die --user-Flag.

Diese Befehle aktivieren und starten den Docker-Dienst für Ihren Benutzer.

Um Docker automatisch starten zu lassen, wenn Sie Ihren Computer hochfahren, müssen Sie "Lingering" für Ihren Benutzer aktivieren. Dies ermöglicht es Ihrem Benutzer, lang laufende Dienste auszuführen, auch wenn Sie nicht eingeloggt sind.

Lassen Sie das Verweilen zu, damit Docker nach dem Abmelden läuft:

sudo loginctl enable-linger $(whoami)

Dieser Befehl aktiviert das Verweilen.

Schritt 7: Überprüfung der Rootless-Docker-Installation

Um zu bestätigen, dass Docker im rootlosen Modus läuft:

docker info | grep -i rootless

Wenn du siehst:

rootless
[...]

…dann läuft Docker erfolgreich ohne Root-Rechte.

Sie können es auch testen, indem Sie alle Docker-Befehle ohne sudo oder root ausführen:

docker run hello-world

Einschränkungen von Rootless Docker

Der Rootless-Modus ist fantastisch, aber er bringt einige bekannte Einschränkungen mit sich.

  • Netzwerken ist anders: Die IP-Adresse eines Containers ist vom Host aus nicht erreichbar. Sie sollten immer Port-Mapping verwenden (z. B. docker run -p 8080:80), um auf Dienste zuzugreifen, die in einem Container laufen. Außerdem sind Funktionen wie --net=host namespaced, was bedeutet, dass sie das tatsächliche Netzwerk des Hosts nicht direkt verwenden.
  • Privilegierte Ports: Sie können standardmäßig keine Ports unter 1024 (wie Port 80) zuordnen. Sie können entweder einen höheren Port (wie 8080) verwenden oder die Systemeinstellungen ändern, um dies zu ermöglichen.
  • Ressourcenbegrenzungen: Das Begrenzen von Container-Ressourcen wie CPU oder Speicher erfordert, dass Ihr System cgroup v2 verwendet. Andernfalls werden diese Flags ignoriert.

Fehlerbehebung

Hier sind einige gängige Schritte zur Fehlerbehebung, auf die Sie stoßen könnten, wenn Sie zu rootlosem Docker migrieren oder es verwenden.

Installations- und Startprobleme

Mehrere Probleme können während der anfänglichen Einrichtung und beim Start des rootlosen Docker-Daemons auftreten.

systemd nicht erkannt oder Verbindung zum Bus fehlgeschlagen:

Diese Fehler treten häufig auf, wenn Sie zu einem Nicht-Root-Benutzer wechseln mit einem Befehl wie sudo su oder sudo -iu testuser.

Der richtige Weg, sich anzumelden, besteht darin, eine Methode zu verwenden, die pam_systemd unterstützt und die notwendige Umgebung korrekt einrichtet.

Der empfohlene Befehl ist:

sudo machinectl shell <your-username>@

Daemon startet nicht automatisch:

Um den rootlosen Docker-Dienst beim Booten zu starten, müssen Sie das "Lingern" für Ihr Benutzerkonto aktivieren. Dies ermöglicht es Ihrem Benutzer, lang laufende Dienste auszuführen, auch wenn Sie nicht angemeldet sind.

Sie können dies mit dem Befehl tun:

sudo logctl enable-linger $(whoami)

Fehler im Zusammenhang mit Benutzernamenbereichen:

  • Operation nicht erlaubt: Wenn Sie diesen Fehler sehen, liegt dies wahrscheinlich daran, dass Ihr System nicht so konfiguriert ist, dass unprivilegierte Benutzer Benutzer-Namespaces erstellen dürfen. Sie können dies beheben, indem Sie kernel.unprivileged_userns_clone=1 in Ihrer /etc/sysctl.conf-Datei setzen und dann sudo sysctl --system ausführen.
  • kein Speicherplatz auf dem Gerät: Diese Meldung kann erscheinen, wenn die maximale Anzahl von Benutzernamespace zu niedrig ist. Um dies zu beheben, können Sie user.max_user_namespaces=28633 in /etc/sysctl.conf einstellen und die Änderung mit sudo sysctl --system anwenden.
  • Keine Subuid-Bereiche für Benutzer gefunden: Dieser Fehler bedeutet, dass Sie für Ihren Benutzer keine untergeordneten UIDs und GIDs in den Dateien /etc/subuid und /etc/subgid konfiguriert haben. Der rootlose Modus erfordert, dass für den Benutzer mindestens 65.536 UIDs/GIDs zugewiesen werden.
  • konnte XDG_RUNTIME_DIR nicht erhalten: Die $XDG_RUNTIME_DIR Umgebungsvariable ist wesentlich und wird normalerweise automatisch gesetzt, wenn Sie sich korrekt über pam_systemd anmelden. Wenn sie nicht gesetzt ist, kann das Probleme verursachen.

Fehler beim Herunterladen von Images (docker pull)

Beim Abrufen von Bildern können Probleme im Zusammenhang mit Dateibesitz und Berechtigungen innerhalb der Container-Schichten auftreten.

  • lchown <FILE>: ungültiges Argument: Dies bedeutet typischerweise, dass die Anzahl der untergeordneten UIDs/GIDs in Ihren /etc/subuid und /etc/subgid Dateien für das Image, das Sie zu ziehen versuchen, nicht ausreicht. Obwohl die Anforderungen variieren, sind 65.536 IDs für die meisten Images ausreichend.
  • lchown <DATEI>: Vorgang nicht erlaubt: Dieser Fehler tritt häufig auf, wenn Ihr Docker-Datenverzeichnis (~/.local/share/docker) auf einem NFS-Mount liegt. Sie können dies umgehen, indem Sie das data-root in Ihrer Docker-Konfiguration auf ein Verzeichnis ändern, das sich nicht auf einem NFS-Dateisystem befindet.

Container läuft (docker run) Fehler

Sobald der Daemon läuft, können Probleme auftreten, wenn Sie versuchen, einen Container auszuführen.

  • OCI-Laufzeit konnte nicht erstellt werden/Verbindung vom Peer zurückgesetzt: Auf einem System, das cgroup v2 verwendet, kann dieser Fehler auftreten, wenn der D-Bus-Daemon für Ihre Benutzersitzung nicht aktiv ist. Um dies zu beheben, müssen Sie möglicherweise das Paket dbus-user-session installieren und sich dann ab- und wieder anmelden.
  • Ressourcenlimits werden ignoriert: Flags wie --cpus, --memory und --pids-limit funktionieren nur, wenn Ihr System mit cgroup v2 und systemd läuft. Wenn docker info den Cgroup Driver als none anzeigt, werden diese Flags ignoriert.
  • Fehler nach der Migration: Ein Benutzer bemerkte, dass er nach der Migration in seinen Containern auf Fehler stieß. Die Lösung bestand darin, alle Container zu stoppen und zu entfernen, die zuvor unter der alten, rootbasierten Docker-Installation gestartet wurden.

Netzwerkprobleme

Die Netzwerkverwaltung im rootlosen Modus wird anders gehandhabt, was zu einigen häufigen Verwirrungspunkten führen kann.

  • Privilegierte Ports können nicht freigegeben werden: Standardmäßig können Sie einen Container-Port nicht auf einen Host-Port unter 1024 abbilden. Zum Beispiel wird docker run -p 80:80 fehlschlagen. Die einfachste Lösung ist, einen höheren Port zu verwenden, wie 8080. Alternativ können Sie die Systemeinstellungen ändern, um dies zu erlauben.
  • ping-Befehl funktioniert nicht: Auf einigen Systemen kann ping innerhalb eines Containers fehlschlagen. Dies kann normalerweise behoben werden, indem net.ipv4.ping_group_range=0 2147483647 zu Ihrer /etc/sysctl.conf-Datei hinzugefügt wird.
  • Die Container-IP-Adresse ist vom Host aus nicht erreichbar: Dies ist erwartetes Verhalten. Die in docker inspect angezeigte IP-Adresse existiert innerhalb eines separaten Netzwerk-Namespaces und kann nicht direkt vom Host aus erreicht werden. Sie sollten immer Portweiterleitungen verwenden, wie z. B. docker run -p <host-port>:<container-port>, um auf Dienste innerhalb des Containers zuzugreifen. Dasselbe gilt für --net=host, das ebenfalls einem Namespace unterliegt.
  • Langsame Netzwerkleistung: Standardmäßig verwendet Rootless Docker Netzwerk-Treiber, die langsam sein können. Die Installation von slirp4netns (Version 0.4.0 oder höher) kann den Netzwerkdurchsatz verbessern.

Deinstallieren Sie Rootless Docker und wechseln Sie zurück zu Rootful Docker

Wenn Sie rootless Docker nicht mehr benötigen oder zurück zu rootful Docker wechseln möchten, entfernen Sie einfach rootless Docker mit dem Befehl:

dockerd-rootless-setuptool.sh uninstall

Dieser Befehl wird den vom Benutzer aktivierten Docker-Dienst stoppen und zum Standard-Kontext wechseln.

+ systemctl --user stop docker.service
+ systemctl --user disable docker.service
Removed '/home/ostechnix/.config/systemd/user/default.target.wants/docker.service'.
[INFO] Uninstalled docker.service
[INFO] Deleted CLI context "rootless"
Current context is now "default"
[INFO] Configured CLI to use the "default" context.On Debian and Ubuntu:
[INFO] 
[INFO] Make sure to unset or update the environment PATH, DOCKER_HOST, and DOCKER_CONTEXT environment variables if you have added them to `~/.bashrc`.
[INFO] This uninstallation tool does NOT remove Docker binaries and data.
[INFO] To remove data, run: `/usr/bin/rootlesskit rm -rf /home/ostechnix/.local/share/docker`

Setzen Sie die Umgebungsvariablen PATH, DOCKER_HOST und DOCKER_CONTEXT zurück, falls Sie sie zu ~/.bashrc hinzugefügt haben. Entfernen Sie dazu einfach die Zeilen, die Sie im vorherigen Schritt 5 hinzugefügt haben.

Entfernen Sie die Daten mit dem Befehl:

/usr/bin/rootlesskit rm -rf /home/ostechnix/.local/share/docker

Bitte beachten Sie, dass wir nur die rootlose Docker-Installation entfernt haben. Die Docker-Binaries existieren weiterhin in unserem System.

Aktivieren Sie schließlich den Docker-Dienst beim Systemstart mit den Befehlen:

sudo systemctl enable docker
sudo systemctl start docker

Überprüfen Sie den Service-Status:

sudo systemctl status docker

Wir sind jetzt wieder im Rootful-Docker-Modus.

Häufig gestellte Fragen (FAQ)

F: Ist rootloses Docker langsamer als rootvolles Docker?

A: Ja, rootloses Docker kann etwas langsamer sein, da es User-Mode-Netzwerke verwendet, aber der Sicherheitskompromiss lohnt sich oft.

F: Kann ich Docker Compose mit rootlosem Docker ausführen?

A: Ja. Docker Compose V2 funktioniert nahtlos: docker compose up -d

F: Ich kann keine Verbindung zum Docker-Daemon herstellen. Was soll ich tun?

A: Stellen Sie sicher, dass Ihre Umgebungsvariable gesetzt ist: export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock

Fügen Sie sie dauerhaft zu Ihrer ~/.bashrc hinzu.

F: Mein Netzwerk ist sehr langsam und ich kann nicht auf das Internet zugreifen

A: Rootless Docker verwendet slirp4netns für das Netzwerk. Wenn Container keinen Internetzugang haben oder es langsame Netzwerkprobleme gibt: sudo apt install -y slirp4netns

F: Unterstützt rootloses Docker alle Container-Images?

A: Ja, aber einige Container, die privilegierten Zugriff oder bestimmte Kernel-Module benötigen, funktionieren möglicherweise nicht.

Fazit

Die Umstellung auf Rootless-Docker ist einer der besten Schritte, die Sie für eine sicherere Container-Umgebung unternehmen können. Indem Sie Docker als Nicht-Root-Benutzer ausführen, verringern Sie die Angriffsfläche Ihres Systems erheblich und schützen es vor potenziellen Container-Ausbrüchen.

Obwohl es einige Einschränkungen zu beachten gibt, machen die enormen Sicherheitsvorteile die Änderung für nahezu jeden lohnenswert.

Jetzt können Sie die Leistung von Docker mit größerer Ruhe genießen.

Viel Spaß beim Containerisieren (und bleiben Sie sicher)!