📘 Documentación de Configuración del Servicio DNS con Bind9 en Docker

🧾 Descripción general

Este entorno de desarrollo define un servidor DNS maestro que resuelve nombres del dominio ficticio edt.carlos y sus subdominios usando Bind9, dentro de un contenedor Docker. También se integran otros servicios como nginx, laravel y mysql en una red común (net-m8).


📁 Estructura de archivos

project-root/
│
├── bind9/
│   ├── named.conf
│   └── db.edt.carlos
│
└── docker-compose.yml

📄 Archivo named.conf

options {
    directory "/var/cache/bind";
    listen-on { any; };
    listen-on-v6 { any; };
    allow-query { any; };
    recursion yes;
};

zone "edt.carlos" {
    type master;
    file "/etc/bind/db.edt.carlos";
};

zone "edt.carlos.admin" {
    type master;
    file "/etc/bind/db.edt.carlos";
};

🔍 Explicación:

  • options: configura el comportamiento general del servidor Bind.
  • Acepta peticiones desde cualquier IP (allow-query { any; };).
  • Permite recursividad.
  • zone:
  • Se definen dos zonas: edt.carlos y edt.carlos.admin, ambas gestionadas desde el mismo archivo de zona db.edt.carlos.

🗂️ Archivo db.edt.carlos

$TTL 86400
@ IN SOA edt.carlos. root.edt.carlos. (
    2025012901 ; Serial
    3600       ; Refresh
    1800       ; Retry
    1209600    ; Expire
    86400 )    ; Minimum TTL

@   IN  NS  ns.edt.carlos.
ns  IN  A   dns
@   IN  A   nginx
www IN  A   nginx

🔍 Explicación:

  • Se define la zona raíz edt.carlos con:
  • Servidor de nombres ns.edt.carlos.
  • Registro A que apunta:
    • ns.edt.carlos al contenedor dns.
    • edt.carlos y www.edt.carlos al contenedor nginx.
  • Los nombres (dns, nginx) se resuelven a través de Docker gracias a la red interna.

🐳 Archivo docker-compose.yml

services:
  mysql:
    image: alpine:latest
    container_name: mysql
    command: tail -f /dev/null
    networks: [net-m8]

  laravel:
    build:
      context: .
      dockerfile: Dockerfile-laravel
    container_name: laravel
    volumes:
      - laravel-app:/laravel
    networks: [net-m8]

  nginx:
    image: alpine:latest
    container_name: nginx
    depends_on: [laravel]
    command: tail -f /dev/null
    ports: ['80:80']
    networks: [net-m8]

  dns:
    image: ubuntu/bind9
    container_name: dns
    ports:
      - "53:53/tcp"
      - "53:53/udp"
    volumes:
      - ./bind9/named.conf:/etc/bind/named.conf
      - ./bind9/db.edt.carlos:/etc/bind/db.edt.carlos
    networks:
      - net-m8

volumes:
  laravel-app:
    driver: local

networks:
  net-m8:
    driver: bridge

🔍 Explicación:

  • El servicio dns usa la imagen oficial ubuntu/bind9.
  • Mapea los puertos estándar de DNS (53 TCP y UDP).
  • Monta los archivos de configuración de la zona y del servicio desde el directorio local bind9/.
  • Se conecta a la red net-m8, lo que permite resolver nombres de los demás contenedores.

🧪 Pruebas

Una vez todo esté en marcha (docker compose up -d), puedes hacer pruebas:

🔎 Desde el contenedor nginx:

apk add bind-tools  # instalar dig en Alpine
dig @dns www.edt.carlos

🔎 Desde el host:

dig @localhost www.edt.carlos