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 ohnesudoausfü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
uidmapinstallieren (das Werkzeuge namensnewuidmapundnewgidmapenthält) unddbus-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/subuidund/etc/subgideinrichten. 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.socketsudo rm /var/run/docker.sockDies 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-extrasDieser 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 installDas 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.sockSchritt 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' >> ~/.bashrcNachdem Sie sie zu Ihrer ~/.bashrc-Datei hinzugefügt haben, führen Sie den folgenden Befehl aus, um die Änderungen sofort anzuwenden:
source ~/.bashrcSchritt 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 dockerBeachten 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 rootlessWenn 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-worldEinschrä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=hostnamespaced, 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 Siekernel.unprivileged_userns_clone=1in Ihrer/etc/sysctl.conf-Datei setzen und dannsudo sysctl --systemausfü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 Sieuser.max_user_namespaces=28633in/etc/sysctl.confeinstellen und die Änderung mitsudo sysctl --systemanwenden.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/subuidund/etc/subgidkonfiguriert 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_DIRUmgebungsvariable ist wesentlich und wird normalerweise automatisch gesetzt, wenn Sie sich korrekt überpam_systemdanmelden. 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/subuidund/etc/subgidDateien 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 dasdata-rootin 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 Paketdbus-user-sessioninstallieren und sich dann ab- und wieder anmelden.- Ressourcenlimits werden ignoriert: Flags wie
--cpus,--memoryund--pids-limitfunktionieren nur, wenn Ihr System mit cgroup v2 und systemd läuft. Wenndocker infodenCgroup Driveralsnoneanzeigt, 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:80fehlschlagen. Die einfachste Lösung ist, einen höheren Port zu verwenden, wie8080. Alternativ können Sie die Systemeinstellungen ändern, um dies zu erlauben. ping-Befehl funktioniert nicht: Auf einigen Systemen kannpinginnerhalb eines Containers fehlschlagen. Dies kann normalerweise behoben werden, indemnet.ipv4.ping_group_range=0 2147483647zu 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 inspectangezeigte 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 uninstallDieser 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/dockerBitte 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 dockersudo systemctl start dockerÜberprüfen Sie den Service-Status:
sudo systemctl status dockerWir 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)!