Recherche de site Web

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 docker n'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 docker sans sudo
  • 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és newuidmap et newgidmap) et dbus-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/subuid et /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.socket
sudo rm /var/run/docker.sock

Cela 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-extras

Cette 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 install

Le 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' >> ~/.bashrc

Aprè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 docker

Remarquez 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 rootless

Si 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-world

Limitations 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=host sont 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éfinissant kernel.unprivileged_userns_clone=1 dans votre fichier /etc/sysctl.conf puis en exécutant sudo 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éfinir user.max_user_namespaces=28633 dans /etc/sysctl.conf et appliquer le changement avec sudo 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/subuid et /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_DIR est essentielle et est normalement définie automatiquement lorsque vous vous connectez correctement via pam_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/subuid et /etc/subgid est 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 le data-root dans 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 paquet dbus-user-session puis vous déconnecter et vous reconnecter.
  • Les limites de ressources sont ignorées : Les options comme --cpus, --memory et --pids-limit ne fonctionnent que si votre système utilise cgroup v2 et systemd. Si docker info affiche Cgroup Driver comme none, 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é, comme 8080. Alternativement, vous pouvez changer les paramètres du système pour le permettre.
  • La commande ping ne fonctionne pas : Sur certains systèmes, ping depuis l'intérieur d'un conteneur peut échouer. Cela peut généralement être corrigé en ajoutant net.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 inspect existe à 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, comme docker 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 uninstall

Cette 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/docker

Veuillez 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 docker
sudo systemctl start docker

Vérifiez l'état du service :

sudo systemctl status docker

Nous 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é) !