Sejauh ini setiap container kita panggil dengan tepat satu nama — nama yang diberikan lewat --name saat docker run. Satu nama itu memadai untuk seluruh latihan kita, tetapi arsitektur yang lebih besar sering menuntut kelenturan ekstra: kode lama yang memanggil db-utama sementara kode baru memanggil db, dua versi aplikasi yang perlu berbagi satu panggilan, atau layanan yang isinya ingin kita tukar tanpa menyentuh konfigurasi pemanggilnya. Docker menjawabnya dengan network alias — nama DNS tambahan yang melekat pada sebuah container di dalam sebuah network — dan Chapter Container DNS memang sudah menandai janjinya: flag --network-alias boleh diulang dalam satu docker run. Chapter ini membayar janji itu: satu container dengan banyak nama, lalu kebalikannya — satu nama untuk banyak container — yang membuka round-robin DNS, blue-green lokal, dan mock service.

Satu Container, Banyak Nama #

Kita bangun kembali panggung net-latihan, kali ini dengan container web yang menyandang dua alias sekaligus:

bash
$ docker network create net-latihan
$ docker run -d --name web --network net-latihan --network-alias situs --network-alias www nginx
$ docker run -d --name app --network net-latihan alpine:3.20 sleep 1h

Output yang Dihasilkan:

text
a1f8e4c2b9d63705ae2c7f4b8d1a5e9c3f6b2d8a4c7f1e5b9d3a6c0f4e8b2d5c7
d3c8a2f7e5b19460cb2e7a4d91c5f0a3e8d6b2c9f4a7e1d5b8c3a6f0e2d9b4c7a
7f2e6c1a9b4d73850fb2e9c4a1d5f8e3c6b0a2d9f4c7e1b5a8d3c6f0e2b9a4d7c

Container web kini terdaftar di tabel DNS net-latihan dengan tiga identitas: web, situs, dan www. Kita uji ketiganya dari app:

bash
$ docker exec app ping -c 1 web

Output yang Dihasilkan:

text
PING web (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.118 ms
bash
$ docker exec app nslookup situs

Output yang Dihasilkan:

text
Server:         127.0.0.11
Address:        127.0.0.11:53

Non-authoritative answer:
Name:   situs
Address: 172.19.0.2

Perintah yang sama untuk www menjawab alamat yang identik. Mari kita telaah identitas ganda itu:

  1. Tiga nama menuju satu alamat — alias bukan container baru, melainkan baris tambahan di tabel internal daemon; web, situs, dan www semuanya diterjemahkan ke 172.19.0.2.
  2. Flag dapat diulang sesuka hati — dua --network-alias dalam satu docker run hanyalah contoh; berapa pun nama tambahan bisa dipasang sekaligus.
  3. Nama asli tetap hidup — alias menambah entri, tidak menggantikan nama container; pemanggil lama dan pemanggil baru dapat hidup berdampingan.

Round-Robin DNS: Satu Nama, Banyak Container #

Arah sebaliknya jauh lebih menarik: satu nama yang menunjuk banyak container. Kita bongkas container web lalu pasang dua penggantinya yang berbagi satu alias bernama web:

bash
$ docker rm -f web
$ docker run -d --name web-1 --network net-latihan --network-alias web nginx
$ docker run -d --name web-2 --network net-latihan --network-alias web nginx

Output yang Dihasilkan:

text
web
b9a4d7c1f3e52860ab4e9c2d7f1a5c8e3b6d0f2a9c4e7b1d5f8a3c6e0b2d9f4c7
e6b3c9f1a7d42580fc3a8e5b2d9c1f7a4e0b6d3c8f2a5e9b1d4c7a0f3e6b9d2c

Alamat 172.19.0.2 kembali beredar dari container yang kita bongkar, sehingga web-1 menerimanya kembali, sedangkan web-2 mendapat 172.19.0.4 — app masih memegang 172.19.0.3. Sekarang kita tanyakan nama web kepada embedded DNS:

bash
$ docker exec app nslookup web

Output yang Dihasilkan:

text
Server:         127.0.0.11
Address:        127.0.0.11:53

Non-authoritative answer:
Name:   web
Address: 172.19.0.2
Name:   web
Address: 172.19.0.4

Non-authoritative answer:

Satu pertanyaan, dua jawaban — dan tidak ada penanda mana yang “benar”, karena keduanya memang sah. Pemanggillah yang menentukan pilihan, dan aplikasi umumnya mengambil alamat pertama dari daftar jawaban. Docker memutar urutan jawaban pada setiap permintaan — pola round-robin DNS — sehingga panggilan bergantian mendarat di container yang bergantian pula. Kita buktikan rotasinya dengan menandai setiap container memakai halaman yang berbeda:

bash
$ docker exec web-1 sh -c "echo 'respons dari web-1' > /usr/share/nginx/html/index.html"
$ docker exec web-2 sh -c "echo 'respons dari web-2' > /usr/share/nginx/html/index.html"

Kedua perintah tidak mencetak keluaran — pembungkus sh -c diperlukan karena pengalihan > adalah fitur shell. Pasang curl ke app, lalu panggil nama web dua kali berturut-turut:

bash
$ docker exec app apk add curl

Output yang Dihasilkan (dipotong):

text
fetch https://dl-cdn.alpinelinux.org/alpine/v3.20/main/x86_64/APKINDEX.tar.gz
...
OK: 9 MiB in 21 packages
bash
$ docker exec app curl -s http://web
$ docker exec app curl -s http://web

Output yang Dihasilkan:

text
respons dari web-1
respons dari web-2

Dua perintah yang identik menjawab dari container yang berbeda — isi body menjadi bukti rotasinya. Perjalanan setiap panggilan: curl bertanya kepada 127.0.0.11, embedded DNS membalas dengan urutan alamat yang sudah diputar, lalu curl terhubung ke alamat pertama daftar itu.

Nama versus Alias #

Dua mekanisme penamaan itu kini berdiri berdampingan dan layak dibandingkan tegas:

AspekNama containerNetwork alias
Sumberflag --name saat docker runflag --network-alias saat run, atau --alias pada docker network connect
Jumlahsatu per container, unik di seluruh daemonbanyak per container, dan boleh dipakai container lain
Fleksibilitasmelekat selama container hidup, dikenali di setiap network yang ditempatihidup hanya di network tempat ia didefinisikan; bertambah dan berganti lewat siklus hidup container

Baris terakhir adalah kunci kekuatan sekaligus batas alias: identitasnya sewa, bukan milik — dan justru sifat sewa itulah yang kita manfaatkan pada tiga pola berikutnya.

Alias dalam Praktik #

Blue-Green Lokal #

Pola rilis blue-green menjalankan dua versi aplikasi berdampingan, lalu memindahkan lalu lintas dari versi lama ke versi baru. Dengan alias, perpindahan itu menjadi urusan nama. Saat ini alias web dipegang web-1 dan web-2 — sebut saja keduanya versi biru. Kita “merilis versi hijau” dengan menyandangkan alias yang sama:

bash
$ docker run -d --name web-hijau --network net-latihan --network-alias web nginx
$ docker exec app nslookup web

Output yang Dihasilkan:

text
c2f8a5e1b7d39460ad5c2f9b4e1a8c3d6f0b5e2a9c4d7f1b5e8a3c6d0f2b9e4c7
Server:         127.0.0.11
Address:        127.0.0.11:53

Non-authoritative answer:
Name:   web
Address: 172.19.0.2
Name:   web
Address: 172.19.0.4
Name:   web
Address: 172.19.0.5

Selama masa tumpang tindih, panggilan bergilir di antara ketiga alamat — versi hijau di 172.19.0.5 mulai menerima trafik tanpa satu baris konfigurasi pemanggil yang berubah. Setelah yakin versi hijau sehat, versi biru dilepas:

bash
$ docker rm -f web-1 web-2
$ docker exec app nslookup web

Output yang Dihasilkan:

text
web-1
web-2
Server:         127.0.0.11
Address:        127.0.0.11:53

Non-authoritative answer:
Name:   web
Address: 172.19.0.5

Seluruh panggilan kini menempel ke versi hijau. Rollback semudah menciptakan ulang container versi lama dengan alias yang sama — perpindahan versi menjadi urusan satu nama, bukan urusan suntingan konfigurasi.

Mock Service untuk Pengembangan #

Alias juga menjadi perekat yang rapi saat backend belum siap. Tim frontend dapat menjalankan container stub — server ringan yang menyajikan respons tiruan — dengan alias db atau api, lalu mengarahkan seluruh konfigurasi frontend ke nama itu. Selama backend asli belum ada, semua permintaan dilayani stub; saat backend siap, cukup jalankan container backend dengan alias yang sama lalu buang stub — frontend tidak berubah satu baris pun karena yang dilihatnya sejak awal hanyalah nama, bukan container di belakangnya. Pola yang sama berguna untuk mensimulasikan layanan pihak ketiga: alias payment boleh menunjuk tiruan lokal selama development berlangsung.

Migrasi Nama Bertahap #

Pola ketiga adalah jembatan antara dua zaman penamaan. Ketika nama layanan hendak diganti — db-utama menjadi db, misalnya — alias memungkinkan keduanya hidup berdampingan pada satu container: kode lama tetap memanggil db-utama, kode baru memanggil db, keduanya menuju alamat yang sama. Setelah seluruh kode bermigrasi, alias lama cukup dibiarkan tidak dipasang lagi pada container berikutnya — peralihan nama berjalan tanpa satu jendela waktu di mana layanan “tidak ditemukan”.

Kita rapikan panggung latihan:

bash
$ docker rm -f web-hijau app
$ docker network rm net-latihan

Output yang Dihasilkan:

text
web-hijau
app
net-latihan

Nama container yang dulu sekadar alamat panggilan kini menjadi tuas arsitektur: alias memungkinkan pergantian layanan, migrasi nama, dan pembagian beban tanpa menyentuh si pemanggil. Semua nama, alamat, dan penghuni itu tercatat pada tabel internal daemon — dan jendela resmi untuk membacanya adalah docker network inspect, perintah yang selama ini selalu kita potong keluarannya. Chapter berikutnya membedah keluaran lengkapnya blok demi blok, membandingkannya dengan Options milik default bridge, lalu mengerucutkannya menjadi perintah ekstraksi satu baris yang siap dipakai skrip.

Referensi #