Para docker-compose
usar a rede em ponte para criar uma rede privada entre contêineres, a solução aceita docker0
não funciona porque a interface de saída dos contêineres não é, docker0
mas sim um ID de interface gerado aleatoriamente, como:
$ ifconfig
br-02d7f5ba5a51: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.32.1 netmask 255.255.240.0 broadcast 192.168.47.255
Infelizmente, esse ID aleatório não é previsível e será alterado sempre que a composição for necessária para recriar a rede (por exemplo, em uma reinicialização do host). Minha solução para isso é criar a rede privada em uma sub-rede conhecida e configurar iptables
para aceitar esse intervalo:
Redigir fragmento de arquivo:
version: "3.7"
services:
mongodb:
image: mongo:4.2.2
networks:
- mynet
# rest of service config and other services removed for clarity
networks:
mynet:
name: mynet
ipam:
driver: default
config:
- subnet: "192.168.32.0/20"
Você pode alterar a sub-rede se o seu ambiente exigir. Selecionei arbitrariamente 192.168.32.0/20
usando docker network inspect
para ver o que estava sendo criado por padrão.
Configure iptables
no host para permitir a sub-rede privada como uma fonte:
$ iptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPT
Esta é a iptables
regra mais simples possível . Você pode querer adicionar outras restrições, por exemplo, pela porta de destino. Não se esqueça de manter as regras do iptables quando estiver feliz que elas estejam funcionando.
Essa abordagem tem a vantagem de ser repetível e, portanto, automatizável. Uso o template
módulo da ansible para implantar meu arquivo de composição com substituição de variável e, em seguida, uso os módulos iptables
e shell
para configurar e manter as regras de firewall, respectivamente.