Eu tenho dois contêineres em execução em uma rede docker bridge (isso pode ser o padrão docker0
ou uma ponte definida pelo usuário). Se eu publicar portas de um contêiner, o outro contêiner não poderá acessar essas portas publicadas por meio do endereço IP do host.
Exemplo:
$ docker run --detach -p 80:80 nginx
$ docker run --rm -it centos \
/bin/bash -c "yum install -y wget && wget http://${HOST_IP}"
...
Connecting to ${HOST_IP}:80... failed: No route to host.
No exemplo acima, o servidor nginx pode ser acessado a partir do host e de outros servidores na rede (ou internet). No entanto, o contêiner docker centos, que possui acesso total à rede, não consegue se conectar à porta 80 no host. Todas as portas no host podem ser acessadas sem problemas, desde que não estejam em uma ponte de rede de encaixe.
Encontrei completamente a desabilitação de firewalls (firewalld e iptables) e a reinicialização do serviço de encaixe permite acesso, por isso estou razoavelmente certo de que esse é um problema de firewall. Eu encontrei este docker libnetwork PR , mas ele não viu nenhuma atividade em 6 meses.
Estou sentindo falta de algo fundamental sobre o docker aqui? Dois contêineres na mesma rede de ponte não podem se comunicar por uma porta de publicação? Devo acrescentar que, se eu tentar acessar a porta nginx diretamente usando o IP da rede privada interna (172.X.X.X) de dentro do contêiner centos, ela funcionará. É somente ao conectar-se à porta do host publicada.
Eu descobri que o acima acontece com as últimas imagens centos (7.4.1708) e fedora (28).