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 db dapat diakses dengan hostname db
  • 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:

  1. Aplikasi melakukan query (misalnya db)

  2. Query dikirim ke 127.0.0.11

  3. Docker mengecek:

    • Apakah nama tersebut adalah container di network yang sama?
  4. Jika iya:

    • Docker mengembalikan IP container
  5. 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 #

AspekDNS 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.

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact