Esta imagen ha sido creada para construir un cliente de minidyndns instalado en los servidores de de dns . Para serverpic se han instalado dos servidores de dns que, para esta documentación, por cuestiones de privacidad, denominaremos dns1.com y dns2.com. Por idéntica razón, el dominio que vamos a utilizar lo denominamos como dominio.es
Vamos a suponer también que el host donde vamos a instalar el cliente queremos que se llame lleida.dominio.es. Es indispensable que lleida se de de alta en los dos servidores minidyndns y vamos a suponer también que lleida se ha dado de alta en los servidores registrandolo en db.yml con el password passlleida.
Para descargar la imagen
docker pull jusaba/dns:latest
Para crear el contenedor, en el directorio donde se encuentre Dockerfile y se vaya a hacer el build se necesita un fichero con nombre start.sh con el siguiente contenido
#!/bin/bash
# /home/pi/ip/start.sh
# Soporte para numero indeterminado de servidores DNS
# Los servidores se pasan como variable SERVIDORES separados por comas
# Ejemplo: SERVIDORES=dns1.com,dns2.com,dns3.com
# O mediante variables servidor1, servidor2, etc. para compatibilidad
rm -f /home/pi/ip/ActualizaDNS.py
touch /home/pi/ip/ActualizaDNS.py
rm -f /var/spool/cron/crontabs/root
touch /var/spool/cron/crontabs/root
# Generar script Python que obtiene la IP pública y la envía como parámetro
echo "import requests" >> /home/pi/ip/ActualizaDNS.py
echo "from requests.auth import HTTPBasicAuth" >> /home/pi/ip/ActualizaDNS.py
echo "" >> /home/pi/ip/ActualizaDNS.py
echo "# Obtener IP publica" >> /home/pi/ip/ActualizaDNS.py
echo "try:" >> /home/pi/ip/ActualizaDNS.py
echo " myip = requests.get('https://api.ipify.org', timeout=10).text.strip()" >> /home/pi/ip/ActualizaDNS.py
echo "except:" >> /home/pi/ip/ActualizaDNS.py
echo " myip = requests.get('https://ifconfig.me/ip', timeout=10).text.strip()" >> /home/pi/ip/ActualizaDNS.py
echo "" >> /home/pi/ip/ActualizaDNS.py
# Si se usa la nueva variable SERVIDORES (separados por comas)
if [ -n "$SERVIDORES" ]; then
echo "$SERVIDORES" | tr ',' '\n' | while read servidor; do
servidor=$(echo "$servidor" | tr -d ' ')
if [ -n "$servidor" ]; then
echo "requests.get(f'http://${servidor}:8001/?myip={myip}', auth=HTTPBasicAuth('$host', '$password'))" >> /home/pi/ip/ActualizaDNS.py
fi
done
else
# Compatibilidad con formato antiguo (servidor1, servidor2, etc.)
i=1
while true; do
eval servidor=\$servidor$i
if [ -z "$servidor" ]; then
break
fi
echo "requests.get(f'http://${servidor}:8001/?myip={myip}', auth=HTTPBasicAuth('$host', '$password'))" >> /home/pi/ip/ActualizaDNS.py
i=$((i + 1))
done
fi
# Configurar cron
service cron stop
chmod 600 /var/spool/cron/crontabs/root
echo "*/${refresco} * * * * python3 /home/pi/ip/ActualizaDNS.py" >> /var/spool/cron/crontabs/root
service cron reload
cron -f
La imagen se ha creado mediante el siguiente Dockerfile
FROM debian:bookworm-slim
ENV TZ=Europe/Madrid
LABEL version=2.0
LABEL autor=Julian_Salas
RUN apt-get update -y && \
apt-get upgrade -y && \
apt-get install -y --no-install-recommends \
cron \
python3 \
python3-requests && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
COPY ./start.sh /home/pi/ip/start.sh
WORKDIR /home/pi/ip
CMD ["bash", "start.sh"]
Para la creación del contenedor se ha utilizado buildx para hacerlo multiplataforma
docker buildx build --platform=linux/amd64,linux/arm64,linux/arm/v7 -t jusaba/dns:latest . --push
El proyecto incluye un workflow de GitHub Actions que construye y publica automáticamente la imagen Docker cuando:
mainv* (ej: v1.0.0, v2.1.0)Para que el workflow funcione, debes configurar los siguientes secretos en tu repositorio de GitHub:
DOCKER_USERNAME: Tu usuario de Docker HubDOCKER_PASSWORD: Tu password o token de acceso de Docker HubPara publicar una nueva versión:
git tag v1.0.0
git push origin v1.0.0
Esto generará automáticamente las tags 1.0.0, 1.0 y latest en Docker Hub.
El contenedor soporta un número indeterminado de servidores DNS. Hay dos formas de configurarlos:
Usar una única variable SERVIDORES con los servidores separados por comas:
docker run -e host=lleida \
-e refresco=1 \
-e password=passlleida \
-e SERVIDORES=dns1.com,dns2.com,dns3.com \
-d --name dns jusaba/dns:latest
Para compatibilidad con versiones anteriores, también se pueden usar variables numeradas:
docker run -e host=lleida \
-e refresco=1 \
-e password=passlleida \
-e servidor1=dns1.com \
-e servidor2=dns2.com \
-e servidor3=dns3.com \
-d --name dns jusaba/dns:latest
| Variable | Descripción |
|---|---|
host | Nombre del host del dominio (ej: lleida para lleida.dominio.es). Debe estar dado de alta en los servidores DNS |
refresco | Tiempo en minutos de actualización de la IP |
password | Password con el que se ha dado de alta el host en los servidores DNS |
SERVIDORES | Lista de servidores DNS separados por comas (ej: dns1.com,dns2.com,dns3.com) |
servidor1, servidor2, ... | URLs de los servidores DNS (formato antiguo, mantiene compatibilidad) |
También se pueden almacenar las variables en un fichero parametros.env:
host=lleida
refresco=1
password=lleidapass
SERVIDORES=dns1.com,dns2.com,dns3.com
Y arrancar el contenedor así:
docker run --env-file parametros.env -d --name dns jusaba/dns:latest
Este proyecto es libre para utilizarlo como cliente de minidyndns
⌨️ La presentación de esta documentación ha sido posible gracias a Villanuevand 😊
Content type
Image
Digest
sha256:32276d99f…
Size
44.6 MB
Last updated
3 months ago
docker pull jusaba/dns