web-dev-qa-db-fra.com

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?

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?

J'exécute configuration Docker par défaut , c'est-à-dire que je n'ai changé aucun /etc fichiers relatifs à ce service.

Quel pourrait être le problème ici?

33
l0b0

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

37
l0b0

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

Peu importe si vous êtes sur Arch ou une autre distribution comme Fedora ou Ubuntu, Docker utilise un fichier socket pour communiquer. Lorsque vous exécutez les commandes docker, 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 normal 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é docker est 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 dockerroot sur Fedora . Vérifiez grep docker /etc/group Pour voir s'il existe un tel groupe sur votre système. Si vous utilisez déjà ce groupe (votre utilisateur y est), vous devez 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 groupe docker 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 id pour 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 devraient ê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 être dans le groupe wheel.)

41
basic6

Sudo usermod -aG docker [nom d'utilisateur]

puis vous déconnecter puis vous reconnecter

3
user2167582

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: Arrêt de docker de service Sudo

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

1
Raymond

Si vous utilisez Fedora 23 ou la variante de Redhat, modifiez /etc/sysconfig/docker et modifiez ce qui suit

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.

1
Stuart James

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
1
Ronald Weidner

Cette commande fonctionne pour moi

Sudo grep dwalsh /etc/sudoers

alias docker="Sudo /usr/bin/docker"

J'ai trouvé la solution sur cette page si vous avez besoin de plus de documentation. Pourquoi nous ne permettons pas aux utilisateurs non root d'exécuter Docker dans CentOS, Fedora ou RHEL

1
DarKainSoul

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

0
nelaaro

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 la définir à l'aide de Sudo usermod -aG docker $USER

  2. Vérifiez ensuite votre fichier bash où le docker-client s'exécute. Pour moi, il était réglé 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 conservez la ligne dans bash car elle est présent ou définissez-le sur 0.0.0.0:2375.

0
Nilesh Kande