Episode ini membuka kekuatan service discovery Traefik lewat Docker Provider: mengaktifkan provider, akses Docker socket, struktur label traefik.http, routing dasar dengan Host dan Path, konfigurasi service load balancer, serta bagaimana container naik-turun diperbarui secara otomatis.

Ini adalah episode yang paling membedakan Traefik dari proxy konvensional: auto-discovery. Setelah membaca episode ini, kalian akan menjalankan docker compose up -d dan Traefik otomatis tahu cara merutekan container baru — tanpa mengedit konfigurasi, tanpa reload, tanpa restart.
Caranya lewat Docker Provider dan labels. Traefik membaca Docker socket, menemukan container yang ditandai dengan label tertentu, lalu menerjemahkan label tersebut menjadi router, service, dan middleware secara real-time. Episode 5 mengupas mekanisme ini dari awal sampai cara routing yang benar.
Docker Provider diaktifkan di static configuration. Kuncinya adalah mount Docker socket ke dalam container Traefik — dari sinilah Traefik mengamati dunia container:
providers:
docker:
exposedByDefault: false
watch: trueBaris endpoint tidak perlu ditulis karena default provider Docker sudah menunjuk ke socket daemon unix:///var/run/docker.sock. Kalau socket kalian di lokasi lain, tambahkan baris endpoint sesuai kebutuhan. Dua pengaturan yang wajib dipahami:
exposedByDefault: false: hanya container dengan label traefik.enable=true yang dirutekan. Nilai true (default) akan merutekan semua container — berbahaya karena container tak dikenal ikut ter-expose.watch: true: Traefik terus memantau event Docker. Ketika container start, stop, atau restart, konfigurasi diperbarui otomatis.Mount socket dengan flag read-only untuk keamanan:
services:
traefik:
image: traefik:v3
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./config/traefik.yml:/etc/traefik/traefik.yml:roSeluruh konfigurasi dinamis dari Docker ditulis sebagai label dengan prefiks traefik.. Pola dasarnya:
traefik.enable
traefik.http.routers.<nama>.rule
traefik.http.routers.<nama>.service
traefik.http.routers.<nama>.middlewares
traefik.http.services.<nama>.loadbalancer.server.port
traefik.http.middlewares.<nama>.<tipe>.<opsi>Label dikelompokkan berdasarkan jenis komponen, lalu nama komponen, lalu konfigurasi. Contoh lengkap container backend:
services:
app:
image: nginx:alpine
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=Host(`app.localhost`)
- traefik.http.routers.app.entrypoints=web
- traefik.http.routers.app.service=app-svc
- traefik.http.services.app-svc.loadbalancer.server.port=80Container app di atas menghasilkan sebuah router bernama app dan service bernama app-svc yang menunjuk ke port 80 container. Akses http://app.localhost akan sampai ke NGINX. Penamaan router dan service bebas, asalkan konsisten antar label.
Rule adalah jantung routing. Contoh paling umum:
Host(app.localhost): cocok untuk host tertentu.Path(/api): cocok untuk path persis /api.PathPrefix(/api): cocok untuk semua path yang diawali /api.Method(GET): cocok untuk method HTTP tertentu.Rule bisa digabung dengan operator logika. Operator && (AND) dan || (OR) serta tanda kurung untuk pengelompokan akan kita bedah tuntas di episode 6. Contoh kombinasi di bawah menunjukkan dua rute dalam satu container:
services:
api:
image: myapi:latest
labels:
- traefik.enable=true
- traefik.http.routers.api-pub.rule=Host(`api.localhost`) && PathPrefix(`/v1`)
- traefik.http.routers.api-pub.entrypoints=web
- traefik.http.routers.api-pub.service=api-svc
- traefik.http.services.api-svc.loadbalancer.server.port=3000Router harus menyatakan entrypoint mana yang dilayani. Jika dihilangkan, router berlaku untuk semua entrypoint — sering menimbulkan konflik tak terduga. Untuk penentuan prioritas antar router yang saling tumpang tindih, Traefik menghitung otomatis berdasarkan panjang rule; pengaturan manual akan kita bahas di episode 6.
Service mendefinisikan backend. Dalam Docker, backend otomatis merujuk ke container bersangkutan, cukup tentukan port internalnya. Traefik v3 juga mendukung health check untuk mengeluarkan backend yang sakit:
services:
api:
image: myapi:latest
labels:
- traefik.enable=true
- traefik.http.routers.api.rule=Host(`api.localhost`)
- traefik.http.routers.api.service=api-svc
- traefik.http.services.api-svc.loadbalancer.server.port=3000
- traefik.http.services.api-svc.loadbalancer.healthcheck.path=/health
- traefik.http.services.api-svc.loadbalancer.healthcheck.interval=10sJika health check /health gagal, Traefik mengeluarkan container tersebut dari rotasi load balancing sampai sehat kembali. Jika semua backend gagal, Traefik mengembalikan HTTP 503. Mechanisme yang sama berlaku ketika container di-scale — otomatis masuk dan keluar rotasi.
Untuk membuktikan sifat dinamisnya, jalankan eksperimen berikut:
docker compose up -d traefik
docker compose up -d app
curl -H "Host: app.localhost" http://localhost
docker compose scale app=2Jalankan perintah-perintah di atas satu per satu sambil melihat tab HTTP Routers di dashboard atau memanggil API:
curl -s http://localhost:8080/api/http/routers | head -n 30Saat app di-scale menjadi 2, Traefik otomatis menambahkan server kedua ke service tanpa restart. Response JSON dari API menampilkan state real-time. Perintah curl ini adalah cara tercepat memverifikasi bahwa discovery bekerja sesuai harapan.
Warning
Jangan pernah me-mount Docker socket ke container yang tidak kalian percaya. Siapa pun yang punya akses socket bisa mengendalikan daemon Docker penuh. Mount read-only adalah minimal, bukan jaminan keamanan.
Inti yang harus dibawa pulang:
exposedByDefault: false mencegah container tanpa label ter-expose.traefik.http.routers.<nama>.* dan traefik.http.services.<nama>.* membangun routing.Host dan PathPrefix adalah dasar pencocokan; bisa digabung dengan operator.Di episode 6 selanjutnya kita akan memperdalam routers dan rules — seluruh matcher yang tersedia seperti HostRegexp, Method, Headers, dan Query, operator logika, aturan priority, serta contoh kombinasi rule yang kompleks. Setelah ini, kalian bisa merancang routing untuk skenario dunia nyata.