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

29

O serviço 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, não alterei nenhum /etcarquivo relacionado a este serviço.

Qual poderia ser o problema aqui?

l0b0
fonte

Respostas:

36

Você precisa se adicionar ao dockergrupo e ativar o grupo (efetuando logoff e logon novamente ou executando newgrp docker) para executar dockercomandos. A mensagem de erro é simplesmente enganosa.

l0b0
fonte
11
Não é realmente enganoso. Não foi possível conectar-se ao daemon do docker. "o daemon está rodando?" foi apenas um palpite.
Bratchley
2
sudo gpasswd -a alex docker #
Alex Punnen /
11
sudo gpasswd -a janela de encaixe $ USER # Funciona para qualquer nome de usuário
priomsrb
Eu fiz isso e ainda não funcionou. Executando o sudo systemctl start dockerconserto, o daemon realmente não estava funcionando ...
nakamin 24/09
32

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 Ubuntu, o Docker usa um arquivo de soquete para se comunicar. Quando você executa dockercomandos, ele usa esse soquete para conversar com o daemon do Docker. Obviamente, o daemon deve estar em execução (e geralmente é desativado por padrão), mas se o usuário não puder acessar o soquete, também não poderá se comunicar com o daemon.

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

Arco:

# pacman -S docker

Fedora:

# dnf install docker

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

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

# systemctl enable docker

Inicie agora (ou reinicie):

# systemctl start docker

Agora, por padrão (se o grupo estivador estiver ausente), o soquete do Docker pertence à raiz:

# 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 conversar com o daemon do docker. Um usuário comum não tem permissões suficientes para acessar o soquete. Não é possível acessar o daemon, portanto, assume que não está sendo executado e mostra este 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, o uso do 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 pertencerá à raiz.

Em alguns casos, esse grupo costumava ter um nome diferente, como dockerrootno Fedora . Verifique grep docker /etc/groupse existe um grupo no seu sistema. Se você já estiver usando esse grupo (seu usuário está nele), será necessário 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, a maneira oficial seria usar o grupo chamado docker. Se existir, o Docker o utilizará automaticamente, ou seja, defina o grupo do soquete para esse grupo. Se não existir, tudo 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 dockergrupo para poder acessar o soquete:

# usermod -aG docker (user)

Pode ser necessário sair e fazer login novamente (ou su - (user)), correr idpara ver se você está no grupo.

Você pode usar o Docker sem o 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 https://docs.docker.com/engine/security/security/ .
(Mas é claro, o mesmo se aplica ao sudo - apenas usuários confiáveis ​​devem estar no wheelgrupo.)

basic6
fonte
11
Isso não parece responder à pergunta original.
precisa saber é
4
@ l0b0: Bem, eu queria explicar por que isso está acontecendo, esperando que seja útil para alguém. O comando usermod que adiciona o usuário ao grupo está oculto na parte central da resposta. Se você não encontrar esta resposta útil, informe-me para que eu possa excluí-la.
usar o seguinte comando
4
Sim, ele responde e explica a solução para o Arch.
Kodeart 25/05
Eu fiz tudo isso e ainda estou encontrando o problema mencionado pelo OP. Nenhuma das etapas relacionadas à permissão resolveu o problema.
Mpsyd
3

sudo usermod -aG docker [nome de usuário]

depois saia e entre novamente

user2167582
fonte
1

Depois de fazer algumas pesquisas para 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 janelas 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 docker está em execução

$> service docker status

E uma última verificação final

$> docker run hello-world
Ronald Weidner
fonte
+1 para um exemplo completo, embora muitos desses comandos não sejam aplicáveis ​​à minha situação (instalação usando pacman, usando em systemctlvez de service+ chkconfig).
L0b0
1

Se você estiver usando o Fedora 23 ou a variante Redhat, edite /etc/sysconfig/dockere 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 adicionar-se ao grupo.

Stuart James
fonte
1

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

você não pode se conectar com o usuário normal, mesmo que tenha se adicionado ao grupo 'janela de encaixe'.

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

e inicie-o como um usuário normal: docker de serviço iniciar

Raymond
fonte
Eu não precisava adicionar usuário docker groupaté agora. sudo service starttrabalhou para mim. No entanto, observará se há algo novo.
stupidnetizen
0

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

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

  2. Em seguida, verifique seu arquivo bash onde o docker-client está sendo executado. Para mim, foi definido como 0.0.0.0:2375, enquanto o docker-daemon estava sendo executado no soquete unix. (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 em vez do soquete unix, altere o arquivo de configuração do dockerd, defina-o como 0.0.0.0.2375 e mantenha a linha no bash como está presente, ou defina-a como 0.0. 0,0: 2375.

Nilesh Kande
fonte
0

Estas são as etapas 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 você mesmo ao grupo de janelas de encaixe

    usermod -aG docker $USER

  2. Corrija as permissões no docker socker e no comando.

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

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

  4. Rest Docker

    sudo systemctl restart docker

nelaaro
fonte