Überarbeitet am 8. September 2026.
Pi-hole ist für mich nach wie vor eine der angenehmsten Möglichkeiten, Werbung und Tracking bereits auf DNS-Ebene für ein komplettes Heimnetz zu filtern. Meine alte Docker-Anleitung war allerdings dringend fällig: Sie verwendete noch ein uraltes Image, alte Umgebungsvariablen und war ursprünglich sogar auf einem öffentlich erreichbaren Root-Server entstanden.
Ganz wichtig: Einen Pi-hole-DNS-Server würde ich nicht offen ins Internet stellen. Port 53 gehört nur in das eigene LAN beziehungsweise in ein bewusst abgesichertes VPN. Ein öffentlicher rekursiver DNS-Resolver kann missbraucht werden und unnötig viel Traffic verursachen.
Falls Docker und Docker Compose noch fehlen, habe ich dafür eine aktuelle Anleitung: Docker und Docker Compose unter Debian und Ubuntu installieren.
Pi-hole v6: Was hat sich geändert?
Seit Pi-hole v6 sieht die Docker-Konfiguration deutlich anders aus. Fast alle alten Environment-Variablen aus v5 wurden durch die neuen FTLCONF_...-Variablen ersetzt.
Ein paar Beispiele:
WEBPASSWORD→FTLCONF_webserver_api_passwordDNSMASQ_LISTENING→FTLCONF_dns_listeningModePIHOLE_DNS_→FTLCONF_dns_upstreamsDNSSEC→FTLCONF_dns_dnssec
Wer eine alte v5-Konfiguration übernimmt, sollte deshalb nicht einfach das Image aktualisieren und hoffen, dass alle alten Variablen weiter gelten.
1. Verzeichnis anlegen
sudo mkdir -p /opt/pihole/etc-pihole
sudo chown -R $USER:$USER /opt/pihole
cd /opt/pihole
Für eine neue Pi-hole-v6-Installation reicht normalerweise das persistente Verzeichnis /etc/pihole. Das früher häufig eingebundene /etc/dnsmasq.d ist laut aktueller Pi-hole-Dokumentation für einen frischen v6-Start normalerweise nicht mehr nötig.
2. Webpasswort in .env ablegen
Das Admin-Passwort schreibe ich nicht direkt in die compose.yml. Ein zufälliges Passwort lässt sich zum Beispiel so erzeugen:
openssl rand -base64 24
Danach:
nano /opt/pihole/.env
PIHOLE_PASSWORD=DEIN_LANGES_ZUFAELLIGES_PASSWORT
chmod 600 /opt/pihole/.env
Pi-hole unterstützt alternativ auch Docker Secrets über WEBPASSWORD_FILE. Für ein kleines privates Compose-Setup finde ich eine geschützte .env-Datei aber leichter nachvollziehbar.
3. compose.yml für Pi-hole v6
In diesem Beispiel hat der Docker-Host im Heimnetz die feste IP 192.168.178.10. Diese Adresse musst du durch die IP deines eigenen Servers ersetzen.
services:
pihole:
container_name: pihole
image: pihole/pihole:latest
restart: unless-stopped
ports:
- "192.168.178.10:53:53/tcp"
- "192.168.178.10:53:53/udp"
- "192.168.178.10:8080:80/tcp"
environment:
TZ: "Europe/Berlin"
FTLCONF_webserver_api_password: "${PIHOLE_PASSWORD}"
FTLCONF_dns_listeningMode: "ALL"
FTLCONF_dns_upstreams: "9.9.9.9;149.112.112.112"
volumes:
- ./etc-pihole:/etc/pihole
Warum binde ich die Ports ausdrücklich an die LAN-IP? So lauscht der Container nicht automatisch auf sämtlichen Netzwerkschnittstellen des Hosts. Gerade auf einem Server mit mehreren Interfaces ist das wesentlich eindeutiger.
Die offiziellen Pi-hole-Beispiele veröffentlichen zusätzlich Port 443. Für einen einfachen Start im geschützten Heimnetz reicht mir hier zunächst die Weboberfläche auf Port 8080. Wer das Admin-Panel über HTTPS betreiben möchte, kann das anschließend bewusst ergänzen.
4. Pi-hole starten
cd /opt/pihole
docker compose up -d
docker compose ps
Bei Problemen sind die Logs meistens der schnellste Weg:
docker logs -f --tail 100 pihole
Das Admin-Panel ist im Beispiel anschließend erreichbar unter:
http://192.168.178.10:8080/admin/
5. Pi-hole als DNS-Server im Heimnetz verteilen
Damit nicht jedes Smartphone und jeder Rechner einzeln konfiguriert werden muss, trage ich die Pi-hole-IP am liebsten im Router als lokalen DNS-Server ein. Dann erhalten die Clients den DNS-Server automatisch per DHCP.
Bei einer FRITZ!Box hängt der genaue Menüpunkt von FRITZ!OS ab. Wichtig ist am Ende nur: Die Clients sollen 192.168.178.10 als DNS-Server verwenden.
6. Funktion testen
Von einem Rechner im LAN kann man direkt prüfen, ob Pi-hole antwortet:
nslookup example.com 192.168.178.10
Unter Linux geht alternativ:
dig @192.168.178.10 example.com
Wenn eine Antwort kommt und die Anfrage kurz danach im Pi-hole Query Log auftaucht, funktioniert der grundlegende DNS-Weg.
7. Keine wahllosen Blocklisten sammeln
In der alten Anleitung hatte ich eine ganze Sammlung fremder Blocklisten direkt zum Kopieren aufgeführt. Das würde ich heute anders machen. Listen verschwinden, werden nicht mehr gepflegt oder blockieren irgendwann mehr als gewünscht.
Ich würde zunächst mit den vorhandenen Pi-hole-Listen starten und zusätzliche Quellen nur dann ergänzen, wenn ich einen konkreten Grund dafür habe. Lieber wenige gepflegte Listen als eine halbe Million Domains aus irgendwelchen alten GitHub-Repositories.
8. Pi-hole als DHCP-Server?
Das ist möglich, aber für einen Docker-Container etwas aufwendiger. Das offizielle Compose-Beispiel benötigt dafür unter anderem UDP-Port 67 und die Capability NET_ADMIN.
Wenn der vorhandene Router den Pi-hole-DNS-Server sauber per DHCP verteilen kann, würde ich DHCP zunächst dort lassen. Pi-hole als DHCP-Server würde ich erst einrichten, wenn dafür wirklich ein Grund besteht.
9. Pi-hole aktualisieren
Im Docker-Container verwendet man nicht pihole -up. Pi-hole weist ausdrücklich darauf hin, dass Docker-Installationen über ein neues Container-Image aktualisiert werden:
cd /opt/pihole
docker compose pull
docker compose down
docker compose up -d
Die Konfiguration bleibt durch das Volume ./etc-pihole:/etc/pihole erhalten.
Vor größeren Versionssprüngen lohnt sich trotzdem immer ein Blick in die Release Notes. Gerade der Wechsel von Pi-hole v5 auf v6 hat gezeigt, dass sich Environment-Variablen ändern können.
Mein Fazit
Pi-hole im Docker-Container ist 2026 weiterhin unkompliziert – wenn man nicht versucht, eine fünf Jahre alte Compose-Datei unverändert weiterzuverwenden. Für mich sind die wichtigsten Punkte: aktuelle FTLCONF_-Variablen, persistente Daten, ein ordentliches Admin-Passwort und DNS-Port 53 niemals versehentlich öffentlich ins Internet stellen.
Aktuelle Beispiele findest du in der offiziellen Pi-hole-Docker-Dokumentation und in der Migrationsübersicht von v5 auf v6.
Gedanken dazu 0 Kommentare
Noch ist es ruhig hier. Dein Gedanke könnte der erste sein.
Was denkst du dazu?
Dein Kommentar erscheint nach der Freigabe.