Masalah koneksi antar container Docker sering muncul di OpenWRT, padahal network dan layanan sudah dikonfigurasi dengan benar. Berikut solusi lengkapnya:
📋 LINGKUNGAN
- OpenWRT x86
- Docker + Docker Compose
- Jaringan: Bridge (docker0 atau custom bridge)
- Contoh layanan: Aplikasi & Database (misal Nextcloud & PostgreSQL)
🚨 GEJALA AWAL
- Semua container berjalan normal ( docker ps menunjukkan status Up )
- IP container ter-assign dengan benar di subnet yang sama
- Ping antar container tidak stabil (kadang berhasil, kadang gagal)
- Akses ke layanan di container lain muncul error Connection refused
🔍 PEMERIKSAAN AWAL
Cek Status Network Docker
bash
docker network ls
docker network inspect <nama-network-container>
Hasil yang diharapkan:
- Container berada di subnet yang sama (misal 172.18.0.0/16 )
- Alamat IP valid dan DNS container berfungsi dengan baik
Kesimpulan: Network Docker terbentuk dengan benar, masalah bukan dari konfigurasi jaringan Docker.
Uji Koneksi Via Network Namespace
bash
docker run --network container:<nama-container-target> busybox ping <nama-container-target>
Hasil yang diharapkan:
- Ping sukses 100% dengan latensi < 1 ms
Kesimpulan: Routing antar container sebenarnya berjalan, penghalang ada di level firewall.
🎯 PENYEBAB UTAMA
OpenWRT secara default tidak mengizinkan forwarding trafik antar antarmuka docker0 atau bridge custom. Iptables OpenWRT memblokir lalu lintas internal container meskipun Docker network sudah benar.
Periksa policy forwarding dengan perintah:
bash
iptables -L FORWARD -n
✅ CARA PERBAIKI
Langkah 1: Izinkan Forwarding untuk Docker
bash
# Izinkan trafik antar container di docker0
iptables -I FORWARD -i docker0 -o docker0 -j ACCEPT
# Izinkan trafik masuk dan keluar dari docker0
iptables -I FORWARD -i docker0 -j ACCEPT
iptables -I FORWARD -o docker0 -j ACCEPT
Langkah 2: Hapus Isolasi Docker (Jika Ada)
bash
iptables -D DOCKER-ISOLATION-STAGE-1 -j DROP 2>/dev/null
iptables -D DOCKER-ISOLATION-STAGE-2 -j DROP 2>/dev/null
Langkah 3: Restart Layanan Docker
bash
/etc/init.d/dockerd restart
✨ HASIL SETELAH PERBAIKI
- Container bisa saling mengakses port layanan
- Error Connection refused hilang
- Docker bridge berfungsi normal seperti di sistem Linux lainnya
⚠️ CATATAN PENTING
1. Khusus OpenWRT: Masalah ini tidak terjadi di distribusi Linux seperti Ubuntu/Debian yang secara default mengizinkan forwarding.
2. Rule Sementara: Rule iptables akan hilang setelah reboot. Untuk membuatnya tetap ada:
- Edit file /etc/firewall.user
- Tambahkan semua perintah iptables dari Langkah 1 dan 2 di akhir file
- Simpan lalu restart firewall:
bash
/etc/init.d/firewall restart
📌 KESIMPULAN
- Docker network tidak rusak
- Masalah bukan dari DNS, port, atau konfigurasi aplikasi
- Akar masalah: Policy forwarding iptables default di OpenWRT
- Solusi: Izinkan lalu lintas untuk antarmuka Docker secara manual
