Come risolvere gli errori "Impossibile connettersi al demone Docker".

Pubblicato: 2022-08-14

Grafica che mostra il logo Docker

Docker è una delle piattaforme leader per la creazione e l'esecuzione di contenitori di software. Viene fornito con tutto il necessario per utilizzare i container su un singolo host o su più nodi distribuiti in modalità Swarm.

Docker ha un'architettura basata su demone. Il software responsabile della creazione e dell'avvio dei contenitori è indipendente dal processo CLI che accetta i tuoi comandi. Ciò significa che vedrai errori nella CLI se tenti di eseguire comandi senza una connessione daemon attiva. In questo articolo, condivideremo alcuni metodi per la risoluzione dei problemi di questi messaggi frustranti.

Sintomi del problema

La Docker CLI dipende dalla disponibilità di una connessione daemon. Interagisce con il demone usando le chiamate API. Quando il demone configurato è inaccessibile, i comandi docker come docker ps , docker run e docker build mostreranno un messaggio di errore simile a questo:

 $ docker esegui hello-world:latest
Impossibile connettersi al daemon Docker su unix:///var/run/docker.sock
Il demone Docker è in esecuzione?

Ciò rivela che la CLI ha cercato di comunicare con il demone Docker utilizzando il /var/run/docker.sock Unix /var/run/docker.sock. Il socket non è aperto, quindi la connessione non è riuscita.

1. Verificare che il servizio Docker Daemon sia in esecuzione

Il demone Docker è solitamente gestito da un servizio systemd che avvia automaticamente Docker dopo il riavvio dell'host. Puoi iniziare la risoluzione dei problemi controllando se questo servizio è in esecuzione:

 $ sudo systemctl finestra mobile
docker.service - Motore del contenitore dell'applicazione Docker
     Caricato: caricato (/lib/systemd/system/docker.service; abilitato; preimpostazione del fornitore: abilitato)
     Attivo: inattivo (morto)

Il servizio dovrebbe segnalare Active: active (running) se il demone è in esecuzione. L'esempio sopra mostra inactive (dead) , il che significa che il demone si è fermato.

Avvia Docker usando il seguente comando:

 $ sudo systemctl avvia la finestra mobile

Ora dovresti essere in grado di eseguire correttamente i comandi CLI della docker .

Potresti scoprire che Docker rimane nello stato di arresto dopo aver riavviato la macchina. Puoi risolvere questo problema abilitando il servizio, consentendo a systemd di avviarlo automaticamente:

 $ sudo systemctl abilita la finestra mobile
$ sudo systemctl daemon-reload

Il comando daemon-reload indica a systemd di ricaricare la sua configurazione per applicare la modifica.

2. Avvia il demone manualmente

A volte potresti utilizzare un sistema su cui non è installato il servizio Docker. Puoi avviare manualmente il demone Docker usando il comando dockerd . Questo di solito deve essere eseguito come root .

 $ sudo docker
INFO[2022-06-29T15:12:49.303428726+01:00] Avvio

Docker rimarrà accessibile per tutto il tempo in cui il comando è in esecuzione. Usa Ctrl+C per fermare il demone.

3. Il controllo della CLI sta prendendo di mira il demone corretto

Possono verificarsi problemi quando la CLI tenta di connettersi a un'istanza del demone Docker remota. Questa è solitamente la causa quando il messaggio di errore mostra un indirizzo TCP:

 $ docker esegui hello-world:latest
Impossibile connettersi al demone Docker su tcp:///0.0.0.0:2375

In questo esempio, la CLI docker sta tentando di contattare il daemon Docker a 0.0.0.0:2375 utilizzando TCP, invece del socket Docker Unix locale. Ciò non riuscirà se il supporto TCP del daemon Docker è disabilitato o se l'host specificato è inaccessibile sulla rete.

Di solito puoi risolvere questo problema passando al contesto Docker CLI corretto per la connessione daemon che desideri utilizzare:

 $ contesto della finestra mobile usa l'impostazione predefinita

Puoi elencare tutti i contesti disponibili e gli endpoint daemon a cui si connettono con il comando context ls :

 $ contesto della finestra mobile ls
NOME DESCRIZIONE DOCKER ENDPOINT             
default * Configurazione corrente basata su DOCKER_HOST unix:///var/run/docker.sock

Il contesto attualmente selezionato è evidenziato con un asterisco.

I valori imprevisti nella colonna DOCKER ENDPOINT sono generalmente causati dall'impostazione della variabile di ambiente DOCKER_HOST . Vedrai un avviso quando questo è il caso:

 $ esportazione DOCKER_HOST=1.2.3.4
$ contesto della finestra mobile ls
NOME DESCRIZIONE DOCKER ENDPOINT
default * Configurazione corrente basata su DOCKER_HOST tcp://1.2.3.4:2375
Avviso: la variabile di ambiente DOCKER_HOST ha la precedenza sul contesto attivo. Per utilizzare un contesto, impostare il flag --context globale o deselezionare la variabile di ambiente DOCKER_HOST.

La presenza della variabile d'ambiente DOCKER_HOST nella shell sovrascrive l'endpoint definito dal contesto selezionato. In questo esempio, i comandi docker punteranno sempre all'istanza del demone su tcp://1.2.3.4:2375 .

Questo problema può essere risolto cancellando la variabile DOCKER_HOST :

 $ esportazione DOCKER_HOST=

Docker ora utilizzerà l'endpoint configurato dal tuo contesto attivo. Questo sarà il socket Unix locale predefinito in /var/run/docker.sock a meno che tu non abbia impostato manualmente un contesto personalizzato.

 $ contesto della finestra mobile ls
NOME DESCRIZIONE DOCKER ENDPOINT             
default * Configurazione corrente basata su DOCKER_HOST unix:///var/run/docker.sock

4. Problemi di autorizzazione

Le autorizzazioni utente errate sul socket Docker sono un'altra causa comune di problemi di connessione del demone. Questo tipo di problema di solito mostra un messaggio di errore leggermente diverso:

 $ docker esegui hello-world:latest
Ho ottenuto l'autorizzazione negata durante il tentativo di connessione al socket del demone Docker su unix:///var/run/docker.sock

Ciò accade quando il tuo account utente Unix non dispone dell'autorizzazione per interagire con il socket che espone l'API Docker. L'aggiunta di te stesso al gruppo docker è il modo migliore per risolvere questo problema:

 $ sudo usermod -aG docker $USER

Sarà necessario aprire una nuova finestra della shell o disconnettersi e riconnettersi affinché questa modifica abbia effetto. Ora dovresti essere in grado di eseguire i comandi della docker senza incorrere in problemi di autorizzazioni.

Riepilogo

"Impossibile connettersi al daemon Docker" viene visualizzato quando l'interfaccia a riga di comando Docker non è in grado di comunicare con un'istanza del daemon Docker utilizzando la configurazione corrente. Ciò è spesso dovuto al fatto che il servizio daemon Docker è stato interrotto o disabilitato. Potresti anche provare a connetterti a un host Docker remoto che è andato offline.

Ora dovresti essere consapevole delle possibili cause di questo problema e dei modi comuni per risolverlo. Risolvi l'errore controllando le impostazioni del demone Docker, riavviando il servizio Docker e assicurandoti che il tuo account utente disponga dell'autorizzazione per interagire con il socket Docker.