Come risolvere gli errori "Impossibile connettersi al demone Docker".
Pubblicato: 2022-08-14Docker è 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.