Perché ricevo "Impossibile connettersi al daemon Docker" quando il daemon è in esecuzione?


29

Il servizio Docker è chiaramente in esecuzione:

$ 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

Tuttavia, Docker stesso rifiuta di parlargli:

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

Sto eseguendo la configurazione Docker predefinita , ovvero non ho modificato alcun /etcfile relativo a questo servizio.

Quale potrebbe essere il problema qui?

Risposte:


36

È necessario aggiungersi al dockergruppo e attivare il gruppo (disconnettendosi e riconnettendosi o eseguendolo newgrp docker) per eseguire i dockercomandi. Il messaggio di errore è semplicemente fuorviante.


1
Non molto fuorviante. E non poteva connettersi al demone finestra mobile. "il demone è in esecuzione?" era solo una supposizione.
Bratchley,

2
sudo gpasswd -a alex docker
Alex Punnen,

1
sudo gpasswd -a $ USER docker # Funziona con qualsiasi nome utente
priomsrb

L'ho fatto e ancora non ha funzionato. In esecuzione sudo systemctl start dockerrisolto, il demone in realtà non era in esecuzione ...
nakamin

32

A questa domanda è già stata data una risposta, ma ecco un'ulteriore informazione.

Non importa se sei su Arch o un'altra distribuzione come Fedora o Ubuntu, Docker utilizza un file socket per comunicare. Quando si eseguono dockercomandi, utilizza questo socket per parlare con il demone Docker. Naturalmente, il demone deve essere in esecuzione (ed è spesso disabilitato per impostazione predefinita), ma se l'utente non può accedere al socket, non sarebbe nemmeno in grado di comunicare con il demone.

Installare prima Docker dal repository della distribuzione. Alcune persone scaricano uno script di installazione e lo instradano in una shell ( curl ... | sh), ma si consiglia di installarlo dal repository in modo che possa essere aggiornato facilmente.

Arco:

# pacman -S docker

Fedora:

# dnf install docker

Come menzionato sopra, il demone può essere disabilitato di default. Se si desidera utilizzare Docker, il daemon deve essere in esecuzione.

Abilitalo (quindi verrà avviato all'avvio):

# systemctl enable docker

Avvialo ora (o riavvia):

# systemctl start docker

Ora, per impostazione predefinita (se manca il gruppo docker), il socket Docker è di proprietà di root:

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

Questo è il motivo per cui un utente normale non è in grado di parlare con il demone docker. Un utente normale non dispone di autorizzazioni sufficienti per accedere al socket. Non è in grado di raggiungere il demone, quindi presuppone che non sia in esecuzione e mostra questo errore:Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Questo è il motivo per cui molte persone semplicemente avviano tutti i comandi Docker come root, usando sudo. Ma come descritto nell'altra risposta, Docker ha un suo meccanismo per questo, quindi l'uso di sudo non è necessario.

Idealmente, un gruppo chiamato dockerviene creato durante l'installazione di Docker. Tuttavia, se quel gruppo non esiste all'avvio del daemon, il file socket è di proprietà di root.

In alcuni casi, quel gruppo aveva un nome diverso, come dockerrootsu Fedora . Controlla grep docker /etc/groupse esiste un gruppo del genere sul tuo sistema. Se stai già utilizzando quel gruppo (il tuo utente è presente), dovrai configurare Docker per usarlo:

In /etc/sysconfig/docker, aggiungi -G dockerroot(nota: è una soluzione alternativa, non la soluzione migliore):

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

Dopo aver riavviato il demone, l'utente sarà in grado di accedere 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

Altrimenti, il modo ufficiale sarebbe usare il gruppo chiamato docker. Se esiste, Docker lo utilizzerà automaticamente, ovvero imposta il gruppo del socket su quel gruppo. Se non esiste, tutto ciò che devi fare è crearlo e riavviare il demone:

# groupadd docker
# systemctl restart docker

Il file socket sarà di proprietà di quel gruppo:

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

L'utente deve essere nel dockergruppo per poter accedere al socket:

# usermod -aG docker (user)

Potrebbe essere necessario disconnettersi e accedere nuovamente (o su - (user)), eseguire idper vedere se si è nel gruppo.

È quindi possibile utilizzare Docker senza sudo / root:

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

Finalmente un avvertimento. Solo gli utenti fidati dovrebbero essere autorizzati a controllare il demone Docker . Vedi https://docs.docker.com/engine/security/security/ .
(Ma ovviamente lo stesso vale per sudo: solo gli utenti fidati dovrebbero essere nel wheelgruppo.)


1
Questo non sembra rispondere alla domanda originale.
l0b0,

4
@ l0b0: Beh, volevo spiegare perché questo sta accadendo, sperando che possa essere utile a qualcuno. Il comando usermod che aggiunge l'utente al gruppo è nascosto nella parte centrale della risposta. Se non trovi utile questa risposta, fammi sapere così posso eliminarla.
basic6

4
Sì, risponde e spiega la soluzione per Arch.
kodeart,

Ho fatto tutto questo e sto ancora riscontrando il problema menzionato dall'OP. Nessuno dei passaggi relativi alle autorizzazioni ha risolto il problema.
mopsyd,

3

sudo usermod -aG docker [nome utente]

quindi disconnettersi quindi riconnettersi


1

Dopo aver fatto qualche ricerca per risolvere questo problema sul mio sistema Linux, ho pensato di scrivere questa risposta. Ecco cosa ho fatto per risolvere il problema.

Su Fedora 22

Installazione di Docker:

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

Dopo aver installato Docker:

È necessario aggiungere un utente al gruppo finestra mobile.

$> sudo usermod -aG docker

Il demone docker deve essere avviato

$> sudo service docker start

È possibile impostare il daemon per l'avvio all'avvio

$> sudo chkconfig docker on

È possibile verificare che il servizio docker sia in esecuzione

$> service docker status

E un ultimo controllo finale

$> docker run hello-world

+1 per un esempio completo, sebbene molti di questi comandi non siano applicabili alla mia situazione (installazione usando pacman, usando systemctlinvece di service+ chkconfig).
l0b0

1

Se stai usando la variante Fedora 23 o Redhat, modifica /etc/sysconfig/dockere modifica quanto segue

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

Riavvia la finestra mobile.

Assicurati di aggiungere questo gruppo al sistema e di aggiungerti al gruppo.



1

Se hai avviato il motore della finestra mobile con: sudo service docker start

non puoi connetterti con l'utente normale anche se ti sei aggiunto al gruppo 'docker'.

Puoi semplicemente fermarlo con: sudo service docker stop

e avviarlo come un normale utente: service docker start


Non ho dovuto aggiungere l'utente a docker groupfinora. sudo service startha funzionato per me. Tuttavia, osserverò se c'è qualcosa di nuovo.
stupidnetizen,

0

Ho avuto anche lo stesso problema. Il problema riguardava i socket assegnati a docker-daemon e docker-client.

  1. Innanzitutto, l'autorizzazione non è stata impostata per il client docker su docker.sock È possibile impostarlo utilizzando sudo usermod -aG docker $USER

  2. Quindi controlla il tuo file bash dove è in esecuzione il docker-client. Per me è stato impostato su 0.0.0.0:2375, mentre docker-daemon era in esecuzione su socket unix. (È stato impostato nel file di configurazione di dockerd).

  3. Basta commentare la linea offensiva e funzionerà bene.

  4. Ma se vuoi farlo funzionare sulla porta TCP invece del socket unix, quindi modifica il file di configurazione di dockerd, impostalo su 0.0.0.0.2375 e mantieni la riga in bash com'è se presente o impostala su 0.0. 0.0: 2375.


0

Questi sono i passaggi che ho seguito per correggere quanto segue

$ docker info
Cannot connect to the Docker daemon at 
tcp://localhost:2375/usr/lib/systemd/system/docker.socket. Is the docker daemon running?
  1. Aggiungi te stesso al gruppo docker

    usermod -aG docker $USER

  2. Correggi i permessi sul docker socker e sul 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. Aggiungi variabili all'ambiente di configurazione per il comando docker

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

  4. Docker di riposo

    sudo systemctl restart docker

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.