Pi-hole's pitch is simple: a small self-hosted DNS server that blocks ads and trackers for every device on your network, no per-device app or browser extension required. I deployed it on a dedicated container to replace/supplement my router's own DNS filtering — this is what that process actually looked like, including a router-level gotcha and a finding about container health checks that's changed how I evaluate "is this actually working."
Pi-hole is a DNS server that answers most queries normally and returns a blocked/null response for domains on its blocklists — mostly ad networks and trackers, sourced from large, actively-maintained community lists (the same style of list browser extensions like uBlock Origin use, just applied at the network's DNS layer instead of per-browser). Point your router's DHCP-assigned DNS server at it, and every device on the network gets ad/tracker blocking without installing anything — including phones, smart TVs, and IoT devices that could never run a browser extension in the first place.
Most consumer/prosumer routers with any content-filtering feature (UniFi included) do something different: category-based filtering — block "Adult Content," "Malware," a fixed list of buckets — not general ad/tracker blocking. Three real differences matter here:
They're not really competing products — a router's content filter is aimed at parental-control-style category blocking, Pi-hole is aimed at ad/tracker suppression with real visibility. If you want both, you need to think about how they coexist, which turned out to be the first real decision point in this deployment.
Pi-hole's Docker image is genuinely easy to stand up — a single container, host networking so it can bind DNS's standard ports directly, a web admin panel on the usual HTTP(S) ports. No complex config needed to get it answering DNS queries correctly from its own local network segment. If the story ended there, this would be a short, boring, entirely positive review.
This is worth knowing before you spend an hour debugging Pi-hole itself, because nothing about Pi-hole is broken in this scenario — it never even sees the query. If clients on a UniFi (or similar) network aren't resolving through Pi-hole despite correct DHCP/DNS settings, check whether the router's own DNS filtering is enabled on that network segment first, before assuming a Pi-hole-side misconfiguration.
If your router's content filtering is doing real work already — parental controls on a specific network, for instance — don't just disable it as a side effect of adding Pi-hole. That's a decision worth making deliberately, not something to stumble into. The real options are: run Pi-hole only on the network segments that don't already depend on the router's filtering, replace the router's filtering with something Pi-hole-based everywhere (more consistent, more work), or hold off until you've decided which. There's no universally correct answer here — it depends entirely on what the existing filtering is actually protecting.
Beyond the coexistence question above, I'm holding off on actually redirecting network DNS to Pi-hole until some unrelated network topology changes land first (new switching hardware, some interfaces getting re-cabled). Pi-hole becomes a single point of failure for DNS on whatever network segment it serves — that's a reasonable thing to want sitting on settled infrastructure, not infrastructure that's about to change out from under it. Nothing about that pause reflects on Pi-hole itself.
The lesson generalizes past Pi-hole specifically: a container that's up, hasn't crashed, and isn't
throwing errors in its logs can still be functionally broken in a way only its own health check (if it has
one, and if you actually look at it) will tell you. docker ps showing a container as running
is a much weaker claim than it feels like — check docker inspect for the actual health status,
not just whether the process is alive.
Everything about Pi-hole's actual value proposition holds up on paper and in the parts I've tested directly: it does something a router's content filter genuinely doesn't (real ad/tracker blocking with real visibility), it's simple to deploy, and it's lightweight enough to justify a small dedicated container just for this. But this evaluation also turned up two real, non-obvious problems before it ever went fully live — a router that silently eats the exact traffic Pi-hole needs to see, and a container that looked fine by every surface-level signal while its own health check said otherwise the entire time. Both are fixable and neither is a knock against Pi-hole's core design, but they're exactly the kind of thing "just deploy it and it'll work" advice tends to skip. Full verdict once it's actually carrying real traffic — follow-up to come once the network topology work it's waiting on is done.