A combined DHCP + DNS appliance with a web UI. Multi-interface ISC dhcpd
(one DHCP scope per VLAN) plus a dnsmasq DNS server (recursive resolution +
local/forward zones). Runs anywhere containers do — Linux host, VM, or an
edge/container platform (EVE-OS).
Image: zedmanny/dhcpd3-dns:latest (multi-arch: amd64 + arm64)
Ports: DHCP 67/udp, DNS 53/udp+53/tcp, web UI 8080/tcp. State (config +
leases) persists in /data.
Open http://<container-ip>:8080.
| Tab | Purpose |
|---|---|
| Global / Subnets | edit DHCP scopes (broadcast auto-fills from the netmask) |
| Reservations | static host → MAC → IP |
| Leases | active DHCP leases |
| Topology | container → interfaces → VLAN clouds → leased devices |
| DNS | recursive upstreams + zones (authoritative records or conditional forward) |
| DNS Topology | this box as DNS server → clouds → upstream DNS servers |
| dhcpd.conf | rendered DHCP config |
Single interface: STATIC_IP, STATIC_GW, DHCP_SUBNET, DHCP_NETMASK,
DHCP_RANGE_START, DHCP_RANGE_END, DHCP_GATEWAY, DHCP_DNS, DHCP_FORCE_SEED.
Multiple interfaces (one VLAN/scope per NIC), indexed NET1_*, NET2_*, … (1–8):
| Var | Notes |
|---|---|
NET{i}_IFACE | interface (default eth{i-1}) |
NET{i}_IP | IP with prefix — subnet/netmask/broadcast derived |
NET{i}_RANGE_START / NET{i}_RANGE_END | pool |
NET{i}_GATEWAY | gateway handed to clients |
NET{i}_DNS / NET{i}_NTP | CSV (set NET{i}_DNS to this container's IP to use it for DNS) |
NET{i}_DOMAIN | optional |
DNS_RECURSIVE (CSV, default 1.1.1.1,8.8.8.8), or set them
in the DNS tab.Zones are managed in the UI and persist in /data/dns.json.
DNS_RECURSIVEvsNET{i}_DNS— don't confuse them:
DNS_RECURSIVEis global (one setting) — the upstreams this container forwards to for recursive resolution.NET{i}_DNSis per VLAN — the DNS server address handed to that VLAN's DHCP clients (set it to this container's IP on that VLAN to use it as their resolver). It's a DHCP option, not the resolver's upstream.
| Var | Notes |
|---|---|
USER_NAME | login user (default admin) |
USER_PASS | SHA-256 hex hash of the password; set to require login |
WEBUI_USER / WEBUI_PASSWORD | plaintext fallback |
Generate a hash: printf '%s' 'yourpassword' | openssl dgst -sha256 | awk '{print $NF}'
DHCP and DNS need Layer-2 access to the segments they serve — put the
container directly on each VLAN (host networking / macvlan, or a Switch NI with
access_vlan_id on EVE-OS). Needs NET_ADMIN / NET_RAW.
docker run -d --name dhcpd3-dns --network host \
--cap-add NET_ADMIN --cap-add NET_RAW -v dhcpd3-dns-data:/data \
-e NET1_IFACE=eth0 -e NET1_IP=192.168.254.100/24 \
-e NET1_RANGE_START=192.168.254.150 -e NET1_RANGE_END=192.168.254.200 \
-e NET1_GATEWAY=192.168.254.1 -e NET1_DNS=192.168.254.100 \
-e NET2_IFACE=eth1 -e NET2_IP=192.168.255.100/24 \
-e NET2_RANGE_START=192.168.255.150 -e NET2_RANGE_END=192.168.255.200 \
-e NET2_GATEWAY=192.168.255.1 -e NET2_DNS=192.168.255.100 \
-e DNS_RECURSIVE=1.1.1.1,8.8.8.8 \
zedmanny/dhcpd3-dns:latest
On EVE-OS, deliver the same vars via the app's cloud-init runcmd, give the app
one interface per VLAN (each with its access_vlan_id), and mount a volume at
/data.
| Method | Path | Purpose |
|---|---|---|
| GET/PUT | /api/config | DHCP config |
| PUT | /api/reservations | reservations |
| GET | /api/leases | active leases |
| GET | /api/topology | DHCP topology |
| GET/PUT | /api/dns | DNS config |
| POST | /api/dns/validate | dnsmasq --test dry-run |
| GET | /api/dns/topology | DNS topology |
| GET | /api/service/status | RUNNING / STOPPED |
| GET | /api/docs | OpenAPI / Swagger UI |
Content type
Image
Digest
sha256:742566f0c…
Size
75.8 MB
Last updated
3 months ago
docker pull zedmanny/dhcpd3-dns