Sua saída strace
sugere strongmente que o cliente do Docker não pode falar com o daemon do Docker, que por padrão cria um soquete em /var/run/docker.sock
.
O daemon do Docker deve ser um serviço do sistema (no systemd, localizado em /lib/systemd/system/docker.service
com a configuração de soquete em /lib/systemd/system/docker.socket
), mas pode ser iniciado independentemente usando /usr/bin/docker daemon
seguido por quaisquer opções opcionais.
Você deve strace
do daemon em vez do cliente .
Usando strace
no daemon do Docker
-
Obtenha o ID do processo do seu daemon do Docker. Qualquer um desses comandos armazenaria o PID em uma variável chamada
$DOCKER_PID
.-
Diretamente do soquete:
DOCKER_PID=$(sudo lsof -Ua /var/run/docker.sock | awk '/^docker/ {print $2}' | head -1)
-
systemd:
DOCKER_PID=$(systemctl show -p MainPID docker.service | awk -F'=' '{print $NF}')
-
Outro:
DOCKER_PID=$(ps aux | grep 'docker daemon' | grep -v 'grep' | awk '{print $2}' | head -1)
-
-
Use
strace
no daemon do Docker, agora que você tem o PID:sudo strace -vvvfts1000 -p $DOCKER_PID
-
Em um terminal separado, execute um comando que normalmente é interrompido no cliente do Docker.
docker version
-
Assista o
strace
no daemon do Docker para testemunhar o que acontece a partir da extremidade de escuta do soquete.
Interpretando a strace
output
Veja o que o daemon deve fazer quando você executa docker version
:
-
Leia o que o cliente enviou:
[pid 14291] 12:34:36 <... read resumed> "GET /v1.22/version HTTP/1.1\r\nHost: \r\nUser-Agent: Docker-Client/1.10.3 (linux)\r\n\r\n", 4096) = 81
-
Colete informações sobre o sistema:
[pid 14291] 12:34:36 uname({sysname="Linux", nodename="node51", release="4.4.0-22-generic", version="#40-Ubuntu SMP Thu May 12 22:03:46 UTC 2016", machine="x86_64", domainname="(none)"}) = 0
-
Responder ao cliente com informações sobre o sistema:
[pid 14291] 12:34:36 write(3, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nServer: Docker/1.10.3 (linux)\r\nDate: Mon, 13 Jun 2016 17:34:36 GMT\r\nContent-Length: 194\r\n\r\n{\"Version\":\"1.10.3\",\"ApiVersion\":\"1.22\",\"GitCommit\":\"20f81dd\",\"GoVersion\":\"go1.6.1\",\"Os\":\"linux\",\"Arch\":\"amd64\",\"KernelVersion\":\"4.4.0-22-generic\",\"BuildTime\":\"Wed, 20 Apr 2016 14:19:16 -0700\"}\n", 334) = 334
-
O cliente (
docker version
) exibe as informações retornadas pelo servidor:Server: Version: 1.10.3 API version: 1.22 Go version: go1.6.1 Git commit: 20f81dd Built: Wed, 20 Apr 2016 14:19:16 -0700 OS/Arch: linux/amd64
Em seu problema, seu daemon do Docker aparentemente não executou a etapa 3 porque, se tivesse, o cliente teria visto a resposta, mas o cliente não recebeu nada.
Você deve ser capaz de usar essas informações para descobrir por que o daemon do Docker não está respondendo às solicitações do cliente.
Causas possíveis
As informações que você forneceu não são suficientes para identificar a causa da incapacidade do seu cliente Docker de obter uma resposta do daemon do Docker, mas aqui estão algumas dicas:
- O daemon do Docker está em execução?
- O que acontece se você iniciar o daemon do Docker em primeiro plano ?:
sudo docker daemon
- O daemon do Docker está ouvindo o soquete em
/var/run/docker.sock
?sudo lsof -p $DOCKER_PID
deve mostrar "/var/run/docker.sock type=STREAM
" em algum lugar. - Existem políticas de segurança que bloqueiam algo no cliente ou daemon? No Linux, o SELinux e o AppArmor podem causar confusão, pois as políticas definidas para eles podem negar o acesso.
- No
strace
do daemon, se você não obtiver uma solicitação HTTP GET do cliente, isso significa que o servidor não recebeu nada do soquete. - Se você fez
docker version
e viu nostrace
do daemon que não havia chamadauname()
, o daemon nem tentou buscar informações sobre o sistema. - Se você vir a chamada
write()
nostrace
do daemon, isso significa que o daemon respondeu, mas o cliente não o viu. - Talvez este seja um problema conhecido na versão mais antiga do Docker que você está usando. Tente atualizar.