DarkWolfCave
docker

Pi-hole mit Docker: Werbung im gesamten Netzwerk blockieren

Cyberpunk Wolf schützt Netzwerk vor Werbung - Pi-hole mit Docker
DarkWolf Maskottchen KI-Bild Generiert mit Gemini

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”.

Wolf Firewall - Der große Unterschied zu Browser-AdblockernKI-BildKI-generiert mit Gemini

Der 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

Werbung

Mein Raspberry Pi 5 Setting

Bild Produkt Preis
Produktdaten werden geladen...
Letzte Aktualisierung: - | Infos zu Affiliate Links | Bilder von der Amazon Product Advertising API

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"

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

VariableBeschreibung
TZDeine Zeitzone (Europe/Berlin für Deutschland)
WEBPASSWORDPasswort für die Admin-GUI - unbedingt ändern!
FTLCONF_REPLY_ADDR4Die IP-Adresse deines Raspberry Pi
PIHOLE_DNS_Upstream DNS-Server (falls du keinen eigenen nutzt)

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

Wolf Thumbs Up - Geschafft!KI-BildKI-generiert mit Gemini

Geschafft! Pi-hole läuft jetzt als Container. Die Web-GUI erreichst du unter http://[IP-deines-Pi]/admin

VIP Support
Wolf Support Avatar

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-ServerDNS-Server
  • LAN-EinstellungenDNS
  • NetzwerkDNS-Konfiguration

Trage dort die IP-Adresse deines Raspberry Pi als primären DNS-Server ein.

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:

  1. Einstellungen → Netzwerk & Internet → Ethernet/WLAN → Hardware-Eigenschaften
  2. DNS-Serverzuweisung → Bearbeiten → Manuell
  3. Die IP deines Pi als bevorzugten DNS eintragen

macOS:

  1. Systemeinstellungen → Netzwerk → Ethernet/WLAN → Details
  2. DNS → + klicken → IP des Pi eintragen

iOS/Android:

  1. WLAN-Einstellungen → Netzwerk bearbeiten → Erweitert
  2. 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.

Wolf Thinking - Typischer FallKI-BildKI-generiert mit Gemini

Typischer Fall: Eine Website funktioniert nicht mehr

  1. Öffne das Query Log in Pi-hole
  2. Rufe die problematische Website auf
  3. Suche im Log nach roten (blockierten) Einträgen
  4. Klicke auf “Whitelist” bei der entsprechenden Domain
  5. 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.

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.

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:

  1. Andere IP-Adresse natürlich
  2. Gravity Sync für automatische Synchronisation der Blocklisten
  3. 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

Wolf Warnung - Container startet nichtKI-BildKI-generiert mit Gemini

Container 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

  1. Prüfe ob Pi-hole läuft: docker ps | grep pihole
  2. Teste die DNS-Auflösung: nslookup google.com [IP-deines-Pi]
  3. Prüfe die Container-Logs: docker logs pihole

Bestimmte Seiten werden fälschlicherweise blockiert

  1. Öffne das Query Log in der Pi-hole Admin-GUI
  2. Suche nach der problematischen Domain
  3. Klicke auf “Whitelist”
  4. 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.

Wolf Thumbs Up - Fragen oder HilfeKI-BildKI-generiert mit Gemini

Du hast Fragen oder brauchst Hilfe? Schreib mir auf Discord oder nutze die Kommentar-Sektion!

FAQ - Frequently Asked Questions DarkWolfCave
DarkWolf hilft bei FAQs

Häufig gestellte Fragen

Was ist Pi-hole und was macht es?
Pi-hole ist ein DNS-basierter Werbeblocker für dein gesamtes Netzwerk. Statt auf jedem Gerät einen Adblocker zu installieren, blockiert Pi-hole Werbung und Tracking zentral auf DNS-Ebene - auch auf Smart-TVs, Smartphones und IoT-Geräten, wo klassische Adblocker nicht funktionieren.
Welche Hardware benötige ich für Pi-hole?
Ein Raspberry Pi 3 oder neuer mit mindestens 1GB RAM reicht völlig aus. Pi-hole ist sehr ressourcenschonend (ca. 100-200MB RAM) und läuft problemlos neben anderen Docker-Containern. Für zusätzliche Dienste wie Unbound empfehle ich mindestens 2GB RAM.
Blockiert Pi-hole wirklich alle Werbung?
Pi-hole blockiert ca. 70-90% der Werbung auf DNS-Ebene. YouTube-Werbung und einige In-App-Werbungen werden nicht zuverlässig blockiert, da sie von denselben Domains wie der eigentliche Inhalt ausgeliefert werden. Für diese Fälle benötigst du zusätzlich einen Browser-Adblocker.
Kann ich Pi-hole zusammen mit Traefik als Reverse Proxy betreiben?
Ja, du musst nur Pi-holes internen Webserver auf einen anderen Port legen (z.B. 8080 via WEB_PORT) und entsprechende Traefik-Labels konfigurieren. So erreichst du Pi-hole bequem über pihole.local statt einer IP-Adresse mit Port.
Was passiert wenn Pi-hole ausfällt?
Dann funktioniert die DNS-Auflösung in deinem Netzwerk nicht mehr und Webseiten werden nicht geladen. Deshalb empfehle ich entweder einen sekundären Pi-hole auf einem anderen Gerät oder einen Fallback-DNS im Router zu konfigurieren.
Was ist Unbound und brauche ich das?
Unbound ist ein rekursiver DNS-Resolver, der DNS-Anfragen direkt bei den autoritativen Nameservern auflöst statt bei Google, Cloudflare oder anderen DNS-Anbietern. Das erhöht deine Privatsphäre, da kein Dritter deine DNS-Anfragen sieht. Für den Einstieg ist Pi-hole ohne Unbound völlig ausreichend.

Kommentare

URLs werden automatisch verlinkt
Kommentare werden geladen...