pihole-bind9 is a Docker container to run Pi-Hole & Bind on the same container.
We utilise the docker buildx for multi-platform awareness. More information is available from docker here.
Simply pulling rlabinc/pihole-bind9:latest
should retrieve the correct image for your arch, but you can also pull specific arch images via --platform
.
The architectures supported by this image are:
Architecture | Available | Platform |
---|---|---|
x86-64 | ✅ | linux/amd64 |
arm64 | ✅ | linux/arm64 |
armhf | ✅ | linux/arm/v7 |
armv6 | ✅ | linux/arm/v6 |
i386 | ✅ | linux/386 |
Here are the commands you'll need:
docker run -d --name pihole-bind9 \
--name=pihole-bind \
-e TZ=Europe/London `#optional` \
-p 53:53/tcp -p 53:53/udp \
-p 80:80/tcp `#Pi-hole web interface port` \
-e WEBPASSWORD='qwerty123' `#better to use single quotes` \
-e DNSSEC_VALIDATE=auto \
--restart=always \
rlabinc/pihole-bind9:latest
The Docker tags supported by this image are:
Tag | Type |
---|---|
latest |
Stable |
date |
Stable |
dev |
Beta |
Note: Date tag images aren't the same as the official ones, they're based on the build date.
Modern releases of Ubuntu (17.10+) include systemd-resolved
which is configured by default to implement a caching DNS stub resolver. This will prevent pi-hole from listening on port 53.
The stub resolver should be disabled with: sudo sed -r -i.orig 's/#?DNSStubListener=yes/DNSStubListener=no/g' /etc/systemd/resolved.conf
This will not change the nameserver settings, which point to the stub resolver thus preventing DNS resolution. Change the /etc/resolv.conf
symlink to point to /run/systemd/resolve/resolv.conf
, which is automatically updated to follow the system's netplan
:
sudo sh -c 'rm /etc/resolv.conf && ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf'
After making these changes, you should restart systemd-resolved using systemctl restart systemd-resolved
Once pi-hole is installed, you'll want to configure your clients to use it (see here). If you used the symlink above, your docker host will either use whatever is served by DHCP, or whatever static setting you've configured. If you want to explicitly set your docker host's nameservers you can edit the netplan(s) found at /etc/netplan
, then run sudo netplan apply
.
Example netplan:
network:
ethernets:
ens160:
dhcp4: true
dhcp4-overrides:
use-dns: false
nameservers:
addresses: [127.0.0.1]
version: 2
Note that it is also possible to disable systemd-resolved
entirely. However, this can cause problems with name resolution in vpns (see bug report). It also disables the functionality of netplan since systemd-resolved is used as the default renderer (see man netplan
). If you choose to disable the service, you will need to manually set the nameservers, for example by creating a new /etc/resolv.conf
.
Users of older Ubuntu releases (circa 17.04) will need to disable dnsmasq.
Container images are configured using parameters passed at runtime (such as those above).
Parameter | Function |
---|---|
-e TZ=Europe/London |
Specify a timezone to use EG Europe/London. |
-p 53:53/tcp -p 53:53/udp |
Default DNS port to use. |
-p 80:80/tcp |
Specify Pi-hole web interface port. |
-e WEBPASSWORD='qwerty123' |
Specify Pi-hole web interface password. It is better to use single quotes. |
-e DNSSEC_VALIDATE=auto |
This variable defines the DNSSEC validation in Bind. |
--restart=always |
To make sure "It's Always DNS" does not happen. |
This Docker container supports both Pi-hole official Docker container all environment variables available here & cytopia's docker-bind Docker container all environment variables available here.
https://github.com/pi-hole/docker-pi-hole
https://gitlab.isc.org/isc-projects/bind9
https://github.com/origamiofficial/docker-pihole-bind9
The code in this image is heavily influenced by cytopia's docker-bind server Docker image configs, However, the upstream projects most certainly also deserve credit for making this all possible.
I'm not responsible if your internet goes down using this Docker container. Use at your own risk.