Para docker-compose
usar la red de puente para crear una red privada entre contenedores, la solución aceptada docker0
no funciona porque la interfaz de salida de los contenedores no lo es, docker0
sino 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 iptables
para 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/20
usando docker network inspect
para ver lo que se estaba creando por defecto.
Configure iptables
en el host para permitir la subred privada como fuente:
$ iptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPT
Esta es la iptables
regla 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 template
módulo de ansible para implementar mi archivo de redacción con sustitución de variables y luego uso los módulos iptables
y shell
para configurar y mantener las reglas del firewall, respectivamente.