Untuk docker-composemenggunakan jembatan jaringan untuk membuat jaringan pribadi antara kontainer, solusi yang diterima menggunakan docker0tidak berfungsi karena antarmuka jalan keluar dari wadah tidak docker0tetapi 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 iptablesuntuk 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/20dengan menggunakan docker network inspectuntuk melihat apa yang sedang dibuat secara default.
Konfigurasikan iptablespada 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 templatemodul ansible untuk menyebarkan file penulisan saya dengan substitusi variabel dan kemudian menggunakan modul iptablesdan shelluntuk mengkonfigurasi dan bertahan aturan firewall, masing-masing.