Pi-hole mit Docker: Werbung im gesamten Netzwerk blockieren
Werbung nervt. Auf dem Handy, auf dem Smart-TV, im Browser - einfach überall. Und das Schlimmste: Die meisten Adblocker funktionieren nur im Browser, während dein Smart-TV, deine Spielekonsole und alle IoT-Geräte weiterhin fleißig Tracking-Daten nach Hause funken.
Mit Pi-hole änderst du das grundlegend. Einmal auf deinem Raspberry Pi eingerichtet, blockiert Pi-hole Werbung und Tracking auf DNS-Ebene - für ALLE Geräte in deinem Netzwerk, ohne dass du auf jedem einzelnen Gerät etwas installieren musst.
In diesem Artikel zeige ich dir Schritt für Schritt, wie du Pi-hole als Docker Container auf deinem Raspberry Pi einrichtest. Vom einfachen Setup bis zur erweiterten Konfiguration mit eigenem DNS-Resolver und Reverse Proxy ist alles dabei.
DarkWolfCave.de
Was ist Pi-hole?
Pi-hole ist ein sogenanntes “DNS-Sinkhole” - ein zentraler DNS-Server in deinem Netzwerk, der Anfragen an bekannte Werbe- und Tracking-Domains einfach ins Nichts laufen lässt.
Stell dir das so vor: Wenn du eine Webseite aufrufst, muss dein Gerät zuerst die IP-Adresse dieser Seite herausfinden (DNS-Auflösung). Normalerweise fragt dein Gerät dafür den DNS-Server deines Internetanbieters. Mit Pi-hole fragst du stattdessen deinen eigenen DNS-Server - und der antwortet bei bekannten Werbe-Domains einfach mit “gibt’s nicht”.
KI-BildKI-generiert mit GeminiDer große Unterschied zu Browser-Adblockern
Klassische Adblocker wie uBlock Origin arbeiten nur im Browser und müssen die Werbung erst laden, um sie dann zu verstecken. Pi-hole arbeitet auf DNS-Ebene - die Werbung wird gar nicht erst angefragt.
Das bedeutet: Weniger Datenverbrauch, schnellere Ladezeiten und Schutz für ALLE Geräte - auch für solche, auf denen du keinen Adblocker installieren kannst.
Was Pi-hole blockieren kann
- Banner-Werbung auf Webseiten
- Tracking-Pixel und Analytics-Scripts
- Malware- und Phishing-Domains
- Telemetrie von Apps und Betriebssystemen
- Werbung in kostenlosen Apps (teilweise)
Was Pi-hole NICHT blockieren kann
- YouTube-Werbung (kommt von den gleichen Servern wie die Videos)
- Werbung die direkt in den Content eingebettet ist
- Gesponserte Posts in sozialen Medien
- Werbung die über HTTPS/IP-Adressen statt Domains ausgeliefert wird
Das komplette Setup für den Raspberry Pi 5 mit NVMe Boot
Mein Raspberry Pi 5 Setting
| Bild | Produkt | Preis | |
|---|---|---|---|
| Produktdaten werden geladen... | |||
Voraussetzungen
Bevor wir loslegen, hier die Voraussetzungen für Pi-hole mit Docker:
- Raspberry Pi 3 oder neuer - Pi 4 oder Pi 5 empfohlen
- Docker installiert - Falls nicht, schau in meinen Artikel: Raspberry PI – Docker ohne Probleme installieren
- Statische IP-Adresse für den Raspberry Pi (sehr wichtig für DNS!)
- Portainer für die grafische Verwaltung (optional, aber empfohlen)
Pi-hole selbst ist extrem ressourcenschonend. Selbst auf einem Raspberry Pi 3 mit 1GB RAM läuft es problemlos neben anderen Containern.
Statische IP-Adresse konfigurieren
Falls dein Raspberry Pi noch keine statische IP hat, solltest du das jetzt einrichten. Am einfachsten geht das über deinen Router - dort kannst du dem Pi eine feste IP-Adresse zuweisen (DHCP-Reservierung).
Alternativ kannst du die statische IP direkt auf dem Pi konfigurieren. Bei Raspberry Pi OS mit NetworkManager:
# Aktuelle Netzwerkkonfiguration anzeigen
nmcli connection show
# Statische IP setzen (Beispiel - passe die Werte an dein Netzwerk an!)
sudo nmcli connection modify "Wired connection 1" \
ipv4.addresses "192.168.1.50/24" \
ipv4.gateway "192.168.1.1" \
ipv4.dns "127.0.0.1" \
ipv4.method manual
# Verbindung neu starten
sudo nmcli connection up "Wired connection 1"
Wichtig: Merke dir die IP-Adresse deines Pi! Diese wird später als DNS-Server in deinem Netzwerk eingetragen.
Pi-hole mit Portainer installieren
Ich nutze für meine Docker-Container Portainer, weil es die Verwaltung deutlich vereinfacht. Falls du Portainer noch nicht kennst oder installiert hast, findest du in meinem Monitoring-Artikel eine Anleitung dazu.
Öffne deine Portainer-GUI, navigiere zu Stacks und klicke auf Add stack. Vergib einen Namen (z.B. “pihole”) und füge den folgenden Code in den Web-Editor ein:
services:
pihole:
container_name: pihole
image: pihole/pihole:latest
hostname: pihole
restart: unless-stopped
environment:
TZ: 'Europe/Berlin'
WEBPASSWORD: 'dein-sicheres-passwort' # Unbedingt ändern!
FTLCONF_REPLY_ADDR4: '192.168.1.50' # IP deines Raspberry Pi
# PIHOLE_DNS_: '1.1.1.1;1.0.0.1' # Cloudflare als Upstream (optional)
volumes:
- pihole_data:/etc/pihole
- pihole_dnsmasq:/etc/dnsmasq.d
ports:
- "53:53/tcp" # DNS über TCP
- "53:53/udp" # DNS über UDP
- "80:80/tcp" # Web-Interface
cap_add:
- NET_ADMIN # Für DHCP-Funktionen (optional)
networks:
- pihole_network
networks:
pihole_network:
driver: bridge
volumes:
pihole_data:
pihole_dnsmasq:
Die wichtigsten Umgebungsvariablen erklärt
| Variable | Beschreibung |
|---|---|
TZ | Deine Zeitzone (Europe/Berlin für Deutschland) |
WEBPASSWORD | Passwort für die Admin-GUI - unbedingt ändern! |
FTLCONF_REPLY_ADDR4 | Die IP-Adresse deines Raspberry Pi |
PIHOLE_DNS_ | Upstream DNS-Server (falls du keinen eigenen nutzt) |
Hinweis zu Upstream DNS: Standardmäßig nutzt Pi-hole Google DNS (8.8.8.8). Du kannst das auf Cloudflare (1.1.1.1), Quad9 (9.9.9.9) oder einen eigenen Resolver wie Unbound ändern. Mehr dazu im Abschnitt Pi-hole mit Unbound.
Klicke auf Deploy the stack und warte, bis der Container gestartet ist. Das kann beim ersten Mal etwas dauern, da das Image heruntergeladen werden muss.
Nach erfolgreichem Start erreichst du die Pi-hole Admin-Oberfläche unter:
http://[IP-deines-Pi]/admin
Pi-hole mit Docker Compose installieren
Falls du lieber mit der Kommandozeile arbeitest, hier die Variante mit Docker Compose. Erstelle zuerst einen Ordner für Pi-hole:
mkdir -p ~/docker/pihole
cd ~/docker/pihole
Erstelle eine docker-compose.yml Datei:
nano docker-compose.yml
Füge folgenden Inhalt ein (identisch zur Portainer-Variante):
services:
pihole:
container_name: pihole
image: pihole/pihole:latest
hostname: pihole
restart: unless-stopped
environment:
TZ: 'Europe/Berlin'
WEBPASSWORD: 'dein-sicheres-passwort' # Unbedingt ändern!
FTLCONF_REPLY_ADDR4: '192.168.1.50' # IP deines Raspberry Pi
volumes:
- pihole_data:/etc/pihole
- pihole_dnsmasq:/etc/dnsmasq.d
ports:
- "53:53/tcp"
- "53:53/udp"
- "80:80/tcp"
cap_add:
- NET_ADMIN
networks:
- pihole_network
networks:
pihole_network:
driver: bridge
volumes:
pihole_data:
pihole_dnsmasq:
Speichere die Datei (Strg+X, dann Y, dann Enter) und starte Pi-hole:
docker compose up -d
Prüfe, ob der Container läuft:
docker ps | grep pihole
KI-BildKI-generiert mit GeminiGeschafft! Pi-hole läuft jetzt als Container. Die Web-GUI erreichst du unter http://[IP-deines-Pi]/admin
Du wirst hier einen groben Überblick finden.
Allerdings biete ich dir auch noch etwas mehr Support an:
- Du benötigst persönlichen Support
- Du möchtest von Beginn an Unterstützung bei deinem Projekt
- Du möchtest ein hier vorgestelltes Plugin durch mich installieren und einrichten lassen
- Du würdest gerne ein von mir erstelltes Script etwas mehr an deine Bedürfnisse anpassen
Für diese Punkte und noch einiges mehr habe ich einen limitierten VIP-Tarif eingerichtet.
Falls der Tarif gerade nicht verfügbar ist, kontaktiere mich auf Discord!
Pi-hole als DNS-Server im Netzwerk einrichten
Jetzt kommt der wichtigste Schritt: Du musst deinen Geräten sagen, dass sie Pi-hole als DNS-Server verwenden sollen. Dafür gibt es zwei Wege:
Option 1: Im Router konfigurieren (empfohlen)
Die eleganteste Lösung ist, Pi-hole direkt im Router als DNS-Server einzutragen. So verwenden automatisch ALLE Geräte in deinem Netzwerk Pi-hole - auch neue Geräte, ohne dass du etwas konfigurieren musst.
Die genauen Schritte hängen von deinem Router ab. Suche in den Einstellungen nach:
- DHCP-Server → DNS-Server
- LAN-Einstellungen → DNS
- Netzwerk → DNS-Konfiguration
Trage dort die IP-Adresse deines Raspberry Pi als primären DNS-Server ein.
Wichtig: Manche Router (besonders die von Internetanbietern) erlauben keine Änderung des DNS-Servers. In diesem Fall musst du jeden Client einzeln konfigurieren oder einen eigenen Router verwenden.
Option 2: Pro Gerät manuell konfigurieren
Falls du den Router nicht ändern kannst oder willst, konfigurierst du Pi-hole auf jedem Gerät einzeln:
Windows 11:
- Einstellungen → Netzwerk & Internet → Ethernet/WLAN → Hardware-Eigenschaften
- DNS-Serverzuweisung → Bearbeiten → Manuell
- Die IP deines Pi als bevorzugten DNS eintragen
macOS:
- Systemeinstellungen → Netzwerk → Ethernet/WLAN → Details
- DNS → + klicken → IP des Pi eintragen
iOS/Android:
- WLAN-Einstellungen → Netzwerk bearbeiten → Erweitert
- DNS von “Automatisch” auf “Manuell” → IP des Pi eintragen
Linux:
# NetworkManager
sudo nmcli connection modify "Verbindungsname" ipv4.dns "192.168.1.50"
sudo nmcli connection up "Verbindungsname"
Die Pi-hole Admin-Oberfläche
Die Admin-GUI erreichst du unter http://[IP-deines-Pi]/admin. Melde dich mit dem Passwort an, das du in der Docker-Konfiguration festgelegt hast.
Dashboard - Der Überblick
Das Dashboard zeigt dir auf einen Blick:
- Queries Today: Anzahl der DNS-Anfragen heute
- Queries Blocked: Blockierte Anfragen (absolut und prozentual)
- Blocklists: Anzahl der blockierten Domains
- Clients: Geräte die Pi-hole nutzen
Query Log - Wer fragt was an?
Im Query Log siehst du alle DNS-Anfragen in Echtzeit. Das ist super für:
- Debugging wenn eine Seite nicht funktioniert
- Erkennen welche Geräte “nach Hause telefonieren”
- Verstehen welche Werbung blockiert wird
Whitelist & Blacklist
Manchmal blockiert Pi-hole etwas, das du eigentlich brauchst. Über die Whitelist kannst du einzelne Domains freigeben.
Umgekehrt kannst du über die Blacklist zusätzliche Domains blockieren, die nicht in den Standard-Blocklisten sind.
KI-BildKI-generiert mit GeminiTypischer Fall: Eine Website funktioniert nicht mehr
- Öffne das Query Log in Pi-hole
- Rufe die problematische Website auf
- Suche im Log nach roten (blockierten) Einträgen
- Klicke auf “Whitelist” bei der entsprechenden Domain
- Lade die Website neu
Blocklisten erweitern
Die Standard-Blocklisten von Pi-hole sind bereits gut, aber du kannst sie erweitern. Hier sind einige empfehlenswerte Listen:
Empfohlene zusätzliche Blocklisten
Navigiere in Pi-hole zu Adlists und füge diese URLs hinzu:
# Steven Black's Unified Hosts
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
# RPiList - Deutsche Tracking-Domains
https://raw.githubusercontent.com/RPiList/specials/master/Blocklisten/Tracking
# Energized Protection (aktuelle URL unter energized.pro/packs prüfen)
https://block.energized.pro/spark/formats/hosts.txt
Nach dem Hinzufügen: Tools → Update Gravity ausführen, damit die neuen Listen geladen werden.
Weniger ist manchmal mehr: Zu viele Blocklisten können zu Problemen führen. Starte mit den Standard-Listen und erweitere nur bei Bedarf.
Pi-hole mit Traefik als Reverse Proxy (Optional)
Falls du bereits Traefik auf deinem Raspberry Pi nutzt (siehe meinen Traefik-Artikel), kannst du Pi-hole darüber erreichbar machen. Der Vorteil: Du erreichst Pi-hole über pihole.local statt über eine IP-Adresse.
Das Problem: Sowohl Traefik als auch Pi-hole wollen standardmäßig Port 80 nutzen.
Die Lösung: Pi-holes Web-Interface auf einen anderen Port legen.
services:
pihole:
container_name: pihole
image: pihole/pihole:latest
hostname: pihole
restart: unless-stopped
environment:
TZ: 'Europe/Berlin'
WEBPASSWORD: 'dein-sicheres-passwort'
FTLCONF_REPLY_ADDR4: '192.168.1.50'
FTLCONF_webserver_port: '8080o,[::]:8080o' # Interner Webserver auf Port 8080
volumes:
- pihole_data:/etc/pihole
- pihole_dnsmasq:/etc/dnsmasq.d
ports:
- "53:53/tcp"
- "53:53/udp"
# Port 80 wird NICHT mehr gemappt - Traefik übernimmt
networks:
- traefik_network
labels:
- "traefik.enable=true"
- "traefik.http.routers.pihole.rule=Host(`pihole.local`)"
- "traefik.http.routers.pihole.entrypoints=web"
- "traefik.http.services.pihole.loadbalancer.server.port=8080"
networks:
traefik_network:
external: true
volumes:
pihole_data:
pihole_dnsmasq:
Vergiss nicht, in Pi-hole (oder deiner hosts-Datei) den DNS-Eintrag pihole.local → [IP des Pi] anzulegen!
Pi-hole mit Unbound: Eigener DNS-Resolver (Optional)
Standardmäßig leitet Pi-hole alle DNS-Anfragen an einen Upstream-DNS-Server weiter - Google, Cloudflare oder wer auch immer. Das bedeutet: Dieser Anbieter sieht alle deine DNS-Anfragen.
Mit Unbound als eigenem rekursiven DNS-Resolver umgehst du das. Unbound fragt direkt bei den autoritativen Nameservern nach - niemand sonst sieht deine Anfragen.
Unbound Container hinzufügen
Erweitere deine docker-compose.yml um Unbound:
services:
pihole:
container_name: pihole
image: pihole/pihole:latest
hostname: pihole
restart: unless-stopped
depends_on:
- unbound
environment:
TZ: 'Europe/Berlin'
WEBPASSWORD: 'dein-sicheres-passwort'
FTLCONF_REPLY_ADDR4: '192.168.1.50'
PIHOLE_DNS_: 'unbound#53' # Unbound als Upstream
volumes:
- pihole_data:/etc/pihole
- pihole_dnsmasq:/etc/dnsmasq.d
ports:
- "53:53/tcp"
- "53:53/udp"
- "80:80/tcp"
networks:
- pihole_network
unbound:
container_name: unbound
image: mvance/unbound:latest
restart: unless-stopped
volumes:
- unbound_data:/opt/unbound/etc/unbound
networks:
- pihole_network
networks:
pihole_network:
driver: bridge
volumes:
pihole_data:
pihole_dnsmasq:
unbound_data:
Der entscheidende Punkt: PIHOLE_DNS_: 'unbound#53' sagt Pi-hole, dass es Unbound als Upstream-DNS verwenden soll. Die beiden Container kommunizieren über das interne Docker-Netzwerk.
Hinweis: Unbound erhöht die DNS-Auflösungszeit minimal, da es nicht auf Cache von Cloudflare & Co. zugreifen kann. Der Datenschutz-Gewinn ist das aber meistens wert.
Redundanz: Sekundärer Pi-hole (Optional)
Was passiert, wenn dein Pi-hole ausfällt? Richtig - kein Internet mehr für alle Geräte. Für den Produktiveinsatz empfehle ich daher einen zweiten Pi-hole auf einem anderen Gerät.
Die Einrichtung ist identisch zum ersten Pi-hole. Achte nur darauf:
- Andere IP-Adresse natürlich
- Gravity Sync für automatische Synchronisation der Blocklisten
- Im Router beide Pi-holes als DNS-Server eintragen (primär und sekundär)
Für die Synchronisation der Blocklisten gab es früher das Tool Gravity Sync — das Projekt wurde allerdings im Juli 2024 archiviert und ist mit Pi-hole v6 nicht kompatibel. Als Alternative bietet sich Orbital Sync an, das aktiv gepflegt wird und Pi-hole v6 unterstützt.
Troubleshooting
KI-BildKI-generiert mit GeminiContainer startet nicht / Port 53 belegt
Auf einigen Linux-Systemen läuft bereits ein DNS-Dienst (systemd-resolved) auf Port 53. Prüfe das mit:
sudo lsof -i :53
Falls systemd-resolved läuft, kannst du es deaktivieren:
sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved
DNS funktioniert nicht
- Prüfe ob Pi-hole läuft:
docker ps | grep pihole - Teste die DNS-Auflösung:
nslookup google.com [IP-deines-Pi] - Prüfe die Container-Logs:
docker logs pihole
Bestimmte Seiten werden fälschlicherweise blockiert
- Öffne das Query Log in der Pi-hole Admin-GUI
- Suche nach der problematischen Domain
- Klicke auf “Whitelist”
- Teste die Seite erneut
Web-Interface nicht erreichbar
- Prüfe ob Port 80 frei ist:
sudo lsof -i :80 - Bei Nutzung von Traefik: Ist FTLCONF_webserver_port konfiguriert?
- Container-Logs prüfen:
docker logs pihole
Zu viel wird blockiert
- Reduziere die Anzahl der Blocklisten
- Überprüfe benutzerdefinierte Regex-Filter
- Aktiviere das Query Log für detaillierte Analyse
Meine Erfahrung
Ich setze Pi-hole seit Jahren ein - und möchte es nicht mehr missen. Die Kombination aus netzwerkweiter Werbeblockierung und den detaillierten Statistiken ist einfach genial.
Ein paar Erkenntnisse aus der Praxis:
- Smart-TVs sind schlimm: Dein Smart-TV telefoniert öfter nach Hause als du denkst — Pi-hole zeigt dir das schonungslos.
- YouTube-Werbung bleibt: Das ist der einzige echte Nachteil. Für YouTube brauchst du zusätzlich einen Browser-Adblocker oder YouTube Premium.
- Redundanz ist wichtig: Wenn Pi-hole ausfällt, fällt dein ganzes Netzwerk aus. Ein zweiter Pi-hole auf einem anderen Gerät gibt dir Ruhe.
- Weniger Blocklisten sind mehr: Starte mit den Standardlisten. Zu viele Listen führen zu mehr Problemen als sie lösen.
KI-BildKI-generiert mit GeminiDu hast Fragen oder brauchst Hilfe? Schreib mir auf Discord oder nutze die Kommentar-Sektion!
Kommentare