Spawn local DNS server for development (instead of /etc/hosts file)

Image for a hint

Assume you have to manage multiple domains in your local setup, for example, you have a multi-workspace host-name based app (like web-version of Slack in the past):

domain.loc 127.0.0.1
workspace1.domain.loc 127.0.0.1
workspace2.domain.loc 127.0.0.1
workspace3.domain.loc 127.0.0.1

Or multinode scaled DNS-based app. All these cases make management via editing /etc/hosts file not super handly

Create file ./bind_inventory/run_bind.sh :

#!/bin/bash
SCRIPTDIR="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
# TODO: add record to /etc/systemd/resolve.conf file
docker build $SCRIPTDIR -t tracklify_local_bind
sudo docker run -p 127.0.0.1:53:53/udp --restart=always -d tracklify_local_bind

./bind_inventory/Dockerfile:

FROM jpillora/dnsmasq
ADD dnsmasq.conf /etc/dnsmasq.conf

./bind_inventory/dnsmasq.conf:

# this is file with DNS rules, here we map all domain.loc and subdomains to 127.0.0.1
address=/domain.loc/127.0.0.1

Run DNS container:

./bind_inventory/run_bind.sh

Replace Resolve record in /etc/systemd/resolved.conf to look like:

[Resolve]
DNS=127.0.0.1
Domains=~.
DNSStubListener=yes
#FallbackDNS=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#DNSOverTLS=no
#Cache=no-negative
#ReadEtcHosts=yes

3. Restart systemd-resolved

sudo systemctl restart systemd-resolved

4. Test if it's working run.

host domain.loc
host sub.domain.loc

In case it didn't work try restarting Linux.

After the restart just test if the host the command returns host for domain.loc domain.

#dns
0
Ivan Borshchov profile picture
Nov 22, 2021
by Ivan Borshchov
Did it help you?
Yes !
No