DNS Internal #
Salah satu fitur Docker yang sering dianggap sepele tapi sangat krusial dalam arsitektur container adalah DNS internal. Berkat DNS internal ini, container dapat saling berkomunikasi hanya dengan nama service atau container, tanpa perlu tahu IP address secara manual.
Tanpa mekanisme DNS internal, membangun sistem berbasis microservices di Docker akan jauh lebih rumit, rapuh, dan sulit diskalakan.
Untuk mempermudah pemahaman, berikut gambaran sederhana cara kerja DNS internal di Docker:
+--------------------+ resolve: db
| Container: app | ----------------------+
| DNS Query (53) | |
+--------------------+ v
+----------------------+
| Docker Internal DNS |
| (127.0.0.11) |
+----------------------+
|
| returns IP
v
+----------------------+
| Container: db |
| IP: 172.18.0.3 |
+----------------------+
Pada artikel ini, kita akan membahas apa itu DNS internal Docker, bagaimana cara kerjanya, kapan aktif, serta best practice penggunaannya di lingkungan development maupun production.
Apa Itu DNS Internal di Docker? #
DNS internal Docker adalah DNS server bawaan yang otomatis disediakan oleh Docker Engine untuk setiap container yang berada dalam user-defined network.
Fungsi utamanya:
- Menerjemahkan nama container atau service → IP address
- Menghilangkan kebutuhan hardcode IP
- Memungkinkan komunikasi antar container secara dinamis
Docker menjalankan DNS ini secara internal dan tidak terlihat langsung oleh user.
Alamat DNS Internal Docker #
Setiap container Docker secara default akan menggunakan:
127.0.0.11
sebagai DNS resolver internal.
Jika kamu menjalankan di dalam container:
cat /etc/resolv.conf
Biasanya akan terlihat seperti:
nameserver 127.0.0.11
options ndots:0
Artinya:
- Semua query DNS akan dikirim ke DNS internal Docker
- Docker yang akan menentukan apakah nama tersebut adalah container/service
Kapan DNS Internal Docker Aktif? #
DNS internal hanya aktif secara penuh jika:
- Container berada di user-defined bridge network
- Container berada di network yang sama
❌ Tidak bekerja optimal di default bridge network
Contoh membuat network:
docker network create app-network
Menjalankan container:
docker run --network app-network --name app my-app
docker run --network app-network --name db postgres
Sekarang container app bisa mengakses database dengan hostname:
db:5432
DNS Internal di Docker Compose #
Docker Compose secara otomatis membuat DNS internal berbasis nama service.
Contoh docker-compose.yml:
services:
app:
image: my-app
depends_on:
- db
db:
image: postgres
Maka:
- Service
dbdapat diakses dengan hostnamedb - Tidak perlu expose IP
- Tidak perlu link manual
Ini adalah fondasi utama komunikasi antar service di Docker Compose.
Bagaimana Proses Resolusi DNS Terjadi? #
Urutan saat container melakukan DNS lookup:
Aplikasi melakukan query (misalnya
db)Query dikirim ke
127.0.0.11Docker mengecek:
- Apakah nama tersebut adalah container di network yang sama?
Jika iya:
- Docker mengembalikan IP container
Jika tidak:
- Query diteruskan ke DNS eksternal (misalnya Google DNS / DNS host)
Dengan mekanisme ini, container bisa:
- Resolve internal service
- Tetap resolve domain publik (
google.com,api.github.com)
DNS Round-Robin untuk Multiple Container #
Jika satu service memiliki lebih dari satu container:
services:
api:
image: my-api
deploy:
replicas: 3
Docker DNS akan mengembalikan beberapa IP untuk hostname api.
Contoh hasil query:
api -> 172.18.0.2
-> 172.18.0.3
-> 172.18.0.4
Ini disebut DNS round-robin, dan biasanya:
- Load balancing dilakukan di level aplikasi
- Atau menggunakan reverse proxy (Nginx, Traefik, Envoy)
Perbedaan DNS Internal Docker vs Hosts File #
| Aspek | DNS Internal Docker | /etc/hosts |
|---|---|---|
| Dinamis | ✅ | ❌ |
| Support scale | ✅ | ❌ |
| Multi container | ✅ | ❌ |
| Auto update IP | ✅ | ❌ |
Docker tidak mengandalkan /etc/hosts untuk service discovery modern.
Best Practice Penggunaan DNS Internal Docker #
✅ Gunakan user-defined network
✅ Gunakan nama service, bukan IP
✅ Hindari container_name di Docker Compose jika ingin scaling
✅ Jangan hardcode IP di environment variable
✅ Gunakan reverse proxy untuk traffic HTTP
Kesalahan Umum yang Sering Terjadi #
❌ Menggunakan default bridge dan berharap DNS otomatis
❌ Mengakses container lintas network
❌ Menganggap depends_on menjamin service siap
❌ Menggunakan IP statis
Kapan DNS Internal Docker Tidak Cukup? #
DNS internal Docker bukan service discovery global.
Tidak cocok untuk:
- Multi-host container (tanpa Swarm / Kubernetes)
- Cross-datacenter discovery
- Advanced health-based routing
Untuk skala besar, biasanya beralih ke:
- Docker Swarm DNS
- Kubernetes CoreDNS
- Service Mesh
Penutup #
DNS internal Docker adalah fondasi tersembunyi yang membuat container terasa “mudah” untuk digunakan. Dengan memahami cara kerjanya, kamu bisa:
- Mendesain arsitektur yang lebih rapi
- Menghindari konfigurasi rapuh
- Menulis Docker Compose yang lebih bersih dan scalable
Jika kamu sudah paham DNS internal Docker, maka transisi ke Docker Swarm atau Kubernetes akan terasa jauh lebih natural.