Expose Docker Internal DNS with CoreDNS
Posted on
Aku
mau akses service yg jalan pakai docker compose dari host hanya dengan
memanggil nama service-nya dengan suffix .docker, ala K8S. Misalnya, ada
service my-service yg jalan di docker compose, aku bisa akses dari host dengan curl http://my-service.docker:8080 tanpa harus tahu IP container-nya. Dan aku tidak mau edit file /etc/hosts di host, karena repot.
Solusinya
adalah sama seperti K8S, yaitu dengan menambahkan CoreDNS yg akan
resolve nama service ke IP container-nya. Dengan rule sederhana, CoreDNS
bisa resolve nama service yg diakhiri dengan .docker ke IP container-nya.
Langsung saja ke Working dir-nya:
docker/services/coredns
├── compose.yaml
└── Corefile
0 directories, 2 files
Corefile
# Forward *.docker to Docker internal DNS
. {
log
errors
cancel
view docker {
expr name() endsWith '.docker.'
}
rewrite stop {
name suffix .docker . answer auto
}
# Forward to Docker internal DNS
forward . 127.0.0.11
}
# Hotspot Login
# Forward *.intranet.tld to mikrotik DNS
. {
log
errors
cancel
cache 3600
view hotspot {
expr name() endsWith '.intranet.tld.'
}
# Forward to Mikrotik DNS
forward . 172.16.0.1
}
# Hotspot Google SSO
# Forward *.google.com to mikrotik DNS
. {
log
errors
cancel
cache 3600
view google {
expr name() endsWith '.google.com.'
}
# Forward to Mikrotik DNS
forward . 172.16.0.1
}
# Forward any other queries to AdGuard DNS
. {
log
errors
cancel
cache 3600
# Forward to AdGuard DNS with TLS
forward . tls://94.140.14.14 tls://94.140.15.15 {
tls_servername dns.adguard-dns.com
health_check 5s
}
}
compose.yaml
networks:
database:
external: true
logging:
external: true
proxy:
external: true
services:
coredns:
image: coredns/coredns
restart: unless-stopped
command: -conf /Corefile
ports:
- '127.0.0.99:53:53/udp'
- '127.0.0.99:53:53/tcp'
volumes:
- './Corefile:/Corefile'
networks:
- logging
- database
- proxy
Config-nya cukup self explanatory, jadi aku skip penjelasan lebih lanjut.
Selanjutnya, aku tinggal jalankan docker compose-nya:
docker compose up -d
Test dengan dig:
✦ > dig @127.0.0.99 grafana.docker
; <<>> DiG 9.18.28-0ubuntu0.22.04.1-Ubuntu <<>> @127.0.0.99 grafana.docker
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31140
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: b4fa539d5f820d2e (echoed)
;; QUESTION SECTION:
;grafana.docker. IN A
;; ANSWER SECTION:
grafana.docker. 600 IN A 172.20.0.6
;; Query time: 0 msec
;; SERVER: 127.0.0.99#53(127.0.0.99) (UDP)
;; WHEN: Tue Oct 29 09:55:15 WIB 2024
;; MSG SIZE rcvd: 85
Kemudian atur network manager supaya memakai DNS yg baru saja aku buat yaitu 127.0.0.99, dan test lagi dengan dig:
✦ > dig grafana.docker
; <<>> DiG 9.18.28-0ubuntu0.22.04.1-Ubuntu <<>> grafana.docker
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34470
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;grafana.docker. IN A
;; ANSWER SECTION:
grafana.docker. 600 IN A 172.20.0.6
;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Tue Oct 29 09:54:45 WIB 2024
;; MSG SIZE rcvd: 59