Isolasi Network #
Salah satu kekuatan utama Docker adalah kemampuannya melakukan isolasi, tidak hanya pada proses dan filesystem, tetapi juga pada jaringan (network isolation). Banyak developer menggunakan Docker setiap hari tanpa benar-benar memahami bagaimana container bisa saling terisolasi di level network, padahal konsep ini sangat krusial untuk keamanan, stabilitas, dan desain arsitektur aplikasi.
Untuk mempermudah pemahaman, perhatikan diagram konseptual berikut:
+--------------------------- Host OS ----------------------------+
| |
| +------------+ +------------+ +------------+ |
| | Container A| | Container B| | Container C| |
| |------------| |------------| |------------| |
| | eth0 | | eth0 | | eth0 | |
| | 172.18.0.2 | | 172.18.0.3 | | 172.19.0.2 | |
| +-----|------+ +-----|------+ +-----|------+ |
| | | | |
| +-----------------------+-----------------------+ |
| Docker Bridge (br-xxx) Docker Bridge (br-yyy)|
| 172.18.0.0/16 172.19.0.0/16 |
| |
+----------------------------------------------------------------+
Diagram di atas menunjukkan bahwa container dapat berada di network yang berbeda, meskipun berjalan di host yang sama. Inilah inti dari network isolation di Docker.
Apa Itu Network Isolation? #
Network isolation adalah mekanisme untuk memastikan bahwa satu container tidak bisa berkomunikasi secara bebas dengan container lain, kecuali memang diizinkan.
Di Docker, network isolation dicapai dengan kombinasi:
- Linux network namespace
- Virtual Ethernet (veth pair)
- Linux bridge
- iptables / nftables
- Docker network driver
Setiap container secara default berjalan dalam network namespace terpisah, artinya:
- Memiliki interface network sendiri
- Routing table sendiri
- IP address sendiri
- Tidak bisa “melihat” traffic container lain secara langsung
Network Namespace: Fondasi Utama #
Saat Docker membuat container, Docker juga membuat network namespace baru.
Di dalam network namespace ini:
eth0hanya milik container tersebut- Loopback (
lo) terisolasi - Tidak berbagi port atau IP dengan container lain
Secara konsep:
Host Network Namespace
│
├── Container A Namespace (eth0: 172.18.0.2)
├── Container B Namespace (eth0: 172.18.0.3)
└── Container C Namespace (eth0: 172.19.0.2)
Tanpa mekanisme tambahan (bridge atau routing), namespace ini tidak saling terhubung.
Peran Docker Network Driver #
Docker menyediakan beberapa network driver yang mengatur bagaimana container saling terhubung:
1. Bridge (default) #
- Setiap container mendapat IP private
- Terhubung melalui Linux bridge
- Container hanya bisa berkomunikasi jika berada di bridge yang sama
Isolasi terjadi karena:
- Bridge berbeda = subnet berbeda
- iptables membatasi traffic antar bridge
2. Host #
- Container tidak terisolasi dari network host
- Tidak ada network namespace terpisah
- Port container = port host
⚠️ Driver ini menghilangkan network isolation
3. None #
- Container tidak memiliki network sama sekali
- Hanya loopback (
lo) - Isolasi paling ketat
4. Overlay #
- Digunakan di Docker Swarm / Kubernetes
- Isolasi terjadi antar service dan network virtual
- Mendukung multi-host
5. Macvlan #
- Container mendapat IP langsung dari jaringan fisik
- Isolasi terjadi di level MAC address
Bagaimana Container Bisa Saling Terhubung? #
Container hanya bisa berkomunikasi jika:
- Berada di network Docker yang sama, atau
- Ada routing / port mapping yang eksplisit
Contoh:
docker network create app-network
docker run -d --name backend --network app-network backend-image
docker run -d --name frontend --network app-network frontend-image
Dalam kondisi ini:
frontendbisa mengaksesbackend- Container di network lain tidak bisa mengakses backend
Inilah bentuk network isolation yang disengaja.
Port Mapping dan Dampaknya ke Isolasi #
Ketika menggunakan port mapping:
docker run -p 8080:80 nginx
Yang terjadi:
- Port 80 container diekspos ke host
- Host membuka akses ke container
- Isolasi network berkurang, tapi masih terkontrol
Diagram sederhananya:
Internet
│
▼
Host:8080 ──> Container:80
Tanpa -p, container tetap terisolasi dari dunia luar.
Network Isolation dan Keamanan #
Network isolation berperan besar dalam keamanan:
- Mencegah lateral movement antar container
- Mengurangi blast radius saat satu service compromised
- Memungkinkan prinsip least privilege networking
Best practice:
- Pisahkan network berdasarkan domain aplikasi
- Jangan gunakan
--network hosttanpa alasan kuat - Gunakan
internal: truepada Docker network jika perlu
networks:
internal_net:
internal: true
Network Isolation di Docker Compose #
Docker Compose secara default sudah menerapkan isolasi:
- Setiap
docker-compose.ymlmembuat network sendiri - Service hanya bisa berkomunikasi dalam project yang sama
Contoh:
services:
db:
image: postgres
api:
image: my-api
Secara implisit:
project_default_network
├── db
└── api
Service dari compose lain tidak bisa masuk tanpa konfigurasi tambahan.
Kesalahan Umum Terkait Network Isolation #
Beberapa kesalahan yang sering terjadi:
- Menganggap semua container otomatis bisa saling ping
- Menggunakan
host networkuntuk kemudahan - Meletakkan semua service dalam satu network besar
- Mengekspos port database ke host
Semua ini melemahkan isolasi.
Kapan Network Isolation Sangat Penting? #
Network isolation menjadi krusial ketika:
- Menjalankan aplikasi multi-tenant
- Mengelola microservices
- Menangani data sensitif
- Menjalankan container pihak ketiga
Tanpa isolasi yang baik, Docker hanya menjadi “VM ringan” tanpa proteksi yang memadai.
Penutup #
Network isolation di Docker bukan fitur tambahan, tetapi fondasi utama dari desain container.
Dengan memahami:
- Network namespace
- Docker network driver
- Cara container saling terhubung
Anda bisa:
- Mendesain arsitektur yang lebih aman
- Menghindari konfigurasi berbahaya
- Menggunakan Docker secara lebih profesional
Docker bukan hanya soal menjalankan aplikasi, tapi juga mengontrol bagaimana aplikasi itu berkomunikasi — dan network isolation adalah kuncinya.