Como solucionar erros “Não é possível conectar-se ao Docker Daemon”

Publicados: 2022-08-14

Gráfico mostrando o logotipo do Docker

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 contêineres é independente do processo de 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 solucionar 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, comandos docker como docker ps , docker run e docker build mostrarão uma mensagem de erro semelhante a esta:

 $ docker execute hello-world:latest
Não é possível conectar ao daemon do Docker em unix:///var/run/docker.sock
O daemon do docker está em execução?

Isso revela que a CLI tentou se comunicar com o daemon do Docker usando o soquete Unix /var/run/docker.sock . O soquete 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 geralmente é gerenciado por um serviço systemd que inicia o Docker automaticamente após a reinicialização do host. Você pode começar a solucionar problemas verificando se este serviço está em execução:

 $ sudo systemctl status docker
docker.service - Mecanismo de contêiner do aplicativo Docker
     Carregado: carregado (/lib/systemd/system/docker.service; ativado; predefinição do fornecedor: ativado)
     Ativo: inativo (morto)

O serviço deve relatar 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 usando o seguinte comando:

 $ sudo systemctl start docker

Agora você deve ser capaz de executar os comandos da CLI do docker com sucesso.

Você pode descobrir que o Docker permanece no estado parado depois que você reinicializa sua 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

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

2. Inicie o Daemon manualmente

Às vezes, você pode usar um sistema que não tenha o serviço Docker instalado. Você pode iniciar manualmente o daemon do Docker usando o comando dockerd . Isso geralmente precisa ser executado como root .

 $ sudo dockerd
INFO[2022-06-29T15:12:49.303428726+01:00] Inicialização

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

3. Verificar se a CLI está direcionando o daemon correto

Podem ocorrer problemas quando a CLI está tentando 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 execute hello-world:latest
Não é possível conectar ao daemon do Docker em tcp:///0.0.0.0:2375

Neste exemplo, a CLI do docker 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 TCP do daemon do Docker estiver desabilitado ou o host especificado estiver inacessí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 contexto usar padrão

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

 $ contexto docker ls
NOME DESCRIÇÃO PONTO DE EXTREMIDADE DO DOCKER             
default * Configuração atual baseada em DOCKER_HOST unix:///var/run/docker.sock

O contexto atualmente selecionado é destacado com um asterisco.

Valores inesperados na coluna DOCKER ENDPOINT geralmente são causados ​​pela configuração da variável de ambiente DOCKER_HOST . Você verá um aviso quando este for o caso:

 $ export DOCKER_HOST=1.2.3.4
$ contexto docker ls
NOME DESCRIÇÃO PONTO DE EXTREMIDADE DO DOCKER
default * Configuração atual baseada em DOCKER_HOST tcp://1.2.3.4:2375
Aviso: a variável de ambiente DOCKER_HOST substitui o contexto ativo. Para usar um contexto, defina o sinalizador --context global ou desative a variável de ambiente DOCKER_HOST.

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

Este problema pode ser resolvido limpando a variável DOCKER_HOST :

 $ export DOCKER_HOST=

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

 $ contexto docker ls
NOME DESCRIÇÃO PONTO DE EXTREMIDADE DO DOCKER             
default * Configuração atual baseada em DOCKER_HOST unix:///var/run/docker.sock

4. Problemas de permissões

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 mostra uma mensagem de erro ligeiramente diferente:

 $ docker execute hello-world:latest
Obteve permissão negada ao tentar se conectar ao soquete do daemon do Docker em 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. Adicionar-se ao grupo docker é a forma de prática recomendada para 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 comandos docker sem ter problemas de permissões.

Resumo

“Não é possível conectar-se ao daemon do Docker” aparece quando a CLI do Docker não consegue 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 estar ciente das possíveis causas desse problema e das maneiras comuns de resolvê-lo. Solucione o erro verificando as configurações do daemon do Docker, reiniciando o serviço do Docker e certificando-se de que sua conta de usuário tenha permissão para interagir com o soquete do Docker.