Pourquoi est-ce que je reçois «Impossible de se connecter au démon Docker» lorsque le démon est en cours d'exécution?

29

Le service Docker fonctionne clairement:

$ systemctl status docker.service 
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2015-12-28 19:20:50 GMT; 3 days ago
     Docs: https://docs.docker.com
 Main PID: 1015 (docker)
   CGroup: /system.slice/docker.service
           └─1015 /usr/bin/docker daemon -H fd:// --exec-opt native.cgroupdriver=cgroupfs
$ ps wuf -u root | grep $(which docker)
root      1015  0.0  0.3 477048 12432 ?        Ssl   2015   2:26 /usr/bin/docker daemon -H fd:// --exec-opt native.cgroupdriver=cgroupfs

Cependant, Docker lui-même refuse de lui parler:

$ docker info
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Je courais la configuration par défaut Docker , qui est, je ne l' ai pas changé tous les /etcdossiers relatifs à ce service.

Quel pourrait être le problème ici?

l0b0
la source

Réponses:

36

Vous devez vous ajouter au dockergroupe et activer le groupe (en vous déconnectant et en vous reconnectant ou en exécutant newgrp docker) pour exécuter les dockercommandes. Le message d'erreur est tout simplement trompeur.

l0b0
la source
1
Pas vraiment trompeur. Il n'a pas pu se connecter au démon docker. "le démon fonctionne-t-il?" était juste une supposition.
Bratchley
2
sudo gpasswd -a alex docker
Alex Punnen
1
sudo gpasswd -a $ USER docker # Fonctionne pour n'importe quel nom d'utilisateur
priomsrb
Je l'ai fait et cela n'a toujours pas fonctionné. Le sudo systemctl start dockerdémon ne fonctionnait vraiment pas ...
nakamin
32

Cette question a déjà été répondue, mais voici une information supplémentaire.

Que vous soyez sur Arch ou sur une autre distribution comme Fedora ou Ubuntu, Docker utilise un fichier socket pour communiquer. Lorsque vous exécutez des dockercommandes, il utilise ce socket pour parler au démon Docker. Bien sûr, le démon doit être en cours d'exécution (et il est souvent désactivé par défaut), mais si votre utilisateur ne peut pas accéder au socket, il ne pourra pas non plus communiquer avec le démon.

Vous devez d'abord installer Docker à partir du référentiel de la distribution. Certaines personnes téléchargent un script d'installation et le dirigent vers un shell ( curl ... | sh), mais il est recommandé de l'installer à partir du référentiel afin qu'il puisse être mis à jour facilement.

Cambre:

# pacman -S docker

Feutre:

# dnf install docker

Comme mentionné ci-dessus, le démon peut être désactivé par défaut. Si vous souhaitez utiliser Docker, le démon doit être en cours d'exécution.

Activez-le (pour qu'il démarre au démarrage):

# systemctl enable docker

Démarrez-le maintenant (ou redémarrez):

# systemctl start docker

Maintenant, par défaut (si le groupe docker est manquant), le socket Docker appartient à root:

# ls -la /var/run/docker.sock
srw-rw---- 1 root root 0 Apr 28 17:22 /var/run/docker.sock

C'est pourquoi un utilisateur régulier n'est pas en mesure de parler au démon docker. Un utilisateur ordinaire ne dispose pas des autorisations suffisantes pour accéder au socket. Il n'est pas en mesure d'atteindre le démon, il suppose donc qu'il n'est pas en cours d'exécution et affiche cette erreur:Cannot connect to the Docker daemon. Is the docker daemon running on this host?

C'est pourquoi de nombreuses personnes démarrent simplement toutes les commandes Docker en tant que root, en utilisant sudo. Mais comme décrit dans l'autre réponse, Docker a son propre mécanisme pour cela, donc l'utilisation de sudo n'est pas nécessaire.

Idéalement, un groupe appelé dockerest créé lors de l'installation de Docker. Cependant, si ce groupe n'existe pas au démarrage du démon, le fichier socket appartient à root.

Dans certains cas, ce groupe avait un nom différent, comme dockerrootsur Fedora . Vérifiez grep docker /etc/groups'il existe un tel groupe sur votre système. Si vous utilisez déjà ce groupe (votre utilisateur y est), vous devrez configurer Docker pour l'utiliser:

Dans /etc/sysconfig/docker, ajoutez -G dockerroot(remarque: c'est une solution de contournement, pas la meilleure solution):

OPTIONS='--selinux-enabled -G dockerroot'

Après avoir redémarré le démon, votre utilisateur pourra accéder au socket:

# systemctl restart docker
# ls -la /var/run/docker.sock
srw-rw---- 1 root dockerroot 0 Apr 28 17:32 /var/run/docker.sock

Sinon, la manière officielle serait d'utiliser le groupe appelé docker. S'il existe, Docker l'utilisera automatiquement, c'est-à-dire qu'il définira le groupe du socket sur ce groupe. S'il n'existe pas, il vous suffit de le créer et de redémarrer le démon:

# groupadd docker
# systemctl restart docker

Le fichier socket appartiendra à ce groupe:

# srw-rw---- 1 root docker 0 Apr 28 17:42 /var/run/docker.sock

Votre utilisateur doit être dans le dockergroupe pour pouvoir accéder au socket:

# usermod -aG docker (user)

Vous devrez peut-être vous déconnecter et vous reconnecter (ou su - (user)), exécutez idpour voir si vous êtes dans le groupe.

Vous pouvez ensuite utiliser Docker sans sudo / root:

$ docker version --format '{{.Server.Version}}'
1.9.1

Enfin, un mot d'avertissement. Seuls les utilisateurs de confiance doivent être autorisés à contrôler votre démon Docker . Voir https://docs.docker.com/engine/security/security/ .
(Mais bien sûr, il en va de même pour sudo - seuls les utilisateurs de confiance doivent faire partie du wheelgroupe.)

basic6
la source
1
Cela ne semble pas répondre à la question d'origine.
l0b0
4
@ l0b0: Eh bien, je voulais expliquer pourquoi cela se produit, en espérant que cela serait utile à quelqu'un. La commande usermod qui ajoute l'utilisateur au groupe est masquée dans la partie centrale de la réponse. Si vous ne trouvez pas cette réponse utile, faites-le moi savoir afin que je puisse la supprimer.
basic6
4
Oui, il répond et explique la solution pour Arch.
kodeart
J'ai fait tout cela et je rencontre toujours le problème mentionné par OP. Aucune des étapes liées aux autorisations n'a résolu le problème.
mopsyd
3

sudo usermod -aG docker [nom d'utilisateur]

puis vous déconnecter puis vous reconnecter

user2167582
la source
1

Après avoir fait quelques recherches pour résoudre ce problème sur mon système Linux, j'ai pensé que j'écrirais cette réponse. Voici ce que j'ai fait pour résoudre le problème.

Sur Fedora 22

Installation de Docker:

$> curl -fsSL https://get.docker.com/ | sh

Après avoir installé Docker:

Un utilisateur doit être ajouté au groupe Docker.

$> sudo usermod -aG docker

Le démon docker doit être démarré

$> sudo service docker start

Vous pouvez configurer le démon pour qu'il démarre au démarrage

$> sudo chkconfig docker on

Vous pouvez vérifier que le service Docker est en cours d'exécution

$> service docker status

Et une dernière vérification finale

$> docker run hello-world
Ronald Weidner
la source
+1 pour un exemple complet, bien que beaucoup de ces commandes ne soient pas applicables à ma situation (installation en utilisant pacman, en utilisant systemctlau lieu de service+ chkconfig).
l0b0
1

Si vous utilisez Fedora 23 ou Redhat, modifiez /etc/sysconfig/dockeret modifiez les éléments suivants

OPTIONS='--selinux-enabled --log-driver=journald -G yourdockergroup'

Redémarrez docker.

Assurez-vous d'ajouter ce groupe au système et de vous ajouter au groupe.

Stuart James
la source
1

Si vous avez démarré votre moteur docker avec: sudo service docker start

vous ne pouvez pas vous connecter avec un utilisateur normal même si vous vous êtes ajouté au groupe 'docker'.

Vous pouvez simplement l'arrêter avec: sudo service docker stop

et le démarrer en tant qu'utilisateur normal: démarrage du service docker

Raymond
la source
Je n'ai pas eu à ajouter d'utilisateur docker groupjusqu'à maintenant. sudo service starttravaillé pour moi. Cependant, observera s'il y a quelque chose de nouveau.
stupidnetizen
0

J'ai également eu le même problème. Le problème était dans les sockets allouées à docker-daemon et docker-client.

  1. Tout d'abord, l'autorisation n'a pas été définie pour le client docker sur docker.sock Vous pouvez le définir à l'aide sudo usermod -aG docker $USER

  2. Vérifiez ensuite votre fichier bash où le docker-client s'exécute. Pour moi, il a été défini sur 0.0.0.0:2375, alors que le démon docker fonctionnait sur un socket Unix. (Il a été défini dans le fichier de configuration de dockerd).

  3. Il suffit de commenter la ligne incriminée et cela fonctionnera bien.

  4. Mais si vous voulez le faire fonctionner sur le port TCP au lieu du socket Unix, changez le fichier de configuration de dockerd, définissez-le sur 0.0.0.0.2375, et gardez la ligne en bash telle qu'elle est si elle est présente ou définissez-la sur 0.0. 0,0: 2375.

Nilesh Kande
la source
0

Ce sont les étapes que j'ai suivies pour corriger ce qui suit

$ docker info
Cannot connect to the Docker daemon at 
tcp://localhost:2375/usr/lib/systemd/system/docker.socket. Is the docker daemon running?
  1. Ajoutez-vous au groupe docker

    usermod -aG docker $USER

  2. Correction des autorisations sur docker socker et command.

    sudo chgrp docker /usr/bin/docker
    sudo chgrp docker /var/run/docker.sock

    $ ll $(which docker) -rwxr-xr-x 1 root docker 18991768 08.07.2017 22:57 /usr/bin/docker*

    $ ll /var/run/docker.sock srw-rw---- 1 root docker 0 23.07.2017 10:21 /var/run/docker.sock

  3. Ajouter des variables à la configuration de l'environnement pour la commande docker

    export DOCKER_HOST=unix:///var/run/docker.sock

  4. Rest Docker

    sudo systemctl restart docker

nelaaro
la source