¿Por qué aparece "No se puede conectar con el demonio Docker" cuando el demonio se está ejecutando?

29

El servicio Docker se ejecuta claramente:

$ 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

Sin embargo, Docker se niega a hablar con él:

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

Estoy ejecutando la configuración predeterminada de Docker , es decir, no he cambiado ningún /etcarchivo relacionado con este servicio.

Cual podría ser el problema aquí?

l0b0
fuente

Respuestas:

36

Debe agregarse al dockergrupo y activarlo (al cerrar sesión y volver a iniciarlo o ejecutarlo newgrp docker) para ejecutar dockercomandos. El mensaje de error es simplemente engañoso.

l0b0
fuente
1
No es realmente engañoso. No se pudo conectar al docker daemon. "¿está corriendo el demonio?" Era solo una suposición.
Bratchley
2
sudo gpasswd -a alex docker
Alex Punnen
1
sudo gpasswd -a $ USER docker # Funciona para cualquier nombre de usuario
priomsrb
Hice esto y todavía no funcionó. Correr lo sudo systemctl start dockerarregló, el demonio realmente no estaba corriendo ...
nakamin
32

Esta pregunta ya ha sido respondida, pero aquí hay una información adicional.

No importa si está en Arch u otra distribución como Fedora o Ubuntu, Docker usa un archivo socket para comunicarse. Cuando ejecuta dockercomandos, utiliza este socket para hablar con el demonio Docker. Por supuesto, el demonio debe estar ejecutándose (y a menudo está deshabilitado de manera predeterminada), pero si su usuario no puede acceder al socket, tampoco podrá comunicarse con el demonio.

Primero debe instalar Docker desde el repositorio de la distribución. Algunas personas descargan un script de instalación y lo canalizan a un shell ( curl ... | sh), pero se recomienda instalarlo desde el repositorio para que pueda actualizarse fácilmente.

Arco:

# pacman -S docker

Fedora

# dnf install docker

Como se mencionó anteriormente, el demonio puede estar deshabilitado por defecto. Si quieres usar Docker, el demonio debe estar ejecutándose.

Habilítelo (para que se inicie en el arranque):

# systemctl enable docker

Comience ahora (o reinicie):

# systemctl start docker

Ahora, por defecto (si falta el grupo Docker), el socket Docker es propiedad de root:

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

Esta es la razón por la cual un usuario normal no puede hablar con el demonio docker. Un usuario normal no tiene permisos suficientes para acceder al socket. No puede alcanzar el demonio, por lo que supone que no se está ejecutando y muestra este error:Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Es por eso que muchas personas simplemente inician todos los comandos de Docker como root, usando sudo. Pero como se describe en la otra respuesta, Docker tiene su propio mecanismo para eso, por lo que no es necesario usar sudo.

Idealmente, dockerse crea un grupo llamado al instalar Docker. Sin embargo, si ese grupo no existe cuando se inicia el demonio, el archivo de socket es propiedad de root.

En algunos casos, ese grupo solía tener un nombre diferente, como dockerrooten Fedora . Verifique grep docker /etc/groupsi hay tal grupo en su sistema. Si ya está usando ese grupo (su usuario está en él), necesitará configurar Docker para usarlo:

En /etc/sysconfig/docker, agregue -G dockerroot(nota: es una solución alternativa, no la mejor solución):

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

Después de reiniciar el demonio, su usuario podrá acceder al socket:

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

De lo contrario, la forma oficial sería utilizar el grupo llamado docker. Si existe, Docker lo usará automáticamente, es decir, establecerá el grupo del socket en ese grupo. Si no existe, todo lo que necesita hacer es crearlo y reiniciar el demonio:

# groupadd docker
# systemctl restart docker

El archivo de socket será propiedad de ese grupo:

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

Su usuario debe estar en el dockergrupo para poder acceder al socket:

# usermod -aG docker (user)

Es posible que deba cerrar sesión y volver a iniciarla (o su - (user)), ejecutar idpara ver si está en el grupo.

Luego puede usar Docker sin sudo / root:

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

Finalmente, una palabra de advertencia. Solo los usuarios de confianza deberían poder controlar tu demonio Docker . Ver https://docs.docker.com/engine/security/security/ .
(Pero, por supuesto, lo mismo es cierto para sudo: solo los usuarios de confianza deben estar en el wheelgrupo).

básico6
fuente
1
Esto no parece responder a la pregunta original.
l0b0
44
@ l0b0: Bueno, quería explicar por qué sucede esto, esperando que sea útil para alguien. El comando usermod que agrega al usuario al grupo está oculto en la parte central de la respuesta. Si no encuentra útil esta respuesta, avíseme para que pueda eliminarla.
basic6
44
Sí, responde y explica la solución para Arch.
Kodeart
He hecho todo esto y todavía me encuentro con el problema mencionado por OP. Ninguno de los pasos relacionados con el permiso ha resuelto el problema.
mopsyd
3

sudo usermod -aG docker [nombre de usuario]

luego cierre sesión y vuelva a iniciar sesión

usuario2167582
fuente
1

Después de investigar un poco para resolver este problema en mi sistema Linux, pensé en escribir esta respuesta. Esto es lo que hice para solucionar el problema.

En Fedora 22

Instalación de Docker:

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

Después de instalar Docker:

Se debe agregar un usuario al grupo acoplable.

$> sudo usermod -aG docker

El Docker Daemon necesita ser iniciado

$> sudo service docker start

Puedes configurar el demonio para que comience en el arranque

$> sudo chkconfig docker on

Puede verificar que el servicio Docker se esté ejecutando

$> service docker status

Y un último cheque final

$> docker run hello-world
Ronald Weidner
fuente
+1 para un ejemplo completo, aunque muchos de estos comandos no son aplicables a mi situación (instalación usando pacman, usando en systemctllugar de service+ chkconfig).
l0b0
1

Si está utilizando la variante Fedora 23 o Redhat, edite /etc/sysconfig/dockery modifique lo siguiente

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

Reinicia la ventana acoplable.

Asegúrese de agregar este grupo al sistema y agregarse al grupo.

Stuart James
fuente
1

Si inició su motor de docker con: sudo service docker start

no puede conectarse con un usuario normal, incluso si se ha agregado al grupo 'docker'.

Simplemente puede detenerlo con: sudo service docker stop

e iniciarlo como un usuario normal: inicio del acoplador de servicio

Raymond
fuente
No tuve que agregar usuarios docker grouphasta ahora. sudo service starttrabajó para mi. HOwever, observará si hay algo nuevo.
stupidnetizen
0

También tuve el mismo problema. El problema estaba en los sockets asignados a docker-daemon y docker-client.

  1. Primero, no se configuró el permiso para el docker-client en docker.sock. sudo usermod -aG docker $USER

  2. Luego verifique su archivo bash donde se ejecuta el docker-client. Para mí, se configuró en 0.0.0.0:2375, mientras que docker-daemon se estaba ejecutando en un socket de Unix. (Se estableció en el archivo de configuración de dockerd).

  3. Solo comente la línea ofensiva y funcionará bien.

  4. Pero si desea que funcione en el puerto TCP en lugar del socket Unix, cambie el archivo de configuración de dockerd, configúrelo en 0.0.0.0.2375 y mantenga la línea en bash como está si está presente o configúrelo en 0.0. 0.0: 2375.

Nilesh Kande
fuente
0

Estos son los pasos que seguí para arreglar lo siguiente

$ docker info
Cannot connect to the Docker daemon at 
tcp://localhost:2375/usr/lib/systemd/system/docker.socket. Is the docker daemon running?
  1. Agréguese al grupo acoplable

    usermod -aG docker $USER

  2. Se corrigieron los permisos en docker socker y comando.

    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. Agregue variables al entorno de configuración para el comando docker

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

  4. Docker de descanso

    sudo systemctl restart docker

nelaaro
fuente