Seguimos con otra, vamos a desplegar un Container de Pi-hole desplegado con compose a ver qué tal se nos da y como construir nuestra propia imagen de Pi-Hole con DoH.
Configurar fichero .yml
Creamos una carpeta para nuestro Container al gusto y creamos un fichero con extensión .yml
mkdir Deploy-PiHole
vi ~/Deploy-PiHole/Pi-hole.yml
Agregaremos los parámetros para el despliegue, aquí podemos agregar la configuración que tendrán nuestros containers de Pi-hole.
GitHub – pi-hole/docker-pi-hole: Pi-hole in a docker container
version: "3"
# More info at https://github.com/pi-hole/docker-pi-hole/ and https://docs.pi-hole.net/
services:
pihole:
container_name: pihole
image: pihole/pihole:latest
ports:
- "53:53/tcp"
- "53:53/udp"
- "67:67/udp"
- "80:80/tcp"
environment:
TZ: 'Europe/Madrid'
WEBPASSWORD: 'MordorWorld'
# Volumes store your data between container upgrades
volumes:
- './etc-pihole/:/etc/pihole/'
- './etc-dnsmasq.d/:/etc/dnsmasq.d/'
# Recommended but not required (DHCP needs NET_ADMIN)
# https://github.com/pi-hole/docker-pi-hole#note-on-capabilities
cap_add:
- NET_ADMIN
restart: unless-stopped
Arranque Pi-hole
Una vez tengamos nuestro fichero de configuración, podemos iniciar nuestro Docker.
docker-compose -f Pi-hole.yml up -d

Si recibimos error de que el puerto está en uso, necesitaremos deshabilitar el servicio de “systemd-resolved”.

sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
Eliminar compose
Para eliminar el Container, ejecutaremos el siguiente comando.
docker-compose -f Pi-hole.yml down
Validar
Accedemos a la consola http://IP_Dockers/admin, si todo ha ido bien podremos conectarnos a nuestra consola.

Configurar DoH
Ahora vamos a configurar nuestro Pi-Hole con DoH CloudFlare, para ello tendremos que construir nuestra propia imagen de Pi-Hole personaliza, a tope…
cloudflared (DoH) – Pi-hole documentation
Creamos una carpeta para guardar nuestros ficheros para la construcción.
mkdir ~/Deploy-PiHole/build
Dockerfile
Crearmos un fichero llamado “Dockerfile”, aquí agregaremos los parametro de construcción (que instala, que ejecuta, …) .
Dockerfile reference | Docker Documentation
Nuestro fichero tendrá las tareas que nos indica PiHole para instalar DoH.
- Usaremos la imagen de Pihole
- Con sus puertos
- Actualizara ubuntu
- Instalará cloudflared
- Copiara el fichero config en el contenedor
- Creará el servicio
- Arrancará Cloudflared
DoH Ubuntu
FROM pihole/pihole
EXPOSE 53:53/tcp\
53:53/udp\
67:67/udp\
80:80/tcp
RUN apt-get update \
&& apt-get -y upgrade \
&& apt-get -y autoremove --purge \
&& apt-get -y install wget \
&& wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb \
&& apt-get install ./cloudflared-linux-amd64.deb \
&& mkdir -p /etc/cloudflared/
COPY ./config.yml /etc/cloudflared/config.yml
RUN cloudflared service install --legacy
ENTRYPOINT nohup /s6-init & cloudflared
DoH Raspberry x64
FROM pihole/pihole
EXPOSE 53:53/tcp\
53:53/udp\
67:67/udp\
80:80/tcp
RUN apt-get update \
&& apt-get -y upgrade \
&& apt-get -y autoremove --purge \
&& apt-get -y install wget \
&& wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64 \
&& sudo cp ./cloudflared-linux-arm64 /usr/local/bin/cloudflared \
&& sudo chmod +x /usr/local/bin/cloudflared
COPY ./config.yml /etc/cloudflared/config.yml
RUN sudo cloudflared service install --legacy
ENTRYPOINT nohup /s6-init & cloudflared
HEALTHCHECK
Para ver el estado de salud desde Docker, podremos utilizar el parametro HEALTHCHECK le solicitaremos que nos devuelva algo cada cierto tiempo para verificar.
Dockerfile reference | Docker Documentation
Agregaremos los siguiente antes de ENTRYPOINT, para que nos chequee el estado.
HEALTHCHECK --interval=5m --timeout=3s \
CMD [dig @127.0.0.1 -p 5053 pi.hole || exit 1]
Config CloudFlare
Creamos un fichero “config.yml” para PiHole.
proxy-dns: true
proxy-dns-port: 5053
proxy-dns-upstream:
- https://1.1.1.1/dns-query
- https://1.0.0.1/dns-query
Contruir imagen
Construimos la imagen docker build -t ‘<Nombre-imagen>’ . (poner el punto al final con un espacio)
docker build -t 'pihole_mordor:v1' .

Verificamos que existe nuestra imagen.
docker image ls

Configuración Compose file
Editamos el fichero .yml del compose que hicimos al principio
Sustituimos la imagen por la nuestra “pihole_mordor:v1”
Agregamos un nuevo environment DNS1: ‘127.0.0.1#5053’
version: "3"
# More info at https://github.com/pi-hole/docker-pi-hole/ and https://docs.pi-hole.net/
services:
pihole:
container_name: pihole
image: pihole_mordor:v1
ports:
- "53:53/tcp"
- "53:53/udp"
- "67:67/udp"
- "80:80/tcp"
environment:
TZ: 'Europe/Madrid'
WEBPASSWORD: 'MordorWorld'
DNS1: '127.0.0.1#5053'
# Volumes store your data between container upgrades
volumes:
- './etc-pihole/:/etc/pihole/'
- './etc-dnsmasq.d/:/etc/dnsmasq.d/'
# Recommended but not required (DHCP needs NET_ADMIN)
# https://github.com/pi-hole/docker-pi-hole#note-on-capabilities
cap_add:
- NET_ADMIN
restart: unless-stopped
Arrancamos nuestro docker.
docker-compose -f Pi-hole.yml up -d
Verificar DoH
Para revisar el estado de nuestro container, ejecutaremos el comando docker exec -it <Nombre-Docker> comando.
Chequear versión cloudflared
docker exec -it pihole cloudflared -v

Comprobar que podemos resolvemos google.
docker exec -it pihole dig @127.0.0.1 -p 5053 google.com

Tambien importante ver que el container esta Up y no reiniciando en bucle.
docker ps

Troubleshooting
Para ver los logs del container al iniciar con el siguiente comando.
docker logs pihole
Mordor Blog – Parte 1 – Instalar Dockers en Raspberry-Pi
Mordor Blog – Parte 2 – Instalar Docker Compose
Mordor Blog – Parte 4 – Depliegue Docker Swarm