Como corrigir erros “Não é possível conectar ao daemon do Docker”

0
45


O Docker é uma das principais plataformas para construção e execução de contêineres de software. Ele vem com tudo o que você precisa para usar contêineres em um único host ou em vários nós distribuídos no modo Swarm.

O Docker tem uma arquitetura baseada em daemon. O software responsável por criar e iniciar containers é independente do processo CLI que aceita seus comandos. Isso significa que você verá erros na CLI se tentar executar comandos sem uma conexão de daemon ativa. Neste artigo, compartilharemos alguns métodos para corrigir essas mensagens frustrantes.

Sintomas do problema

A CLI do Docker depende da disponibilidade de uma conexão de daemon. Ele interage com o daemon usando chamadas de API. Quando o daemon configurado estiver inacessível, docker comandos como docker ps, docker runS docker build exibirá uma mensagem de erro semelhante a esta:

$ docker run hello-world:latest
Cannot connect to the Docker daemon at unix:///var/run/docker.sock
Is the docker daemon running?

Isso revela que a CLI tentou se comunicar com o daemon do Docker usando o /var/run/docker.sock Soquete Unix. O plugue não está aberto, então a conexão falhou.

1. Verifique se o serviço Docker Daemon está em execução

O daemon do Docker normalmente é gerenciado por um serviço systemd que inicia o Docker automaticamente após a reinicialização do host. Você pode iniciar a solução de problemas verificando se este serviço está em execução:

$ sudo systemctl status docker
docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: inactive (dead)

O serviço deve informar Active: active (running) se o daemon estiver em execução. O exemplo acima mostra inactive (dead) o que significa que o daemon parou.

Inicie o Docker com o seguinte comando:

$ sudo systemctl start docker

Agora você deve ser capaz de executar docker Comandos CLI bem-sucedidos.

O Docker pode permanecer no estado parado após a reinicialização da máquina. Você pode resolver isso habilitando o serviço, permitindo que o systemd o inicie automaticamente:

$ sudo systemctl enable docker
$ sudo systemctl daemon-reload

a daemon-reload O comando diz ao systemd para recarregar sua configuração para aplicar a mudança.

2. Inicie o daemon manualmente

Às vezes, você pode estar usando um sistema que não possui o serviço Docker instalado. Você pode iniciar manualmente o daemon do Docker usando o dockerd domínio. Normalmente, isso deve ser executado como root.

$ sudo dockerd
INFO[2022-06-29T15:12:49.303428726+01:00] Starting up

O Docker permanecerá acessível enquanto o comando estiver em execução. Use Ctrl + C para parar o daemon.

3. Verifique se o CLI está apontando para o daemon correto

Podem ocorrer problemas quando a CLI tenta se conectar a uma instância remota do daemon do Docker. Esta é geralmente a causa quando a mensagem de erro mostra um endereço TCP:

$ docker run hello-world:latest
Cannot connect to the Docker daemon at tcp:///0.0.0.0:2375

Neste exemplo, o docker A CLI está tentando entrar em contato com o daemon do Docker em 0.0.0.0:2375 usando TCP, em vez do soquete Unix Docker local. Isso falhará se o suporte a TCP do daemon do Docker estiver desabilitado ou se o host especificado não estiver acessível na rede.

Geralmente, você pode resolver isso alternando para o contexto correto da CLI do Docker para a conexão do daemon que deseja usar:

$ docker context use default

Você pode listar todos os contextos disponíveis e os endpoints do daemon aos quais eles se conectam com o context ls domínio:

$ docker context ls
NAME        DESCRIPTION                               DOCKER ENDPOINT             
default *   Current DOCKER_HOST based configuration   unix:///var/run/docker.sock

O contexto atualmente selecionado é destacado com um asterisco.

Valores inesperados no DOCKER ENDPOINT coluna vertebral são geralmente causadas pela DOCKER_HOST variável de ambiente definida. Você verá um aviso quando este for o caso:

$ export DOCKER_HOST=1.2.3.4
$ docker context ls
NAME        DESCRIPTION                               DOCKER ENDPOINT
default *   Current DOCKER_HOST based configuration   tcp://1.2.3.4:2375
Warning: DOCKER_HOST environment variable overrides the active context. To use a context, either set the global --context flag, or unset DOCKER_HOST environment variable.

a presença do DOCKER_HOST A variável de ambiente em seu shell substitui o endpoint definido pelo contexto selecionado. Neste exemplo, docker comandos sempre apontarão para a instância do daemon em tcp://1.2.3.4:2375.

Este problema pode ser resolvido excluindo o DOCKER_HOST variável:

$ export DOCKER_HOST=

O Docker agora usará o endpoint configurado pelo seu contexto ativo. Este será o soquete Unix local padrão no /var/run/docker.sock a menos que você tenha configurado manualmente um contexto personalizado.

$ docker context ls
NAME        DESCRIPTION                               DOCKER ENDPOINT             
default *   Current DOCKER_HOST based configuration   unix:///var/run/docker.sock

4. Problemas de permissão

Permissões de usuário incorretas no soquete do Docker são outra causa comum de problemas de conexão do daemon. Esse tipo de problema geralmente exibe uma mensagem de erro ligeiramente diferente:

$ docker run hello-world:latest
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock

Isso acontece quando sua conta de usuário Unix não tem permissão para interagir com o soquete que expõe a API do Docker. Adicione-se a docker group é a maneira mais prática de resolver esse problema:

$ sudo usermod -aG docker $USER

Você precisará abrir uma nova janela de shell ou sair e entrar novamente para que essa alteração tenha efeito. Agora você deve ser capaz de executar docker comandos sem problemas de permissão.

Resumo

“Não é possível conectar ao daemon do Docker” aparece quando a CLI do Docker não pode se comunicar com uma instância do daemon do Docker usando sua configuração atual. Isso geralmente ocorre porque o serviço do daemon do Docker foi interrompido ou desabilitado. Você também pode estar tentando se conectar a um host remoto do Docker que ficou offline.

Agora você deve conhecer as possíveis causas desse problema e as formas comuns de resolvê-lo. Corrija o erro verificando a configuração do daemon do Docker, reiniciando o serviço do Docker e garantindo que sua conta de usuário tenha permissão para interagir com o soquete do Docker.