Para docker-composeusar la red de puente para crear una red privada entre contenedores, la solución aceptada docker0no funciona porque la interfaz de salida de los contenedores no lo es, docker0sino que es una identificación de interfaz generada 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
Desafortunadamente, esa identificación aleatoria no es predecible y cambiará cada vez que componer tenga que recrear la red (por ejemplo, en un reinicio del host). Mi solución a esto es crear la red privada en una subred conocida y configurarla iptablespara aceptar ese rango:
Redactar fragmento de archivo:
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"
Puede cambiar la subred si su entorno lo requiere. Seleccioné arbitrariamente 192.168.32.0/20usando docker network inspectpara ver lo que se estaba creando por defecto.
Configure iptablesen el host para permitir la subred privada como fuente:
$ iptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPT
Esta es la iptablesregla más simple posible . Es posible que desee agregar otras restricciones, por ejemplo, por puerto de destino. No olvides mantener tus reglas de iptables cuando estés contento de que estén funcionando.
Este enfoque tiene la ventaja de ser repetible y, por lo tanto, automatizable. Uso el templatemódulo de ansible para implementar mi archivo de redacción con sustitución de variables y luego uso los módulos iptablesy shellpara configurar y mantener las reglas del firewall, respectivamente.