Por que estou recebendo “Não é possível conectar ao daemon do Docker” quando o daemon está em execução?

22

O serviço do Docker está claramente em execução:

$ 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

No entanto, o próprio Docker se recusa a falar com ele:

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

Estou executando a configuração padrão do Docker , ou seja, Eu não mudei nenhum arquivo /etc relacionado a este serviço.

Qual poderia ser o problema aqui?

    
por l0b0 01.01.2016 / 14:00

9 respostas

30

Você precisa adicionar-se ao grupo docker e ativar o grupo (fazendo logout e novamente ou executando newgrp docker ) para executar os comandos docker . A mensagem de erro é simplesmente enganosa.

    
por 01.01.2016 / 14:00
22

Esta pergunta já foi respondida, mas aqui está uma informação adicional.

Não importa se você está no Arch ou em outra distribuição como o Fedora ou o Ubuntu, o Docker usa um arquivo de soquete para se comunicar. Quando você executa os comandos docker , ele usa esse soquete para conversar com o daemon do Docker. É claro que o daemon deve estar em execução (e é frequentemente desativado por padrão), mas se o usuário não puder acessar o soquete, ele não poderá se comunicar com o daemon também.

Você primeiro instalaria o Docker a partir do repositório da distribuição. Algumas pessoas baixam um script de instalação e o canalizam para um shell ( curl ... | sh ), mas é recomendado instalá-lo a partir do repositório para que ele possa ser atualizado facilmente.

Arch:

# pacman -S docker

Fedora:

# dnf install docker

Como mencionado acima, o daemon pode estar desabilitado por padrão. Se você quiser usar o Docker, o daemon deve estar em execução.

Habilite-o (para que ele seja iniciado na inicialização):

# systemctl enable docker

Inicie agora (ou reinicie):

# systemctl start docker

Agora, por padrão (se o grupo de estivadores estiver ausente), o soquete do Docker é de propriedade de root:

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

É por isso que um usuário comum não pode falar com o daemon do docker. Um usuário comum não possui permissões suficientes para acessar o soquete. Não é possível acessar o daemon, portanto, ele supõe que ele não está sendo executado e mostra esse erro: Cannot connect to the Docker daemon. Is the docker daemon running on this host?

É por isso que muitas pessoas simplesmente iniciam todos os comandos do Docker como root, usando sudo . Mas, como descrito na outra resposta, o Docker tem seu próprio mecanismo para isso, portanto, usar o sudo não é necessário.

Idealmente, um grupo chamado docker é criado ao instalar o Docker. No entanto, se esse grupo não existir quando o daemon for iniciado, o arquivo de soquete será de propriedade de root.

Em alguns casos, esse grupo costumava ter um nome diferente, como dockerroot no Fedora . Verifique grep docker /etc/group para ver se existe tal grupo no seu sistema. Se você já estiver usando esse grupo (seu usuário está nele), você precisaria configurar o Docker para usá-lo:

Em /etc/sysconfig/docker , adicione -G dockerroot (nota: é uma solução alternativa, não a melhor solução):

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

Após reiniciar o daemon, seu usuário poderá acessar o soquete:

# systemctl restart docker
# ls -la /var/run/docker.sock
srw-rw---- 1 root dockerroot 0 Apr 28 17:32 /var/run/docker.sock

Caso contrário, o modo oficial seria usar o grupo chamado docker . Se existir, o Docker irá utilizá-lo automaticamente, ou seja, definir o grupo do soquete para esse grupo. Se não existir, tudo o que você precisa fazer é criá-lo e reiniciar o daemon:

# groupadd docker
# systemctl restart docker

O arquivo de soquete pertencerá a esse grupo:

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

Seu usuário deve estar no grupo docker para poder acessar o soquete:

# usermod -aG docker (user)

Você pode ter que sair e fazer login novamente (ou su - (user) ), executar id para ver se você está no grupo.

Você pode usar o Docker sem sudo / root:

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

Finalmente, uma palavra de aviso. Somente usuários confiáveis devem ter permissão para controlar seu daemon do Docker . Consulte o link .
(Mas, claro, o mesmo vale para o sudo - somente usuários confiáveis devem estar no grupo wheel .)

    
por 28.04.2016 / 18:50
2

sudo usermod -aG docker [username]

faça o logout e faça login novamente

    
por 11.05.2016 / 06:26
1

Depois de fazer algumas pesquisas sobre como resolver esse problema no meu sistema Linux, pensei em escrever essa resposta. Aqui está o que eu fiz para corrigir o problema.

No Fedora 22

Instalando o Docker:

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

Depois de instalar o Docker:

Um usuário precisa ser adicionado ao grupo de encaixe.

$> sudo usermod -aG docker

O daemon do docker precisa ser iniciado

$> sudo service docker start

Você pode configurar o daemon para iniciar na inicialização

$> sudo chkconfig docker on

Você pode verificar se o serviço de encaixe está sendo executado

$> service docker status

E um último teste final

$> docker run hello-world
    
por 24.02.2016 / 17:23
1

Se você estiver usando o Fedora 23 ou a variante Redhat, edite /etc/sysconfig/docker e modifique o seguinte

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

Reinicie a janela de encaixe.

Certifique-se de adicionar este grupo ao sistema e adicione-se ao grupo.

    
por 21.09.2016 / 15:31
1

Esse comando funciona para mim

sudo grep dwalsh /etc/sudoers

alias docker="sudo /usr/bin/docker"

Encontrei a solução nesta página se você precisar de mais documentação. Por que não permitimos que usuários não-root executem o Docker no CentOS, Fedora ou RHEL

    
por 09.12.2016 / 20:57
0

Eu também tive o mesmo problema. O problema estava nos sockets alocados para o docker-daemon e o docker-client.

  1. Primeiro, a permissão não foi definida para o docker-client no docker.sock. Você pode defini-lo usando sudo usermod -aG docker $USER

  2. Em seguida, verifique seu arquivo bash em que o docker-client está sendo executado. Para mim, foi definido como 0.0.0.0:2375, enquanto o docker-daemon estava sendo executado no unix socket. (Foi definido no arquivo de configuração do dockerd).

  3. Apenas comente a linha ofensiva e ela funcionará bem.

  4. Mas se você quiser fazê-lo funcionar na porta TCP ao invés do socket unix, então mude o arquivo de configuração do dockerd, configure-o para 0.0.0.0.2375, e mantenha a linha no bash como está se presente ou defina-o como 0.0.0.0:2375.

por 09.09.2016 / 09:14
0

Se você iniciou o seu mecanismo docker com: docker service sudo start

você não pode se conectar com o usuário normal, mesmo que tenha se adicionado ao grupo "docker".

Você pode simplesmente pará-lo com: sudo docker service stop

e inicie-o como um usuário normal: início da janela de serviço

    
por 21.12.2016 / 03:54
0

Estes são os passos que segui para corrigir o seguinte

$ docker info
Cannot connect to the Docker daemon at 
tcp://localhost:2375/usr/lib/systemd/system/docker.socket. Is the docker daemon running?
  1. Adicione seu auto ao grupo de encaixe

    usermod -aG docker $USER

  2. Corrigir permissões no docker socker e no comando.

    sudo chgrp docker /usr/bin/docker e 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. Adicionar variáveis ao ambiente de configuração para o comando do docker

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

  4. Rest Docker

    sudo systemctl restart docker

por 23.07.2017 / 11:49