If you’re like me and you hate being spammed with advertisements in your browser than something like PiHole is for you. If you’ve ever heard the commercials for DuckDuckGo you are probably familiar with what happens: you search for something in your browser and next thing you know you are spammed with advertisements related to your search. If you install something like PiHole on your network these advertisements will disappear because the requests to the ads go into a DNS black hole.
As you may know I have a heavy-duty server in my closet known as “HAL”. HAL is running Open Media Vault, and Docker is running on top of that. I am not going to address how to set all of that up here as that has been covered in many other places. This guide partly for my reference in the future and partly for anyone searching on how to add run PiHole in a container with a static IP address (this is something that most guides leave out).
The key to all of this is to identify the specifics for your network:
Note that my network uses the pattern 192.168.1.x.
version: "2" services: pihole: container_name: pihole image: pihole/pihole:latest hostname: pihole # domainname: yourdomain.org # <-- Update or leave comment if you do not have mac_address: d0:ca:ab:cd:ef:05 # <-- Update ( must be a random MAC, because you create a virtual NIC for it) cap_add: - NET_ADMIN networks: macvlan_NET: # <-- MACVlan Name no need to change, but do not exist previosly. ipv4_address: 192.168.1.60 # <-- Update to whatever IP that you want to use as DNS sever ( pihole IP) ports: - 443/tcp - 53/tcp - 53/udp - 67/udp - 80/tcp environment: ServerIP: 192.168.1.100 # <-- Update (match docker host ipv4_address. In my case, OMV server) # VIRTUAL_HOST: pihole.yourdomain.org # <-- Update (match hostname + domainname) WEBPASSWORD: "password" # <-- Add password (if required) DNS1: 184.108.40.206 DNS2: 220.127.116.11 # <-- Change by your prefered DNS service like 18.104.22.168 TZ: American/New_York # <-- You need to add in webGUI not here # IPv6: False # <-- You need to add in webGUI not here volumes: - /srv/dev-disk-by-label-HOMEMEDIA/AppData/PiHole:/etc/pihole # <-- Update to match your real path ; your_nas_path:/etc/pihole - /srv/dev-disk-by-label-HOMEMEDIA/AppData/PiHole/dnsmasq.d:/etc/dnsmasq.d # same here restart: unless-stopped networks: macvlan_NET: driver: macvlan driver_opts: parent: br0 # <- Update to match your NIC see your OMV WebGUI ipam: config: - subnet: 192.168.1.0/24 # <-- Update gateway: 192.168.1.1 # <-- Update ip_range: 192.168.1.2/28 # <-- Update
Note that you SHOULD to run this through a yml validator in order to get the spacing right.
In the example above my personal IP address is in the 192.168.1.x range. I set it so that the PiHole instance uses 192.168.1.60. This is a virtual IP address that I can then point to from my router in order to get DNS. In order to get a virtual IP I had to create a new network called “macvlan_net”. I could have done this manually in the UI but I chose to do it via code.
This is the network that is created in Portainer.
This is the PiHole container in action.
And here is PiHole doing its just. I can access it through the browser using the IP address that I specific in the docker compose file.