Untuk docker-compose
menggunakan jembatan jaringan untuk membuat jaringan pribadi antara kontainer, solusi yang diterima menggunakan docker0
tidak berfungsi karena antarmuka jalan keluar dari wadah tidak docker0
tetapi sebaliknya itu adalah antarmuka yang dihasilkan secara acak, seperti:
$ 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
Sayangnya id acak itu tidak dapat diprediksi dan akan berubah setiap kali penulisan harus membuat ulang jaringan (mis. Pada host reboot). Solusi saya untuk ini adalah membuat jaringan pribadi di subnet yang dikenal dan mengkonfigurasi iptables
untuk menerima rentang itu:
Tulis cuplikan 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"
Anda dapat mengubah subnet jika lingkungan Anda mengharuskannya. Saya secara sewenang-wenang memilih 192.168.32.0/20
dengan menggunakan docker network inspect
untuk melihat apa yang sedang dibuat secara default.
Konfigurasikan iptables
pada host untuk mengizinkan subnet pribadi sebagai sumber:
$ iptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPT
Ini adalah aturan yang paling sederhana iptables
. Anda mungkin ingin menambahkan batasan lain, misalnya dengan port tujuan. Jangan lupa untuk mempertahankan aturan iptables Anda saat Anda senang mereka sedang bekerja.
Pendekatan ini memiliki keuntungan karena dapat diulang dan karena itu dapat diautomatisasi. Saya menggunakan template
modul ansible untuk menyebarkan file penulisan saya dengan substitusi variabel dan kemudian menggunakan modul iptables
dan shell
untuk mengkonfigurasi dan bertahan aturan firewall, masing-masing.