Per docker-compose
utilizzare la rete bridge per creare una rete privata tra contenitori, la soluzione accettata utilizzando docker0
non funziona perché l'interfaccia di uscita dai contenitori non è docker0
ma è invece un ID di interfaccia generato casualmente, come:
$ 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
Sfortunatamente quell'ID casuale non è prevedibile e cambierà ogni volta che compose deve ricreare la rete (ad es. Al riavvio dell'host). La mia soluzione a questo è quella di creare la rete privata in una sottorete conosciuta e configurare iptables
per accettare quell'intervallo:
Componi lo snippet di file:
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"
È possibile modificare la sottorete se l'ambiente lo richiede. Ho scelto arbitrariamente 192.168.32.0/20
usando docker network inspect
per vedere cosa veniva creato per impostazione predefinita.
Configurare iptables
sull'host per consentire la sottorete privata come sorgente:
$ iptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPT
Questa è la iptables
regola più semplice possibile . Potresti voler aggiungere altre restrizioni, ad esempio per porta di destinazione. Non dimenticare di persistere nelle regole di iptables quando sei felice che funzionino.
Questo approccio ha il vantaggio di essere ripetibile e quindi automatizzabile. Uso il template
modulo di ansible per distribuire il mio file di composizione con sostituzione variabile e quindi uso i moduli iptables
e shell
per configurare e mantenere le regole del firewall, rispettivamente.