Networking in Docker
secara default setiap container akan terisolasi dari yang lainnya sehingga jika antar container ingin berkomunikasi maka diperlukan pembuatan network.
untuk mengecek network yang telah terbuat ketika pertama kali install docker engine :
docker network ls

Basic Network
Docker menyediakan fitur-fitur untuk mengelola jaringan antara kontainer dan antara kontainer dengan jaringan eksternal. Dengan menggunakan perintah seperti docker network, Anda dapat membuat, memeriksa, dan mengelola jaringan di lingkungan Docker Anda.
Network Type
None Networks
- Container tidak memiliki akses jaringan.
- Sangat terisolasi dan tidak dapat berkomunikasi dengan container lain atau host.
Kapan Digunakan:
- Untuk tugas pemrosesan data lokal atau aplikasi yang tidak memerlukan jaringan.
Perintah:
#create
docker network create --driver none my_none_network
#run
docker run --network my_none_network -d nginxBridge Networks (default)
tipe jaringan Docker default. Saat Anda menjalankan sebuah kontainer tanpa menentukan jaringan, kontainer tersebut akan terhubung ke jaringan bridge default. Jaringan bridge memungkinkan kontainer berkomunikasi satu sama lain, tetapi memisahkan kontainer dari jaringan host.
deskripsi:
- Driver default untuk jaringan di Docker.
- Digunakan untuk menghubungkan container di host yang sama dalam jaringan yang terisolasi.
Kapan Digunakan:
- Untuk aplikasi multi-container yang berjalan di host yang sama.
Fitur:
- Container dapat saling berkomunikasi menggunakan nama atau alias.
- Tidak langsung terhubung dengan jaringan host.
Perintah:
- Membuat jaringan baru di bridge network:
#create
docker network create --driver <network_type> <network_name>
docker network create --driver bridge my_bridge_network
#run
docker run --network my_bridge_network -d nginxHost Networks
Dalam mode ini, kontainer berbagi jaringan dengan hostnya. Ini berguna untuk keperluan tertentu tetapi kurang aman karena kontainer dapat mengakses port di host.
Deskripsi:
- Menghapus isolasi jaringan antara container dan host, sehingga container langsung menggunakan jaringan host.
Kapan Digunakan:
- Untuk aplikasi yang membutuhkan kinerja tinggi atau akses langsung ke jaringan host. seperti aplikasi yang membutuhkan latensi rendah.
Fitur:
- Tidak ada namespace jaringan terpisah; container berbagi alamat IP host.
Perintah:
#create
docker network create --driver host my_host_network
#run
docker run --network my_host_network -d nginxOverlay Networks
Tipe jaringan ini digunakan dalam klaster Docker Swarm untuk memungkinkan kontainer di mesin yang berbeda berkomunikasi satu sama lain.
Deskripsi:
- Digunakan dalam pengaturan Docker Swarm atau Kubernetes untuk menghubungkan container di host yang berbeda.
- Cocok untuk aplikasi terdistribusi.
- Digunakan untuk menghubungkan container yang berjalan di host yang berbeda dalam cluster Docker Swarm.
- Memungkinkan komunikasi antar-host melalui jaringan virtual.
Fitur:
- Menggunakan teknologi tunneling untuk menghubungkan host dalam cluster.
Kapan Digunakan:
- Untuk aplikasi terdistribusi atau cluster multi-host.
Perintah:
#Membuat overlay networ
docker network create --driver overlay my_overlay_network
#Menjalankan container dalam overlay network:
docker service create --network my_overlay_network nginxMacvlan
Deskripsi:
- Menghubungkan container langsung ke jaringan fisik, seolah-olah container adalah perangkat jaringan dengan alamat IP unik.
Kapan Digunakan:
- Untuk aplikasi yang membutuhkan alamat IP unik di jaringan fisik.
Perintah:
docker network create --driver macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 my_macvlan_network
Cara Memilih Driver
Pilih driver berdasarkan kebutuhan aplikasi Anda:
- Bridge: Untuk jaringan container lokal di host yang sama.
- Host: Untuk kinerja tinggi atau aplikasi yang memerlukan jaringan host langsung.
- Overlay: Untuk container di berbagai host dalam cluster Docker Swarm.
- None: Untuk isolasi jaringan total.
- Macvlan: Untuk aplikasi yang memerlukan alamat IP unik di jaringan fisik.
Basic Command
Menampilkan list jaringan
dokcer network lsMenampilkan detail jaringan
docker network inspect <network_name>
docker network inspect bridge
Menambahkan container ke jaringan
docker network connect <network_name> <container_name>Menghapus container dari jaringan
docker network disconnect <network_name> <container_name>Membuat jaringan baru
docker network create <network_name>
Menghapus jaringan
docker network rm <network_name_or_id>Communication between-Container
- Dalam Bridge Network:
- Container dalam satu jaringan bridge dapat saling berkomunikasi menggunakan nama container.
docker network create my_bridge_network
docker run --network my_bridge_network --name container1 -d nginx
docker run --network my_bridge_network --name container2 -it alpine sh
#di dalam container2
ping container1- Melalui Host Network:
- Semua container dapat mengakses jaringan host tanpa pembatasan.
- Dalam Overlay Network:
- Container di host yang berbeda dapat saling berkomunikasi selama berada di overlay network yang sama.
Exposing ports
Membuka Port: Anda dapat memetakan port dari kontainer ke port di host saat menjalankan kontainer menggunakan opsi p atau -publish. Misalnya, docker run -p 8080:80 nginx akan memetakan port 80 dari kontainer ke port 8080 di host.
menjalankan container tanpa jaringan khusus
docker run -d --name my_container nginxBest Practices
- Gunakan Jaringan Bridge untuk Pengaturan Sederhana:
- Misalnya, aplikasi web dan database lokal.
- Gunakan Overlay Network untuk Pengaturan Terdistribusi:
- Cocok untuk cluster Docker Swarm atau Kubernetes.
- Hindari Host Network untuk Keamanan:
- Kecuali benar-benar diperlukan, karena dapat membahayakan isolasi jaringan.
- Gunakan Firewall atau Rules Iptables:
- Untuk mengontrol akses ke jaringan Docker.
- Gunakan Docker DNS:
- Docker DNS otomatis memungkinkan container saling berkomunikasi menggunakan nama container, menghindari hardcoding IP.
Host network not recomended
Jaringan Host Network di Docker sering tidak disarankan karena menghilangkan isolasi jaringan yang merupakan salah satu fitur utama Docker. Berikut adalah alasan dan contoh kasus mengapa Host Network bisa berbahaya:
1. Kurangnya Isolasi
- Masalah: Container yang menggunakan Host Network berbagi IP address dan port namespace dengan host. Artinya, jika container memiliki celah keamanan, penyerang dapat mengeksploitasi celah ini untuk mendapatkan akses langsung ke host.
- Contoh Kasus:
- Anda menjalankan aplikasi web dalam container menggunakan Host Network:
docker run --network host -d myapp
- Jika aplikasi memiliki celah keamanan, penyerang dapat menjalankan serangan Remote Code Execution (RCE) yang memungkinkan mereka mengakses sistem host, karena tidak ada batasan jaringan antara container dan host.
- Anda menjalankan aplikasi web dalam container menggunakan Host Network:
2. Konflik Port
- Masalah: Container menggunakan port yang sama dengan layanan lain di host. Jika ada dua container atau aplikasi di host yang memerlukan port yang sama, akan terjadi konflik port.
- Contoh Kasus:
- Anda menjalankan dua container yang menggunakan Host Network:
docker run --network host -p 80:80 -d nginxdocker run --network host -p 80:80 -d apache
- Karena kedua container berbagi port yang sama (80), hanya satu layanan yang bisa berjalan. Hal ini membuat pengelolaan jaringan menjadi sulit, terutama pada host dengan banyak aplikasi.
- Anda menjalankan dua container yang menggunakan Host Network:

3. Eksposur Langsung ke Jaringan Host
- Masalah: Container dapat langsung mengakses semua antarmuka jaringan host, termasuk jaringan internal yang mungkin bersifat sensitif.
- Contoh Kasus:
- Anda memiliki container yang menjalankan aplikasi dengan Host Network:
docker run --network host -d myapp
- Jika aplikasi diretas, penyerang dapat mengakses jaringan internal (misalnya, jaringan perusahaan) melalui container yang tidak terisolasi.
- Anda memiliki container yang menjalankan aplikasi dengan Host Network:
4. Tidak Cocok untuk Pengaturan Multi-Host
- Masalah: Host Network tidak dapat digunakan untuk container yang berada di host berbeda, sehingga membatasi fleksibilitas pengelolaan jaringan untuk aplikasi terdistribusi.
- Contoh Kasus:
- Anda memiliki aplikasi terdistribusi dengan container di dua host. Menggunakan Host Network pada masing-masing host tidak memungkinkan komunikasi langsung antar-container karena Host Network hanya bekerja dalam konteks host lokal.
5. Risiko Keamanan Lain
- Masalah:
- Jika container memiliki akses ke semua perangkat jaringan host, itu dapat digunakan untuk serangan network sniffing atau MITM (Man-In-The-Middle).
- Contoh Kasus:
- Anda menjalankan container yang tidak tepercaya dengan Host Network:
docker run --network host -d untrusted_app
- Aplikasi yang tidak tepercaya ini dapat memantau lalu lintas jaringan host, termasuk data sensitif seperti kredensial.
- Anda menjalankan container yang tidak tepercaya dengan Host Network:
Ketika Host Network Dapat Digunakan
Walaupun memiliki risiko, Host Network masih berguna dalam kasus tertentu:
- Kinerja Jaringan Maksimal:
- Jika aplikasi membutuhkan latensi rendah atau throughput tinggi (misalnya, aplikasi real-time seperti VoIP atau streaming media).
- Contoh:
docker run --network host -d video_streaming_app
- Aplikasi yang Butuh Akses Langsung ke Jaringan Host:
- Misalnya, layanan yang menggunakan localhost atau memerlukan perangkat jaringan tertentu seperti VPN atau monitoring tools.
- Contoh:
docker run --network host -d network_monitoring_tool
- Testing dan Debugging:
- Jika Anda perlu memeriksa interaksi aplikasi dengan jaringan host selama pengembangan.
Kesimpulan
Host Network tidak disarankan karena:
- Menghilangkan isolasi jaringan.
- Rentan terhadap konflik port.
- Menyediakan akses langsung ke jaringan host yang dapat dieksploitasi.
- Membatasi fleksibilitas dalam pengaturan multi-host.
Gunakan Host Network hanya jika benar-benar diperlukan, seperti untuk kinerja tinggi atau akses langsung ke jaringan host. Namun, untuk kebanyakan kasus, Bridge, Macvlan, atau Overlay Network adalah pilihan yang lebih aman dan fleksibel.