Comment puis-je utiliser docker sans sudo?

Sur les pages de documentation de Docker, tous les exemples de commandes sont affichés sans sudo, comme celui-ci:

docker ps

Sur Ubuntu, le binaire est appelé docker.io. Cela ne fonctionne pas non plus sans sudo:

sudo docker.io ps

Comment puis-je configurer Docker pour ne pas avoir besoin de préfixer chaque commande Docker avec sudo?

Bonne nouvelle: le nouveau docker (version 19.03 (actuellement expérimentale)) pourra fonctionner sans racine, annulant les problèmes pouvant survenir avec un utilisateur root. Plus besoin de jouer avec les autorisations élevées, la racine et tout ce qui pourrait ouvrir votre machine lorsque vous ne le vouliez pas.

Vidéo à ce sujet de [DockerCon 2019] Durcissement du démon Docker avec le mode sans racine

Quelques mises en garde concernant le mode Docker sans racine

Les ingénieurs de Docker affirment que le mode sans racine ne peut pas être considéré comme un remplacement pour la suite complète des fonctionnalités du moteur Docker. Certaines limitations au mode sans racine incluent:

  • contrôles de ressources de groupes de contrôle, profils de sécurité d'apparmor, point de contrôle / restauration, réseaux de superposition, etc. ne fonctionne pas en mode sans racine.
  • L'exposition des ports à partir de conteneurs nécessite actuellement un processus manuel d'assistance socat.
  • Seules les distributions basées sur Ubuntu prennent en charge les systèmes de fichiers superposés en mode sans racine.
  • Le mode sans racine n'est actuellement fourni que pour les versions nocturnes qui peuvent ne pas être aussi stables que vous en avez l'habitude.

Depuis docker 19.3, c'est obsolète (et plus dangereux que nécessaire):

Le manuel docker a ceci à dire à ce sujet:

Donner un accès non root

Le démon docker s'exécute toujours en tant qu'utilisateur root, et depuis la version 0.5.2 de Docker, le démon docker se lie à un socket Unix au lieu d'un port TCP. Par défaut, ce socket Unix appartient à l'utilisateur root, et donc, par défaut, vous pouvez y accéder avec sudo.

À partir de la version 0.5.3, si vous (ou votre installateur Docker) créez un groupe Unix appelé docker et y ajoutez des utilisateurs, le démon docker rendra la propriété du socket Unix lisible/inscriptible par le groupe docker au démarrage du démon. Le démon docker doit toujours s'exécuter en tant qu'utilisateur root, mais si vous exécutez le client docker en tant qu'utilisateur du groupe docker, vous n'avez pas besoin d'ajouter sudo à toutes les commandes client. À partir de la version 0.9.0, vous pouvez spécifier qu'un groupe autre que docker doit posséder le socket Unix avec l'option-G.

Avertissement: Le groupe docker (ou le groupe spécifié avec-G) est équivalent à root; voir Détails de la Surface d'attaque du Démon Docker et ce billet de blog sur Pourquoi nous ne laissons pas les utilisateurs non root exécuter Docker dans CentOS, Fedora ou RHEL (merci michael-n).

Dans la récente publication du mode expérimental sans racine sur GitHub, les ingénieurs mentionnent que le mode sans racine permet d'exécuter dockerd en tant qu'utilisateur non privilégié, en utilisant user_namespaces(7), mount_namespaces(7), network_namespaces(7).

Les utilisateurs doivent exécuter dockerd-rootless.sh au lieu de dockerd.

$ dockerd-rootless.sh --experimental

Comme le mode sans racine est expérimental, les utilisateurs doivent toujours exécuter dockerd-rootless.sh avec-expérimental.


Important à lire: étapes de post-installation pour Linux (il renvoie également à Détails de la Surface d'attaque du Démon Docker).

Gérer Docker en tant qu'utilisateur non root

Le démon docker se lie à un socket Unix au lieu d'un port TCP. Par défaut, ce socket Unix appartient à l'utilisateur root et les autres utilisateurs ne peuvent y accéder qu'en utilisant sudo. Le démon docker s'exécute toujours en tant qu'utilisateur root.

Si vous ne souhaitez pas utiliser sudo lorsque vous utilisez la commande docker, créez un groupe Unix appelé docker et ajoutez-y des utilisateurs. Lorsque le démon docker démarre, il rend la propriété du socket Unix lisible en lecture/écriture par le groupe docker.


  • Ajoutez le groupe docker s'il n'existe pas déjà:

     sudo groupadd docker
  • Ajoutez l'utilisateur connecté" USER USER & quot; au groupe docker. Modifiez le nom d'utilisateur pour qu'il corresponde à votre utilisateur préféré si vous ne souhaitez pas utiliser votre utilisateur actuel:

     sudo gpasswd -a $USER docker
  • Soit faire un newgrp docker ou déconnectez-vous/connectez-vous pour activer les modifications apportées aux groupes.

  • Vous pouvez utiliser

     docker run hello-world

    pour vérifier si vous pouvez exécuter docker sans sudo.

Pour exécuter la commande docker sans sudo, vous devez ajouter votre utilisateur (qui a les privilèges root) au groupe docker. Pour cela, exécutez la commande suivante:

 sudo usermod -aG docker $USER

Maintenant, demandez à l'utilisateur de se déconnecter puis de se reconnecter. Cette solution est bien expliquée ici avec un processus d'installation approprié.

Le mécanisme par lequel l'ajout d'un utilisateur au groupe docker l'autorisation d'exécuter docker est d'accéder au socket de docker à /var/run/docker.sock. Si le système de fichiers qui contient /var/run a été monté avec ACLs activé, cela peut également être réalisé via ACLs.

sudo setfacl -m user:$USER:rw /var/run/docker.sock

Je n'inclus cela que par souci d'exhaustivité.

En général, je recommande d'éviter les listes de contrôle d'accès chaque fois qu'une bonne alternative basée sur des groupes est disponible: Il est préférable que les privilèges d'un système puissent être compris en regardant uniquement les appartenances à des groupes. Devoir analyser le système de fichiers à la recherche d'entrées de liste de contrôle d'accès afin de comprendre les privilèges du système est un fardeau supplémentaire pour les audits de sécurité.

Avertissement 1: Cela a le même root équivalence en tant qu'addition $USER à la docker groupe. Vous pouvez toujours démarrer un conteneur d'une manière qui a root accès au système de fichiers hôte.

Avertissement 2: Les listes de contrôle d'accès sont nettement plus difficiles pour les audits de sécurité que la sécurité de groupe. Évitez probablement les listes de contrôle d'accès si possible lorsque vous pouvez utiliser des groupes à la place, au moins dans des environnements pertinents pour l'audit.

Après avoir créé le groupe docker et y avoir ajouté mon utilisateur avec

sudo groupadd dockersudo usermod -aG docker $USER

... Je devais encore donner le /var/run/docker.sock prise et /var/run/docker obtenez les autorisations appropriées pour le faire fonctionner:

sudo chown root:docker /var/run/docker.socksudo chown -R root:docker /var/run/docker

Déconnectez-vous et reconnectez-vous (avec cet utilisateur), vous pourrez alors exécuter les commandes docker sans sudo:

docker run hello-world

Les conteneurs Docker doivent être exécutés par un utilisateur root. Vous pouvez vous ajouter à la docker groupe (par exemple en courant sudo usermod -aG docker $USER), mais cela facilite la tâche de toute personne ayant accès au $USER compte pour obtenir un accès root à la machine (par exemple en montant un volume racine dans un conteneur privilégié).

Une manière plus soucieuse de la sécurité d'exécuter des conteneurs Docker en tant qu'utilisateur non root serait d'utiliser Podman: https://podman.io/. Depuis son site internet:

Podman est un moteur de conteneur sans démon pour le développement, la gestion et l'exécution de conteneurs OCI sur votre système Linux. Les conteneurs peuvent être exécutés en tant que root ou dans mode sans racine. Tout simplement: alias docker=podman.

Une autre alternative est la singularité, qui est plus couramment déployée dans les environnements HPC: https://sylabs.io/.

Que diriez-vous d’un alias:? De cette façon, vous utilisez toujours sudo, avec une protection par mot de passe. alias docker= " sudo docker "

N’oubliez pas d’activer l’ufw :wink:

Sur Ubuntu 14.04 il y a aussi binaire ‘docker’.

L’installation recommandée n’est pas le docker dans les dépôts ubuntu par défaut; à la place, des instructions ici ( Redirecting…), recommande d’utiliser le dépôt docker. Supprimez tous les éléments docker existants et vérifiez que vous obtenez celui de la bonne source: 'apt-cache policy docker-engine` (l’URL d’apt doit provenir de dockerproject.org)

Qu’est-ce que c’est pour exiger que root fasse des choses simples telles que “docker info”. Comme ‘docker info’ a besoin d’un accès brut à tous mes fichiers et périphériques et ports pour fonctionner.

@anatolytechtonik J’ai aussi utilisé ‘docker’ au lieu de ‘docker.io’ dans Ubuntu 14.04 LTS

Oui, jusqu’à ce que Docker implémente policykit ou quelque chose de similaire, je vous recommande fortement d’utiliser un alias, sinon vous pourriez aussi bien tout exécuter en tant que root.

sudo chmod 666 / var / run / docker.chaussette