L’erreur « permission denied while trying to connect to the Docker daemon socket » signifie que votre utilisateur n’a pas la permission d’accéder à /var/run/docker.sock. Ce guide vous montre comment corriger le problème et comprendre les implications en termes de sécurité.

Symptôme

L’exécution de n’importe quelle commande docker échoue avec :

docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied

Ou lors de la construction ou de l’exécution de conteneurs :

docker build -t myapp:latest .
Got permission denied...

docker run -it ubuntu bash
Got permission denied...

Pourquoi ça arrive

Classé par probabilité :

  1. L’utilisateur n’est pas dans le groupe docker — Par défaut, seul root et les utilisateurs du groupe docker peuvent accéder à la socket Docker.
  2. Le mode Docker rootless est actif — Le daemon Docker s’exécute en tant qu’utilisateur non-root, donc l’emplacement et la propriété de la socket sont différents.
  3. La propriété de la socket est incorrecte — /var/run/docker.sock est possédée par root ou un autre utilisateur, pas par votre utilisateur ou le groupe docker.
  4. Installation Docker via Snap — Le confinement de Snap pourrait empêcher l’accès à la socket.
  5. **WSL2 (Windows Subsystem for Linux) — Docker Desktop pour Windows utilise un chemin de socket différent ou une méthode d’intégration différente.
  6. La socket a été supprimée ou recréée — Après une mise à jour système ou un redémarrage de Docker, la socket pourrait avoir les mauvaises permissions.

Correction

1. L’utilisateur n’est pas dans le groupe docker

Ajoutez votre utilisateur au groupe docker :

sudo usermod -aG docker $USER

Les flags aG signifient « ajouter aux groupes » donc vous conservez vos groupes existants.

Appliquez le changement de groupe. Choisissez une option :

Option A : Recharger l’appartenance aux groupes (cette session seulement) :

newgrp docker

Option B : Se déconnecter et se reconnecter (permanent) :

logout
# Se reconnecter

Vérifiez que ça fonctionne :

docker ps
# Devrait retourner la liste des conteneurs sans « permission denied »

Vérifiez que vous êtes dans le groupe docker :

id -G
# Devrait inclure un numéro pour le groupe « docker » (généralement 999)

groups $USER
# Devrait montrer : user : user docker ...

2. Le mode Docker rootless est actif

Docker rootless exécute le daemon en tant qu’utilisateur non-root. Vérifiez s’il est activé :

docker run --rm -it alpine cat /proc/self/cgroup | grep docker
# Si rootless, le chemin inclut /user.slice/...

Ou vérifiez l’emplacement de la socket Docker :

# Standard : /var/run/docker.sock
# Rootless : ~/.docker/run/docker.sock

ls -la /var/run/docker.sock
ls -la ~/.docker/run/docker.sock

Si vous utilisez Docker rootless, votre utilisateur devrait déjà avoir accès puisque le daemon s’exécute en tant que votre utilisateur. Vérifiez :

docker ps

Si vous obtenez une erreur de permission différente, le daemon pourrait ne pas être en cours d’exécution. Démarrez-le :

# Pour Docker rootless
dockerd-rootless-setuptool.sh install

# Ou démarrez-le manuellement
start-rootless

Pour revenir à Docker standard (avec le groupe docker) :

# Désinstaller rootless
dockerd-rootless-setuptool.sh uninstall

# Installer Docker standard
# (Suivez le guide d'installation de votre distro)

3. La propriété de la socket est incorrecte

Vérifiez qui possède la socket docker :

ls -la /var/run/docker.sock
# Résultat : srw-rw---- 1 root docker 0 Oct 26 11:00 /var/run/docker.sock

Elle devrait être possédée par root:docker avec les permissions 660. Si ce n’est pas le cas :

# Corriger la propriété
sudo chown root:docker /var/run/docker.sock

# Corriger les permissions
sudo chmod 660 /var/run/docker.sock

Vérifiez :

ls -la /var/run/docker.sock
# Affiche maintenant : srw-rw---- 1 root docker ...

docker ps

Si la socket est supprimée (par exemple, après un crash système ou une mise à jour), redémarrez Docker :

sudo systemctl restart docker
ls -la /var/run/docker.sock    # Devrait réapparaître

4. Installation Docker via Snap

Le confinement de Snap peut empêcher l’accès à Docker. Vérifiez si Docker a été installé via Snap :

which docker
# Si ça affiche : /snap/bin/docker
# Alors c'est une installation Snap

Pour autoriser Snap à accéder à la socket Docker, utilisez l’interface docker :

snap connect docker:docker-daemon

Ou supprimez la version Snap et installez Docker officiellement :

snap remove docker

# Suivez l'installation officielle de Docker pour votre distro
# Par exemple, pour Ubuntu :
sudo apt-get install docker.io

# Puis ajoutez votre utilisateur au groupe docker
sudo usermod -aG docker $USER
newgrp docker

5. WSL2 (Windows Subsystem for Linux) — particularités

Sur Windows avec WSL2, Docker Desktop pour Windows utilise une intégration spéciale. Vérifiez quel Docker s’exécute :

docker version
# S'il se connecte à Docker Desktop, le contexte pourrait être « desktop-linux »

Vérifiez que Docker s’exécute :

docker ps
# Si la connexion échoue, Docker Desktop ne s'exécute pas sur Windows

Démarrez Docker Desktop (sur Windows) :
1. Ouvrez Docker Desktop depuis le menu Démarrer
2. Attendez qu’il s’initialise (généralement 30 secondes)
3. Retournez au terminal WSL2

Puis vérifiez :

docker ps

Si vous voulez utiliser Docker à l’intérieur de WSL2 (pas Docker Desktop pour Windows) :

# Installer Docker directement dans WSL2
sudo apt-get install docker.io

# Ajouter votre utilisateur au groupe docker
sudo usermod -aG docker $USER
newgrp docker

# Démarrer le daemon Docker
sudo systemctl start docker

6. La socket a été supprimée ou recréée

Si la socket a été supprimée (par exemple, /var/run est nettoyée sur certains systèmes), redémarrez Docker :

sudo systemctl restart docker
ls -la /var/run/docker.sock    # Devrait réapparaître avec les bonnes permissions

Assurez-vous que la socket persiste après les redémarrages. Vérifiez l’unité systemd de Docker :

systemctl status docker
# Devrait montrer qu'elle est activée et en cours d'exécution

Activez Docker au démarrage :

sudo systemctl enable docker

Éviter la récidive

  1. Ajouter les utilisateurs au groupe docker lors de la configuration :

    sudo usermod -aG docker myuser
    

  2. Rendre les permissions de socket persistantes. Elles sont généralement restaurées au redémarrage de Docker, mais vous pouvez aussi les configurer dans le fichier de configuration du daemon Docker :

    sudo mkdir -p /etc/docker
    cat <<'EOF' | sudo tee /etc/docker/daemon.json
    {
      "group": "docker"
    }
    EOF
    sudo systemctl restart docker
    

  3. Comprendre le risque de sécurité. Quiconque dans le groupe docker a un accès équivalent à root. Ajoutez seulement les utilisateurs de confiance.

  4. Utiliser Docker rootless pour une isolation supplémentaire si vous voulez donner aux utilisateurs un accès à Docker sans privileges équivalents à root :

    dockerd-rootless-setuptool.sh install
    

  5. Vérifier la propriété de la socket après les mises à jour système :

    ls -la /var/run/docker.sock
    

Remarque de sécurité : groupe Docker = Root

Ajouter un utilisateur au groupe docker leur donne effectivement un accès root. Voici pourquoi :

# Tout membre du groupe docker peut exécuter des conteneurs en tant que root
docker run -it --rm -v /:/mnt ubuntu bash
# À l'intérieur du conteneur, /mnt pointe vers le système de fichiers de l'hôte
# Et vous exécutez en tant que root dans le conteneur
# Donc vous pouvez modifier n'importe quoi sur l'hôte

# Ou monter le système de fichiers root de l'hôte
docker run -it --rm -v /proc:/host/proc ubuntu bash
# Accéder aux processus de l'hôte et à l'état du kernel

# Ou s'échapper vers l'hôte via les volumes
docker run -it --rm -v /root/.ssh:/tmp ubuntu bash
# Accéder aux fichiers sensibles

Bonnes pratiques :
1. Ajoutez seulement les utilisateurs auxquels vous faites entièrement confiance au groupe docker.
2. Utilisez Docker rootless si vous voulez restreindre l’accès.
3. Utilisez SELinux ou les profils AppArmor pour restreindre davantage les capacités des conteneurs.
4. Sur les systèmes multi-utilisateurs, préférez un accès docker centralisé (par exemple, via un système CI/CD qui gère les permissions).

FAQ

Comment corriger l’erreur « permission refusée en essayant de se connecter à la socket du daemon Docker » ?

Ajoutez votre utilisateur au groupe docker : sudo usermod -aG docker $USER, puis déconnectez-vous et reconnectez-vous ou exécutez newgrp docker. Attention : cela donne à l’utilisateur des permissions équivalentes à root.

Que signifie « groupe docker = root » ?

Toute personne dans le groupe docker peut exécuter des conteneurs avec des privileges root. C’est équivalent à un accès sudo. Ajoutez seulement les utilisateurs de confiance au groupe docker.

Pourquoi Docker nécessite-t-il un accès root ?

Les conteneurs Docker utilisent les namespaces Linux et les cgroups, qui nécessitent root. Le mode Docker rootless (daemon non-root) existe mais n’est pas le paramètre par défaut.

Comment vérifier si mon utilisateur est dans le groupe docker ?

Exécutez groups $USER ou id -G. Si vous voyez « docker » dans la liste, vous êtes dans le groupe. Vérifiez avec docker ps (ne devrait pas demander sudo).

Comment ce guide a été vérifié

Rédigé à la main à partir de la documentation officielle, chaque commande revérifiée, puis relu une seconde fois avant publication. Dernière relecture le .

Sources officielles consultées pour cet article

Share.

Les commentaires sont fermés.