Container-to-Container #
Salah satu kekuatan utama Docker adalah kemampuannya menjalankan banyak container yang saling berkomunikasi satu sama lain dalam satu host atau bahkan lintas host. Container to container communication adalah fondasi utama dalam arsitektur microservices, di mana setiap service berjalan dalam container terpisah namun tetap bisa saling berinteraksi melalui jaringan.
Banyak developer menggunakan Docker setiap hari, tetapi tidak benar-benar memahami bagaimana container bisa saling berkomunikasi, apa peran Docker Network, DNS internal, port exposure, serta perbedaan antar jenis network yang tersedia.
Diagram sederhana berikut menggambarkan komunikasi antar container dalam satu Docker Network:
+-------------------+ HTTP / TCP +-------------------+
| Container A | --------------------> | Container B |
| (service: api) | | (service: db) |
| | <-------------------- | |
+-------------------+ Response +-------------------+
| |
| |
+------------------ Docker Network ------------+
Pada diagram di atas:
- Container A dan B berada dalam Docker Network yang sama
- Komunikasi dilakukan langsung menggunakan nama container / service name
- Tidak memerlukan IP statis maupun expose port ke host
Artikel ini akan membahas konsep, mekanisme internal, dan best practice container-to-container communication di Docker secara mendalam.
Konsep Dasar Networking di Docker #
Secara default, Docker menyediakan abstraction layer di atas networking OS (Linux networking stack). Setiap container:
- Memiliki network namespace sendiri
- Mendapat IP address virtual
- Terhubung ke satu atau lebih Docker Network
Docker bertindak seperti virtual switch (bridge) yang menghubungkan container-container tersebut.
Hal penting yang perlu dipahami:
- Container tidak saling melihat localhost satu sama lain
- Komunikasi terjadi melalui virtual network, bukan melalui loopback
Cara Container Berkomunikasi di Docker #
Ada beberapa pendekatan utama container-to-container communication:
1. Menggunakan Docker Network (Recommended) #
Ini adalah cara paling umum dan paling direkomendasikan.
Jika dua container berada di network yang sama:
- Mereka dapat saling mengakses menggunakan container name atau service name
- Docker menyediakan DNS internal otomatis
Contoh:
http://db:5432
http://redis:6379
Tanpa perlu:
- Mengetahui IP address
- Mengatur DNS manual
2. Menggunakan IP Address Container (Tidak Direkomendasikan) #
Setiap container memiliki IP internal, misalnya:
172.18.0.2
172.18.0.3
Namun pendekatan ini tidak disarankan karena:
- IP bisa berubah saat container restart
- Tidak scalable
- Menyulitkan maintenance
Gunakan service name, bukan IP.
3. Menggunakan Exposed Port via Host #
Container A → Host → Container B
Contoh:
Container A -> localhost:8080 -> Container B
Pendekatan ini:
- Cocok untuk debugging
- Tidak efisien
- Melanggar prinsip isolasi
❌ Tidak direkomendasikan untuk komunikasi internal antar container.
Docker Network: Kunci Utama Komunikasi #
Docker menyediakan beberapa jenis network:
1. Bridge Network (Default & Custom) #
- Digunakan pada single host
- Container dalam network yang sama bisa saling berkomunikasi
Custom bridge network:
- Mendukung DNS internal
- Lebih aman dibanding default bridge
docker network create my-network
2. Host Network #
- Container menggunakan network host secara langsung
- Tidak ada isolasi
- Performa tinggi
❌ Jarang digunakan untuk microservices
3. Overlay Network #
- Digunakan di Docker Swarm
- Mendukung komunikasi lintas host
- Cocok untuk distributed system
4. None Network #
- Container tanpa network
- Digunakan untuk kebutuhan khusus
Peran DNS Internal Docker #
Saat menggunakan:
- Docker Compose
- Custom Docker Network
Docker otomatis menyediakan DNS Server internal.
Contoh Docker Compose:
services:
api:
image: my-api
db:
image: postgres
Maka:
apibisa mengaksesdb- Tanpa konfigurasi tambahan
Docker akan me-resolve:
db -> IP container postgres
Inilah alasan service name adalah best practice.
Container Communication di Docker Compose #
Docker Compose secara otomatis:
- Membuat satu network default
- Menghubungkan semua service ke network tersebut
Diagram:
+-----------+ +-----------+ +-----------+
| web | ----> | api | ----> | db |
+-----------+ +-----------+ +-----------+
\__________________________________________/
docker-compose network
Keuntungan:
- Konfigurasi sederhana
- DNS otomatis
- Cocok untuk local development
Keamanan dalam Container Communication #
Beberapa hal penting:
1. Network Segmentation #
Pisahkan network:
- public-network
- internal-network
Agar:
- Service internal tidak terekspos
- Attack surface lebih kecil
2. Jangan Expose Port yang Tidak Perlu #
Port hanya perlu di-expose jika:
- Diakses dari luar Docker
- Digunakan oleh user atau load balancer
Komunikasi internal tidak butuh expose port.
3. Gunakan Firewall dan Policy (Advanced) #
Untuk skala besar:
- Gunakan network policy
- Gunakan service mesh
Best Practice #
Ringkasan best practice:
- ✅ Gunakan custom Docker network
- ✅ Gunakan service name, bukan IP
- ✅ Hindari komunikasi via host
- ✅ Segmentasikan network sesuai kebutuhan
- ✅ Manfaatkan Docker Compose untuk local dev
Penutup #
Container to container communication adalah fondasi utama dalam arsitektur berbasis Docker dan microservices. Dengan memahami bagaimana Docker Network, DNS internal, dan isolasi container bekerja, kita bisa membangun sistem yang:
- Lebih aman
- Lebih scalable
- Lebih mudah di-maintain
Pemahaman ini menjadi bekal penting sebelum melangkah ke topik yang lebih lanjut seperti service mesh, Kubernetes networking, dan zero-trust architecture.