Pi-hole als Docker Container unter OpenMediaVault


Nachdem wir euch in der Vergangenheit ja bereits den netzwerkweiten Werbeblocker Pi-hole auf einem Raspberry Pi vorgestellt hatten, folgt nun eine Anleitung um Pi-hole als Docker Container laufen zu lassen. Die Anleitung kann aber auch auf andere Container leicht angepasst angewendet werden. Insofern ist diese Anleitung auch als ein kleines Docker Tutorial zu sehen.

Wir nutzen dafür das NAS Betriebssystem OpenMediaVault und die Container-Webverwaltung Portainer. Ihr könnt den Docker-Container aber natürlich auch aus z.B. Unraid oder einem nativen Linux/Windows System heraus nutzen. Da Pi-hole allerdings 24/7 laufen muss (er ersetzt ja euren DNS-Server im Netzwerk), halte ich es für sinnvoller diesen auf einem kleinen Server wie einem NAS zu installieren und nicht auf eurem privaten Computer.
Docker und Portainer unter OpenMediaVault
Zunächst einmal benötigt ihr ein NAS mit einem aktuellen OpenMediaVault. Aktuell ist momentan OpenMediaVault in Version 6, welches auf Debian 11 basiert. Dieses hatte ich in meinem Artikel OpenMediaVault 6 - Das freie NAS Betriebssystem in der letzten Woche vorgestellt.
Wer sich noch gar nicht mit OpenMediaVault auseinander gesetzt hat, dem empfehle ich zudem unsere Komplettanleitung für OpenMediaVault, welche ich kürzlich auf die aktuellste Version aktualisiert habe.
Da weder Docker noch Portainer (Webverwaltung für Container) in OpenMediaVault enthalten sind, benötigen wir zunächst die OMV-Extras, die eine Plugin-Sammlung sind und OpenMediaVault um viele Möglichkeiten erweitern. Die OMV-Extras können mit dem folgenden Befehl installiert werden:
wget -O - https://github.com/OpenMediaVault-Plugin-Developers/packages/raw/master/install | bash
Nach der Installation der OMV-Extras könnt ihr über den neuen Menüpunkt nun zunächst die Containerverwaltung Docker und anschließend die Weboberfläche Portainer installieren. Ihr könnt statt Portainer auch Yacht nutzen, welches ebenfalls eine Weboberfläche zur Containerverwaltung ist, allerdings etwas simpler daherkommt als Portainer.

Da sich Portainer und Yacht nicht in der Quere kommen, könnt ihr natürlich auch einfach beide installieren und dann ausprobieren welche Weboberfläche für euch am Besten geeignet ist. Auch die Templates in Yacht sind kompatibel zu Portainer.

Portainer
In dieser Anleitung verwenden wir aber Portainer, da es die am häufigsten genutzte Containerverwaltung ist. Anfänger sollten sich hier nicht von den unzähligen Einstellmöglichkeiten verwirren lassen sondern Schritt-für-Schritt vorgehen. Da wir Docker bereits über OpenMediaVault installiert haben, ist diese Umgebung schon in Portainer angelegt.

Die meisten Container benötigen neben dem Image in dem alle benötigten Daten enthalten sind, noch eine Konfiguration. Diese kann später über ein Template erfolgen oder die Variablen können auch direkt im Container gesetzt werden.
DNS-Einstellungen von OpenMediaVault
Ab OpenMediaVault 5 (Debian 10) müsst ihr zuvor den systemd-resolved Dienst umkonfigurieren, da dieser im Standard den DNS-Port 53 nutzt und ihr diesen aber für den pi-hole Container benötigt.
nano /etc/systemd/resolved.conf
Hier müssen die beiden Zeilen DNS-Cache und DNS-StubListener auf no gesetzt und aktiviert werden indem ihr das führende # löscht.

Die Datei anschließend mit Strg+O speichern. Mit Strg+X schließt ihr die Datei. Anschließend muss noch der systemd-resolved Dienst neu gestartet werden:
systemctl restart systemd-resolved
In Docker einen neuen Container anlegen
Es gibt mehrere Wege um in Docker einen neuen Container anzulegen. Der erste Weg wäre über das DockerHub, welches bereits eingerichtet ist. Docker verwendet hier standardmäßig einen anonymen Docker-Account, der zwar limitiert ist, für die meisten Anwender aber ausreicht. Ansonsten könnt ihr euch jederzeit einen kostenlosen DockerHub Account einrichten.
Im DockerHub findet ihr viele bereits konfigurierte Container, die ihr nur noch geringfügig an eure Bedürfnisse anpassen müsst. Hier findet ihr auch den offiziellen Pi-hole Docker Container.
Um einen neuen Container hinzuzufügen, navigiert ihr über den Menüpunkt Containers in die Containerübersicht. Hier könnt ihr über den Button Add container einen neuen Docker Container erzeugen. Diesen Weg gehen wir in dieser Anleitung aber nicht.

Achtung: solltet ihr den Container über das DockerHub erzeugen, müsst ihr unbedingt noch alle benötigten Ports, Netzwerkeinstellungen, Dateifreigaben und Variablen festlegen. Das geht problemlos, ist aber recht mühselig. Einfacher geht die Erstellung eines Containers meiner Meinung nach über die Erstellung eines Templates, das eine Docker Compose Datei enthält. Diesen Weg zeige ich euch in dieser Anleitung.
Template (Vorlage) erstellen
Unter dem Menüpunkt App Templates und dann Custom Templates lassen sich eigene Templates konfigurieren. Hier werden die kompletten Einstellungen für den Container in einer so genannten Docker Compose Datei gespeichert. In dieser Datei werden Funktionen, Variablen und Netzwerk- und Dateieinstellungen vorgenommen die dann auf den Container angewendet werden.
Ich habe hier einfach ein Template mit dem Namen pi-hole und der folgenden Konfiguration erstellt. Der Zugriff auf die Weboberfläche von Pi-hole erfolgt bei mir über den Port 1080, da der Port 80 ja bereits von OpenMediaVault belegt ist. Ihr greift später auf den Container über die IP-Adresse eures NAS zu, daher dürfen die NAS-Ports hier nicht doppelt vergeben werden. Der Port 67 wird im Pi-hole Container nur benötigt, wenn Pi-hole später als DHCP-Server für euer Netzwerk dienen soll.
Alternativ zu dem Standard Docker Netzwerk, welches immer als Netzwerkbrücke (bridge) läuft, könnt ihr auch dedizierte IP-Adressen vergeben. Dann verhält sich der pihole Container so wie ein normaler Computer im Netzwerk. Da dies aber nicht die einfachste Möglichkeit ist, verwenden wir hier das Brückennetzwerk, der Pi-hole Container ist dann unter der IP-Adresse eures NAS erreichbar.
Die Variablen WEBPASSWORD sowie DNS1 müsst ihr an eure Bedürfnisse anpassen.
version: "3.9" services: pihole: container_name: pihole image: pihole/pihole:latest hostname: pihole ports: - "53:53/tcp" #DNS - "53:53/udp" #DNS - "67:67/udp" #DHCP/Bootstrap - "1080:80/tcp" #Pi-hole Weboberfläche - "10443:443/tcp" #Pi-hole Weboberfläche (SSL) environment: TZ: 'Europe/Berlin' WEBPASSWORD: 'DEINPASSWORT' #Dein Passwort für die Pi-hole Webverwaltung (frei wählbar) DNS1: '192.168.1.2' #Deine Router IP-Adresse DNS2: '' volumes: - './etc-dnsmasq.d/:/etc/dnsmasq.d/' - './etc-pihole/:/etc/pihole/' dns: - 127.0.0.1 #Der Pi-hole nutzt sich selbst als DNS-Server cap_add: - NET_ADMIN #Erlaubt das Bearbeiten von Netzwerkeinstellungen im Container restart: unless-stopped
Habt ihr das Template erstellt, könnt ihr dies nun öffnen und über Deploy the stack den Container installieren.

Docker Containerverwaltung
Unter dem Menüpunkt Containers findet ihr im Anschluss an die Installation euren neuen pihole Container.

Die Weboberfläche von Pi-hole erreicht ihr in eurem Browser über die IP-Adresse eures NAS gefolgt von einem :1080. Um Einstellungen in Pi-hole vorzunehmen, müsst ihr euch zunächst mit eurem Passwort (welches ihr über die WEBPASWORD Variable in der Docker Compose Datei festgelegt habt) anmelden.

Nachdem Pi-hole nun via Docker auf eurem NAS läuft, müsst ihr eure Clients so konfigurieren, dass diese den Pi-hole zur DNS-Auflösung nutzen. Das könnt ihr entweder in den DNS-Einstellungen jedes Clients manuell machen oder noch besser direkt in eurem Router (z.B. eurer Fritzbox) den Pi-hole als DNS-Server einstellen.
Wie dies im Detail funktioniert, haben wir bereits in unserer Pi-hole Anleitung auf einem Raspberry Pi 4 beschrieben. Da sich die Konfiguration identisch zu unserem Pi-hole Container verhält, könnt ihr diesen Teil der Anleitung nutzen.
Ad-Block Filterlisten in Pi-hole erweitern
Im Standard kommt Pi-hole mit einfachen Blocklisten, die ca. 130.000 Domains blockieren. Ihr könnt die Filterung durch den Pi-hole noch deutlich erweitern, indem ihr neue Blocklisten einbindet. Wie dies geht, haben wir in unserer Anleitung Neue Ad-Block Filterlisten in Pi-hole einbinden beschrieben.


Bei Links, die mit einem * gekennzeichnet sind, handelt es sich um Affiliate-Links, bei denen wir bei einem Kauf eine Vergütung durch den Anbieter erhalten.
Kommentare (16)

Stefan (Team)

@manuel mir ist da nix negativ aufgefallen. Zur Not lässt sich die Änderung ja jederzeit rückgängig machen, sollten da irgendwelche Probleme auftauchen.

manuel

Da man den DNS Server verstellt, passiert da was wenn man den Server mal abschaltet?
Also kommt man noch mit den Geräten ins Internet?
Also kommt man noch mit den Geräten ins Internet?

pit

@cali:
> Nur komme ich nicht auf die Weboberfläche.
> Dann erscheint nur die "Placeholder page"
Die Adresse für den pi.hole im Container lautet:
IP-Adresse Doppelpunkt Port (hier 1010) Slash admin
Bsp.: 192.168.0.100:1080/admin
> Nur komme ich nicht auf die Weboberfläche.
> Dann erscheint nur die "Placeholder page"
Die Adresse für den pi.hole im Container lautet:
IP-Adresse Doppelpunkt Port (hier 1010) Slash admin
Bsp.: 192.168.0.100:1080/admin

pit

Leider stimmt das Template nicht - bzw. hat es dem Autor beim copy/paste in den CMS Editor die Einrückungen (Leerzeichen) zerhauen. Bin nach längerem trial & error mit dieser Variante zum Ziel gekommen:
https://paste.debian.net/1270618/
Trotzdem Danke an @Stefan!
https://paste.debian.net/1270618/
Trotzdem Danke an @Stefan!

Cali

Hallo Leute,
ich hab es hinbekommen, den pihole laufen zu lassen. Dank eurer Kommentare. Nur komme ich nicht auf die Weboberfläche. Dann erscheint nur die "Placeholder page"
Was mache ich da falsch???
ich hab es hinbekommen, den pihole laufen zu lassen. Dank eurer Kommentare. Nur komme ich nicht auf die Weboberfläche. Dann erscheint nur die "Placeholder page"
Was mache ich da falsch???

Christian

Anscheinend wird die Einrückung der Zeilen im Template in der Browser-Einstellung nicht gut wiedergegeben. Bei mir hat gerade geholfen, die Einrückung der Zeilen anhand anderer Template-Beispiele im Netz anzupassen (Beispiel: ports steht auf der gleichen Stufe wie hostname). Wirklich geholfen hat aber evtl. auch das Entfernen diverser Anführungszeichen im Template, u.a. bei ports und volumes). Danach liess sich das Template ohne Fehlermeldung deployen und der Container startete.

norga

jup, da passte etwas mit den Leerstellen nicht.... so hat Docker nicht mehr gemeckert (OMV6)
version: "3.9"
services:
pihole:
containername: pihole
image: pihole/pihole:latest
hostname: pihole
ports:
- "53:53/tcp" #DNS
- "53:53/udp" #DNS
- "1080:80/tcp" #Pi-hole Weboberfläche
- "10443:443/tcp" #Pi-hole Weboberfläche (SSL)
environment:
TZ: 'Europe/Berlin'
WEBPASSWORD: '[email protected]!' #Dein Passwort für die Pi-hole Webverwaltung (frei wählbar)
DNS1: '192.168.1.1' #Deine Router IP-Adresse
DNS2: ''
volumes:
- './etc-dnsmasq.d/:/etc/dnsmasq.d/'
- './etc-pihole/:/etc/pihole/'
dns:
- 127.0.0.1 #Der Pi-hole nutzt sich selbst als DNS-Server
capadd:
- NETADMIN #Erlaubt das Bearbeiten von Netzwerkeinstellungen im Container
restart: unless-stopped
version: "3.9"
services:
pihole:
containername: pihole
image: pihole/pihole:latest
hostname: pihole
ports:
- "53:53/tcp" #DNS
- "53:53/udp" #DNS
- "1080:80/tcp" #Pi-hole Weboberfläche
- "10443:443/tcp" #Pi-hole Weboberfläche (SSL)
environment:
TZ: 'Europe/Berlin'
WEBPASSWORD: '[email protected]!' #Dein Passwort für die Pi-hole Webverwaltung (frei wählbar)
DNS1: '192.168.1.1' #Deine Router IP-Adresse
DNS2: ''
volumes:
- './etc-dnsmasq.d/:/etc/dnsmasq.d/'
- './etc-pihole/:/etc/pihole/'
dns:
- 127.0.0.1 #Der Pi-hole nutzt sich selbst als DNS-Server
capadd:
- NETADMIN #Erlaubt das Bearbeiten von Netzwerkeinstellungen im Container
restart: unless-stopped

Markus

Der Fehler tritt bei mir auf. Vielleicht erst mal dieses Tutorial vom Netz nehmen, ansonsten ist das doch etwas frustrierend. Wenn es einen Workaround gibt, den bitte nachpflegen.

micha

Ich habe das nicht hinbekommen (besser gesagt bei mir funktioniert das aus was weis ich für welchen Gründen nicht) und dann PiHole direkt auf die OMV-Nas installiert (ohne Docker). Da auf dem kleinen J4105-Rechner nur OMV und PiHole laufen habe ich Docker/Portainer deinstalliert.
OMV und PiHole zusammen auf der NAS
PiHole auf einen laufenden OMV-System über ssh installieren:
sudo apt-get update && sudo apt-get upgrade -y
Falls curl noch nicht installiert ist:
sudo apt install curl
PiHole installieren:
sudo curl -sSL https://install.pi-hole.net | bash
OMV:
Unter System/Workbench muss der Port 80 in einen anderen Port (z.B.: 1080) und bei Verwendung von der sicheren Verbindung Port 443 in ... geändert werden. Die Web-Oberfläche von OMV muss in dem Beispiel mit IP:1080 (z.B.: http://192.168.0.44:1080 ) gestartet werden. Weboberfläche PiHole wird in dem Beispiel mit http://192.168.0.44/admin gestartet.
System/ssh:
Ins Terminal über ssh nacheinander eingeben:
sudo sed -i "s/#Cache=yes/Cache=no/g" /etc/systemd/resolved.conf
sudo sed -i "s/#DNSStubListener=yes/DNSStubListener=no/g" /etc/systemd/resolved.conf
dann entweder neu starten oder systemd-resolved neu starten:
systemctl restart systemd-resolved
Ob es Probleme mit Port 67, den PiHole als DHCP-Server verwendet, gibt weis ich nicht da ich den DHCP-Server von PiHole nicht benötige und auch nicht eingeschaltet habe.
OMV und PiHole zusammen auf der NAS
PiHole auf einen laufenden OMV-System über ssh installieren:
sudo apt-get update && sudo apt-get upgrade -y
Falls curl noch nicht installiert ist:
sudo apt install curl
PiHole installieren:
sudo curl -sSL https://install.pi-hole.net | bash
OMV:
Unter System/Workbench muss der Port 80 in einen anderen Port (z.B.: 1080) und bei Verwendung von der sicheren Verbindung Port 443 in ... geändert werden. Die Web-Oberfläche von OMV muss in dem Beispiel mit IP:1080 (z.B.: http://192.168.0.44:1080 ) gestartet werden. Weboberfläche PiHole wird in dem Beispiel mit http://192.168.0.44/admin gestartet.
System/ssh:
Ins Terminal über ssh nacheinander eingeben:
sudo sed -i "s/#Cache=yes/Cache=no/g" /etc/systemd/resolved.conf
sudo sed -i "s/#DNSStubListener=yes/DNSStubListener=no/g" /etc/systemd/resolved.conf
dann entweder neu starten oder systemd-resolved neu starten:
systemctl restart systemd-resolved
Ob es Probleme mit Port 67, den PiHole als DHCP-Server verwendet, gibt weis ich nicht da ich den DHCP-Server von PiHole nicht benötige und auch nicht eingeschaltet habe.

Jeti

So funktioniert es bei mir.
Die Leerzeichen vor den Sätzen sind da wichtig. Sehen zwar irgendwie gleich aus, sind es aber nicht.
version: "3.9"
services:
pihole:
containername: pihole
image: pihole/pihole:latest
hostname: pihole
ports:
- "53:53/tcp" #DNS
- "53:53/udp" #DNS
- "67:67/udp" #DHCP/Bootstrap
- "1080:80/tcp" #Pi-hole Weboberfläche
- "10443:443/tcp" #Pi-hole Weboberfläche (SSL)
environment:
TZ: 'Europe/Berlin'
WEBPASSWORD: 'DEINPASSWORT' #Dein Passwort für die Pi-hole Webverwaltung (frei wählbar)
DNS1: '192.168.1.2' #Deine Router IP-Adresse
DNS2: ''
volumes:
- './etc-dnsmasq.d/:/etc/dnsmasq.d/'
- './etc-pihole/:/etc/pihole/'
dns:
- 127.0.0.1 #Der Pi-hole nutzt sich selbst als DNS-Server
capadd:
- NETADMIN #Erlaubt das Bearbeiten von Netzwerkeinstellungen im Container
restart: unless-stopped
Die Leerzeichen vor den Sätzen sind da wichtig. Sehen zwar irgendwie gleich aus, sind es aber nicht.
version: "3.9"
services:
pihole:
containername: pihole
image: pihole/pihole:latest
hostname: pihole
ports:
- "53:53/tcp" #DNS
- "53:53/udp" #DNS
- "67:67/udp" #DHCP/Bootstrap
- "1080:80/tcp" #Pi-hole Weboberfläche
- "10443:443/tcp" #Pi-hole Weboberfläche (SSL)
environment:
TZ: 'Europe/Berlin'
WEBPASSWORD: 'DEINPASSWORT' #Dein Passwort für die Pi-hole Webverwaltung (frei wählbar)
DNS1: '192.168.1.2' #Deine Router IP-Adresse
DNS2: ''
volumes:
- './etc-dnsmasq.d/:/etc/dnsmasq.d/'
- './etc-pihole/:/etc/pihole/'
dns:
- 127.0.0.1 #Der Pi-hole nutzt sich selbst als DNS-Server
capadd:
- NETADMIN #Erlaubt das Bearbeiten von Netzwerkeinstellungen im Container
restart: unless-stopped

Stefan (Team)

Das hört sich ja nach einem Bug in OpenMediaVault 6 an. Muss dann mit einem Update gekommen sein, als ich es getestet hatte, funktionierte das einwandfrei.
Postet den Fehler doch im Bugtracker von OMV.
Postet den Fehler doch im Bugtracker von OMV.

Thoma5

selbes Problem hier!
Deployment error failed to deploy a stack: services.capadd must be a mapping
Alle OMV 6 update eingespielt.
Damit für mich leider unbrauchbar.
Deployment error failed to deploy a stack: services.capadd must be a mapping
Alle OMV 6 update eingespielt.
Damit für mich leider unbrauchbar.

andi

habe auch die Fehlermeldung "failed to deploy a stack: services.capadd must be a mapping"nwelche Leerstellen soll ich ändern ??

me

Hi
die Meldung hatte ich auch
Ich konnte es nur beheben indem ich alle Leerstellen neu gemacht habe.
Also alle Löschen und zwei bzw vier Leerstellen einfügen.
die Meldung hatte ich auch
Ich konnte es nur beheben indem ich alle Leerstellen neu gemacht habe.
Also alle Löschen und zwei bzw vier Leerstellen einfügen.

Stefan (Team)

Ist dein Linux auf dem neusten Stand ? Hört sich so an als ob Docker versucht einen Dienst zu registrieren aber dabei am OS scheitert

Andr?

Bei mir erscheint die Fehlermeldung nach dem Erstellen des Templates (Schaltfläche "Deploy the stack")
Deployment error
failed to deploy a stack: services.capadd must be a mapping
irgendjemand eine Idee woran es liegen könnte?
Deployment error
failed to deploy a stack: services.capadd must be a mapping
irgendjemand eine Idee woran es liegen könnte?
Diesen Artikel kommentieren:
Hinweis:
- Nur Fragen / Antworten direkt zum Artikel
- Kein Support für andere Hard- oder Software !

E-Mail Benachrichtigung bei neuen Artikeln
