Comment migrer vers Docker sans privilèges sur Debian et Ubuntu Linux
Docker est un outil fantastique qui vous permet d’exécuter des applications dans des boîtes propres et isolées appelées conteneurs. Cela rend le développement et la livraison de logiciels beaucoup plus rapides et plus cohérents. Mais il y a un petit inconvénient que vous devriez connaître. Par défaut, Docker fonctionne souvent avec les privilèges « root », le niveau d’accès le plus élevé sur un système Linux. Cela peut représenter un risque de sécurité. Heureusement, il existe une manière beaucoup plus sûre : Docker sans root.
Ce guide vous expliquera tout ce que vous devez savoir sur la migration Docker sans root. Nous expliquerons pourquoi vous devriez passer à cette solution et vous montrerons exactement comment migrer une configuration Docker avec root vers Docker sans root étape par étape. Rendons vos conteneurs plus sécurisés !
Qu'est-ce que Docker sans racine ?
Le mode sans root dans Docker est exactement ce que cela signifie : il vous permet d'exécuter le démon Docker et vos conteneurs en tant qu'utilisateur régulier, non root. C'est un énorme avantage pour la sécurité.
Voici pourquoi Docker sans privilèges est utile :
- Il Prévient les Problèmes de Sécurité : Exécuter en tant qu'utilisateur non-root aide à vous protéger contre les vulnérabilités potentielles de Docker ou du runtime du conteneur. Si un problème de sécurité survient à l'intérieur d'un conteneur, il ne peut pas facilement s'échapper et affecter l'ensemble de votre système hôte car il n'a pas d'accès root.
- Vous n'avez pas besoin de 'sudo' : Vous pouvez installer et gérer Docker sans avoir besoin de privilèges root. C'est parfait pour les environnements où vous n'avez pas ou ne souhaitez pas utiliser l'accès administrateur.
La magie du mode sans racine repose sur une fonctionnalité de Linux appelée espaces de noms utilisateur. Considérez cela comme donner à votre utilisateur une bulle spéciale où il peut jouer. À l'intérieur de cette bulle, votre utilisateur peut agir comme un administrateur, mais il ne peut rien affecter en dehors de celle-ci.
Ceci est différent des autres méthodes où le démon Docker lui-même fonctionne toujours en tant que root. Avec le mode sans root, à la fois le démon et le conteneur s'exécutent en toute sécurité sans privilèges root.
Docker sans privilèges root vs. Docker avec utilisateur non-root
Veuillez noter que l'exécution de Docker en tant qu'utilisateur non root et l'exécution de Docker en mode sans root sont différentes.
Docker sans racine (vraiment sans racine)
- Le démon Docker lui-même s'exécute en tant qu'utilisateur non root
- Aucun groupe
dockern'est nécessaire - Utilise des espaces de noms utilisateur pour mapper la racine du conteneur à un utilisateur non privilégié de l'hôte
- Stockage dans le répertoire personnel de l'utilisateur (
~/.local/share/docker/) - Plus sûr mais avec des limitations (pas d'opérations privilégiées, certaines restrictions réseau)
Docker avec un utilisateur non root (Traditionnel)
- Le démon Docker fonctionne toujours en tant que root (processus
dockerd) - Les utilisateurs réguliers sont ajoutés au groupe
docker - Les utilisateurs peuvent exécuter des commandes
dockersanssudo - Les conteneurs ont toujours des privilèges root sur le système hôte
- Utilise des emplacements standards comme
/var/lib/docker/ - Problème de sécurité : Faire partie du groupe
dockeréquivaut à avoir un accès root
J'espère que vous comprenez la différence entre ces deux.
Se préparer pour la configuration Docker sans racine
Avant de commencer, vous avez juste besoin de quelques éléments. Le processus est fluide si vous avez ces prérequis prêts.
- Un système Linux : Ubuntu est fortement recommandé par l'équipe Docker, car son noyau offre un excellent support pour le pilote de stockage
overlay2, dont le mode rootless a besoin. Cependant, Docker fonctionne parfaitement sur n'importe quelle distribution Linux. J'ai testé cette configuration sur Debian 13 et Ubuntu 24.04 LTS, cela fonctionne immédiatement. - Quelques paquets clés : Vous devrez installer
uidmap(qui contient des outils appelésnewuidmapetnewgidmap) etdbus-user-session. - Plages d'identifiants utilisateur : Votre système doit fournir à votre utilisateur un bloc d'identifiants utilisateur (UID) et d'identifiants de groupe (GID) à utiliser pour ses conteneurs. Vous devrez configurer cela dans les fichiers
/etc/subuidet/etc/subgid. Un bloc de 65 536 est généralement suffisant pour la plupart des besoins. - Sauvegardez les données importantes : Assurez-vous d'avoir sauvegardé toutes les données importantes que vous ne pouvez pas vous permettre de perdre.
Guide étape par étape pour migrer Docker avec root vers Docker sans root
Je suppose que vous avez déjà Docker installé et en fonctionnement en mode root sur votre système Linux. Sinon, suivez les liens donnés pour configurer Docker sur votre système préféré.
- Installer Docker et Docker Compose sur Debian
- Installer Docker et Docker Compose sur Ubuntu
Étape 1 : Arrêtez et désactivez votre ancienne configuration Docker avec accès root
D'abord et avant tout, si vous avez le Docker standard, système-wide en fonctionnement (c'est-à-dire Docker avec droits root), vous devez l'arrêter et le désactiver. Cela évite tout conflit.
Exécutez ces commandes dans votre terminal :
sudo systemctl disable --now docker.service docker.socketsudo rm /var/run/docker.sockCela arrête Docker et supprime son ancien fichier de socket.
Étape 2 : Installer les outils nécessaires
Ensuite, installons les packages que nous avons mentionnés plus tôt.
sudo apt install -y uidmap dbus-user-session systemd-container docker-ce-rootless-extrasCette seule commande vous procure uidmap pour la cartographie des utilisateurs, dbus-user-session pour gérer votre session, et docker-ce-rootless-extras, qui inclut un outil de configuration utile.
Étape 3 : Connectez-vous de la bonne manière (Ceci est important ! )
Maintenant, vous devez vous connecter en tant qu'utilisateur qui exécutera Docker sans privilèges root. Vous pouvez créer un nouvel utilisateur ou utiliser celui que vous avez déjà.
Plus important encore, vous devez vous connecter en utilisant une méthode qui prend en charge pam_systemd. N'utilisez pas sudo su. L'utilisation de la bonne méthode configure automatiquement une variable d'environnement importante appelée $XDG_RUNTIME_DIR. La façon la plus simple est avec la commande machinectl, que vous avez installée à l'étape précédente.
sudo machinectl shell $(whoami)@Cela vous connecte à un nouveau shell en tant qu'utilisateur actuel, de la manière correcte.
Si vous souhaitez vous connecter en tant qu'utilisateur différent (par exemple senthil), mentionnez-le simplement comme indiqué ci-dessous :
sudo machinectl shell senthil@Si vous voyez la sortie suivante après avoir exécuté la commande ci-dessus, vous êtes prêt à partir :
Connected to the local host. Press ^] three times within 1s to exit session.Étape 4 : Installer Docker sans privilèges
Vous êtes maintenant connecté en tant qu'utilisateur et prêt à installer. Exécutez le script d'installation de Docker sans privilèges :
dockerd-rootless-setuptool.sh installLe script configurera un service systemd pour Docker qui s'exécute sous votre compte utilisateur.
Après une migration réussie de Docker sans racine, vous obtiendrez une sortie comme ci-dessous :
[...]
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Étape 5 : Mettez à jour votre environnement
Après la fin de l'installation, le script vous affichera quelques lignes à ajouter au fichier de démarrage de votre shell, comme ~/.bashrc.
Ces lignes définissent les variables d'environnement PATH et DOCKER_HOST afin que votre terminal puisse trouver et communiquer avec le nouveau démon Docker sans privilèges root.
Dans mon cas, j'ai ajouté les variables d'environnement suivantes :
echo 'export PATH=/usr/bin:$PATH' >> ~/.bashrc
echo 'export DOCKER_HOST=unix:///run/user/1001/docker.sock' >> ~/.bashrcAprès les avoir ajoutés à votre fichier ~/.bashrc, exécutez ensuite la commande suivante pour appliquer les modifications immédiatement :
source ~/.bashrcÉtape 6 : Démarrer et gérer votre nouveau Docker sans racine
Félicitations, tout est prêt ! La gestion de votre Docker sans privilèges est légèrement différente.
Pour démarrer et activer le démon Docker sans privilèges root, exécutez :
systemctl --user enable docker
systemctl --user start dockerRemarquez l'option --user.
Ces commandes activent et démarrent le service Docker pour votre utilisateur.
Pour que Docker démarre automatiquement lorsque vous démarrez votre machine, vous devez activer le « lingering » pour votre utilisateur. Cela permet à votre utilisateur d'exécuter des services de longue durée même lorsque vous n'êtes pas connecté.
Activez la persistance pour que Docker fonctionne après la déconnexion :
sudo loginctl enable-linger $(whoami)Cette commande active la persistance.
Étape 7 : Vérifier l'installation de Docker sans root
Pour confirmer que Docker fonctionne en mode sans root :
docker info | grep -i rootlessSi vous voyez :
rootless
[...]…alors Docker fonctionne avec succès sans privilèges root.
Vous pouvez également le tester en exécutant toutes les commandes Docker sans sudo ni root :
docker run hello-worldLimitations de Docker sans root
Le mode sans racine est fantastique, mais il présente quelques limitations connues.
- La mise en réseau est différente : L'adresse IP d'un conteneur n'est pas accessible depuis l'hôte. Vous devriez toujours utiliser le mappage de ports (par exemple,
docker run -p 8080:80) pour accéder aux services s'exécutant dans un conteneur. De plus, des fonctionnalités comme--net=hostsont isolées par des espaces de noms, ce qui signifie qu'elles n'utiliseront pas directement le réseau réel de l'hôte. - Ports privilégiés : Vous ne pouvez pas mapper vers des ports inférieurs à 1024 (comme le port 80) par défaut. Vous pouvez soit utiliser un port plus élevé (comme 8080) soit modifier les paramètres système pour le permettre.
- Limites des ressources : Limiter les ressources du conteneur comme le CPU ou la mémoire nécessite que votre système utilise cgroup v2. Sinon, ces options seront ignorées.
Dépannage
Voici quelques étapes courantes de dépannage que vous pourriez rencontrer lors de la migration vers Docker sans privilèges ou de son utilisation.
Problèmes d'installation et de démarrage
Plusieurs problèmes peuvent survenir lors de la configuration initiale et au démarrage du démon Docker sans privilèges root.
systemd non détecté ou Échec de la connexion au bus:
Ces erreurs se produisent souvent si vous passez à un utilisateur non root avec une commande comme sudo su ou sudo -iu testuser.
La manière correcte de se connecter est d'utiliser une méthode qui prend en charge pam_systemd, ce qui configure correctement l'environnement nécessaire.
La commande recommandée est :
sudo machinectl shell <your-username>@Le démon ne démarre pas automatiquement:
Pour que le service Docker sans racine démarre au démarrage, vous devez activer le « lingering » pour votre compte utilisateur. Cela permet à votre utilisateur d'exécuter des services de longue durée même lorsque vous n'êtes pas connecté.
Vous pouvez faire cela avec la commande :
sudo logctl enable-linger $(whoami)Erreurs liées aux espaces de noms utilisateur:
opération non autorisée: Si vous voyez cette erreur, c’est probablement parce que votre système n’est pas configuré pour permettre aux utilisateurs non privilégiés de créer des espaces de noms utilisateur. Vous pouvez corriger cela en définissantkernel.unprivileged_userns_clone=1dans votre fichier/etc/sysctl.confpuis en exécutantsudo sysctl --system.pas d'espace disponible sur le périphérique: Ce message peut apparaître si le nombre maximum de namespaces utilisateur est trop faible. Pour le résoudre, vous pouvez définiruser.max_user_namespaces=28633dans/etc/sysctl.confet appliquer le changement avecsudo sysctl --system.Aucune plage subuid trouvée pour l'utilisateur: Cette erreur signifie que vous n'avez pas configuré les UID et GID subordonnés pour votre utilisateur dans les fichiers/etc/subuidet/etc/subgid. Le mode rootless nécessite qu'au moins 65 536 UID/GID soient alloués pour l'utilisateur.impossible d'obtenir XDG_RUNTIME_DIR: La variable d'environnement$XDG_RUNTIME_DIRest essentielle et est normalement définie automatiquement lorsque vous vous connectez correctement viapam_systemd. Si elle n'est pas définie, cela peut causer des problèmes.
Erreurs de téléchargement d'image (docker pull)
Lorsque vous tirez des images, vous pouvez rencontrer des problèmes liés à la propriété des fichiers et aux permissions au sein des couches du conteneur.
lchown <FILE> : argument invalide: Cela signifie généralement que le nombre d'UID/GID secondaires disponibles dans vos fichiers/etc/subuidet/etc/subgidest insuffisant pour l'image que vous essayez de récupérer. Bien que les besoins varient, disposer de 65 536 IDs est suffisant pour la plupart des images.lchown <FILE> : opération non autorisée: Cette erreur se produit souvent si votre répertoire de données Docker (~/.local/share/docker) se trouve sur un montage NFS. Vous pouvez contourner ce problème en modifiant ledata-rootdans votre configuration Docker vers un répertoire qui ne se trouve pas sur un système de fichiers NFS.
Erreurs lors de l'exécution du conteneur (docker run)
Une fois que le démon est en cours d'exécution, vous pouvez rencontrer des problèmes lorsque vous essayez de lancer un conteneur.
Échec de création du runtime OCI/connexion réinitialisée par le pair: Sur un système utilisant cgroup v2, cette erreur peut se produire si le démon D-Bus n'est pas actif pour votre session utilisateur. Pour corriger cela, vous devrez peut-être installer le paquetdbus-user-sessionpuis vous déconnecter et vous reconnecter.- Les limites de ressources sont ignorées : Les options comme
--cpus,--memoryet--pids-limitne fonctionnent que si votre système utilise cgroup v2 et systemd. Sidocker infoafficheCgroup Drivercommenone, ces options seront ignorées. - Bugs après la migration : Un utilisateur a signalé qu'il avait rencontré des bugs dans ses conteneurs après la migration. La solution a été d'arrêter et de supprimer tous les conteneurs qui avaient été démarrés précédemment sous l'ancienne installation Docker avec privilèges root.
Problèmes de réseau
La mise en réseau en mode sans racine est gérée différemment, ce qui peut entraîner certains points de confusion courants.
- Impossible d'exposer des ports privilégiés : Vous ne pouvez pas mapper un port de conteneur sur un port hôte inférieur à 1024 par défaut. Par exemple,
docker run -p 80:80échouera. La solution la plus simple est d'utiliser un port plus élevé, comme8080. Alternativement, vous pouvez changer les paramètres du système pour le permettre. - La commande
pingne fonctionne pas : Sur certains systèmes,pingdepuis l'intérieur d'un conteneur peut échouer. Cela peut généralement être corrigé en ajoutantnet.ipv4.ping_group_range=0 2147483647à votre fichier/etc/sysctl.conf. - L'adresse IP du conteneur est inaccessible depuis l'hôte : Ceci est un comportement attendu. L'adresse IP affichée dans
docker inspectexiste à l'intérieur d'un espace de nom réseau séparé et ne peut pas être atteinte directement depuis l'hôte. Vous devez toujours utiliser le mappage de ports, commedocker run -p <port-hôte>:<port-conteneur>, pour accéder aux services à l'intérieur du conteneur. Il en va de même pour--net=host, qui est également isolé par espace de nom. - Performances réseau lentes : Par défaut, Docker sans root utilise des pilotes réseau qui peuvent être lents. L'installation de
slirp4netns(version 0.4.0 ou ultérieure) peut améliorer le débit réseau.
Désinstaller Docker sans root et revenir à Docker avec root
Si vous n'avez plus besoin de Docker sans root ou si vous voulez revenir à Docker avec root, il suffit de supprimer Docker sans root en utilisant la commande :
dockerd-rootless-setuptool.sh uninstallCette commande arrêtera le service Docker activé par l'utilisateur et passera au contexte par défaut.
+ 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`Désactivez les variables d'environnement PATH, DOCKER_HOST et DOCKER_CONTEXT si vous les avez ajoutées à ~/.bashrc. Pour ce faire, supprimez simplement les lignes que vous avez ajoutées à l'étape 5 précédente.
Supprimez les données en utilisant la commande :
/usr/bin/rootlesskit rm -rf /home/ostechnix/.local/share/dockerVeuillez noter que nous avons seulement supprimé l'installation Docker sans racine. Les binaires Docker existent toujours dans notre système.
Enfin, activez le service docker au démarrage du système en utilisant les commandes :
sudo systemctl enable dockersudo systemctl start dockerVérifiez l'état du service :
sudo systemctl status dockerNous sommes maintenant de retour en mode Docker avec privilèges.
Questions Fréquemment Posées (FAQ)
Q : Docker sans privilèges est-il plus lent que Docker avec privilèges ?
A : Oui, Docker sans privilèges peut être légèrement plus lent car il utilise le réseau en mode utilisateur, mais le compromis en matière de sécurité en vaut souvent la peine.
Q : Puis-je exécuter Docker Compose avec Docker sans privilèges ?
A : Oui. Docker Compose V2 fonctionne parfaitement : docker compose up -d
Q : Je ne peux pas me connecter au daemon Docker. Que devrais-je faire ?
A : Assurez-vous que votre variable d'environnement est définie : export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock
Ajoutez-la de manière permanente à votre ~/.bashrc.
Q : Mon réseau est très lent et je n'arrive pas à accéder à Internet
A : Docker sans racine utilise slirp4netns pour le réseau. Si les conteneurs n’arrivent pas à accéder à Internet ou ont des problèmes de réseau lent : sudo apt install -y slirp4netns
Q : Docker rootless prend-il en charge toutes les images de conteneurs ?
A : Oui, mais certains conteneurs qui nécessitent un accès privilégié ou des modules noyau spécifiques peuvent ne pas fonctionner.
Conclusion
Migrer vers Docker sans privilèges root est l'une des meilleures décisions que vous puissiez prendre pour un environnement de conteneurs plus sûr. En exécutant Docker en tant qu'utilisateur non root, vous réduisez considérablement la surface d'attaque de votre système et le protégez contre d'éventuelles échappées de conteneurs.
Bien qu'il y ait quelques limitations à prendre en compte, les énormes avantages en matière de sécurité en font un changement utile pour presque tout le monde.
Vous pouvez maintenant profiter de la puissance de Docker en toute tranquillité d'esprit.
Bon conteneurisation (et en toute sécurité) !