Per docker-composeutilizzare la rete bridge per creare una rete privata tra contenitori, la soluzione accettata utilizzando docker0non funziona perché l'interfaccia di uscita dai contenitori non è docker0ma è 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 iptablesper 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/20usando docker network inspectper vedere cosa veniva creato per impostazione predefinita.
Configurare iptablessull'host per consentire la sottorete privata come sorgente:
$ iptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPT
Questa è la iptablesregola 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 templatemodulo di ansible per distribuire il mio file di composizione con sostituzione variabile e quindi uso i moduli iptablese shellper configurare e mantenere le regole del firewall, rispettivamente.