Não é possível fazer ping / acessar o host do docker em 172.17.0.1 de dentro de um contêiner

Meu host docker escuta em 172.17.0.1.

Posso enrolá-lo na máquina host, mas quando eu enrolo o mesmo ip/porta de dentro do contêiner, recebo tempo limite.

Posso fazer ping em qualquer coisa, desde a withing do contêiner, mas não consigo acessar o host.

O que estou perdendo ?

Container é a imagem Jenkins executada por este comando:

docker run -d --name jenkins -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.222.3

Executando curl no host:

enrolar http://172.17.0.1:2375 página não encontrada-

Correndo onda de withing o docker vai acabar.

enrolar http://172.17.0.1:2375 curl: (7) Falha ao conectar-se à porta 172.17.0.1 2375: a conexão expirou

Isso geralmente ocorre porque o iptables no host está bloqueando o acesso das redes docker. Você pode olhar para iptables -S ou iptables -nvL para ver suas regras atuais.


Dito isso, se você abrir a API do docker, precisará ter cuidado com quem pode acessar essa API. Usar a porta 2375 normalmente significa que você não configurou mTLS, consulte guia do docker para configurar mTLS. Isso significa que qualquer pessoa com acesso à porta pode enviar chamadas de API, o que significa que um usuário local não privilegiado, ou qualquer outro contêiner, tem a capacidade de obter root em seu host. No seu caso, isso é tão fácil quanto:

docker -H tcp://172.17.0.1:2375 run -it --rm --privileged --pid host debian nsenter -t 1 -m -u -n -i bash

A solução recomendada é usar DinD para executar o mecanismo docker dentro de um contêiner ou compartilhar o soquete docker como uma montagem de arquivo/volume com o acesso UID/GID apropriado ao arquivo. Isso garante apenas que o contêiner tenha acesso ao mecanismo docker, em vez de todos os usuários e qualquer contêiner em execução no host. Para lidar com os problemas de acesso UID/GID com arquivos montados em um volume, fiz isso especificamente para imagens Jenkins em meu jenkins-docker repo, e há uma solução mais genérica no meu fix-perms script no meu repositório docker-base.

@ BMitch-eu descobri - mas você também acertou (você deve postá-lo como uma resposta, aceitarei e excluirei o meu) o iptables bloqueou o acesso. uma vez que eu abri - lo-funcionou como esperado.

Como o firewall é configurado no host? Inclua a saída iptables-S em sua pergunta.

@ BMitch - você estava certo . iptables bloqueou o acesso. você pode postar isso como uma resposta.

Além disso, expor o soquete docker à rede torna trivial hackear o servidor. Qualquer pessoa com acesso à rede, seja um usuário local não privilegiado ou remoto, pode executar docker-h tcp://172.17.0.1:2375 run-it --rm --privileged --PID host debian nsenter-t 1-m-u-n-i bash para obter root. Dê acesso ao arquivo de soquete com permissões de grupo e uma montagem de volume ou configure mTLS. Redirecting…