How do I manage DNS in Docker?

La gestión de DNS en Docker implica configurar el demonio de Docker, establecer servidores DNS personalizados y comprender cómo las redes de contenedores resuelven nombres. Esto garantiza una comunicación de servicios confiable.
Índice
Cómo gestionar DNS en Docker 2

How Do I Manage DNS in Docker?

Docker ha transformado la forma en que desplegamos y gestionamos aplicaciones, permitiendo entornos consistentes en diversas plataformas. Uno de los componentes clave que facilitan la comunicación entre contenedores y recursos externos es el Sistema de Nombres de Dominio (DNS). Una gestión adecuada del DNS en Docker puede conducir a un mejor rendimiento, fiabilidad y facilidad de uso. Este artículo explora la gestión avanzada de DNS en Docker, cubriendo conceptos esenciales, técnicas de configuración y ejemplos prácticos.

Comprender DNS en DockerDocker utiliza un sistema de nombres de dominio (DNS) integrado para proporcionar resolución de nombres para los contenedores. Este sistema DNS es responsable de resolver los nombres de host de los contenedores a sus direcciones IP correspondientes.Cuando se crea un contenedor, Docker lo agrega automáticamente a la red virtual de Docker y le asigna una dirección IP única. El contenedor también recibe un nombre de host que se basa en su nombre de contenedor. Por ejemplo, si crea un contenedor llamado "web", su nombre de host será "web".El sistema DNS de Docker mantiene una tabla de búsqueda que asocia los nombres de host de los contenedores con sus direcciones IP. Cuando un contenedor intenta conectarse a otro contenedor por su nombre de host, el sistema DNS de Docker resuelve el nombre de host a la dirección IP correcta y facilita la conexión.El sistema DNS de Docker también admite la resolución de nombres para los servicios que se ejecutan dentro de los contenedores. Si un contenedor ejecuta un servicio que se registra con el sistema DNS de Docker, otros contenedores pueden conectarse a ese servicio utilizando el nombre del servicio en lugar de la dirección IP.Además del sistema DNS integrado, Docker también admite el uso de servidores DNS externos. Puede configurar los contenedores para que utilicen servidores DNS específicos agregando la opción --dns al comando docker run. Esto le permite integrar Docker con su infraestructura DNS existente.En resumen, el sistema DNS de Docker proporciona una forma conveniente y confiable de resolver los nombres de host de los contenedores y los nombres de servicio dentro de un entorno Docker. Simplifica la comunicación entre contenedores y permite una fácil escalabilidad y administración de aplicaciones en contenedores.

Los contenedores Docker son inherentemente efímeros, lo que significa que pueden crearse y destruirse con frecuencia. Cuando los contenedores se comunican entre sí, a menudo necesitan resolver nombres de dominio a direcciones IP, y es aquí donde entra en juego el DNS. Docker proporciona un servidor DNS interno que ayuda a los contenedores a resolver los nombres de otros contenedores dentro de una red.

Core Concepts of Docker DNS

  1. Nomenclatura de contenedoresPor defecto, Docker asigna un nombre de host al contenedor basado en su nombre. Por ejemplo, un contenedor llamado web can be accessed by other containers using web como el nombre de host.

  2. Docker NetworksDocker permite la creación de redes definidas por el usuario. Los contenedores en la misma red definida por el usuario pueden comunicarse entre sí utilizando sus nombres de contenedor sin necesidad de conocer sus direcciones IP. El servidor DNS interno de Docker maneja estas resoluciones.

  3. Default Bridge Network: When you run a container without specifying a network, it connects to the default bridge network. This network has limitations in service discovery, as containers cannot resolve each other’s names unless you link them manually.

Configuración de DNS en Docker

Configuración básica de DNS

To manage DNS effectively in Docker, understanding how to configure DNS settings for your containers is crucial. By default, containers use the DNS settings of the Docker host. However, you can specify different DNS servers when creating a container.

docker run --dns 8.8.8.8 --dns 8.8.4.4 -d --name my_container my_image

En el comando anterior, instruimos a Docker para que utilice los servidores DNS públicos de Google (8.8.8.8 y 8.8.4.4) para el mi_contenedor instancia.

Modificar la configuración predeterminada de DNSEl servidor DNS (Domain Name System) es el servicio que traduce las direcciones web que escribes en tu navegador (como www.ejemplo.com) a direcciones IP numéricas que las computadoras pueden entender. Por defecto, tu computadora utiliza los servidores DNS proporcionados por tu proveedor de servicios de Internet (ISP), pero puedes cambiar esto para usar servidores DNS de terceros que pueden ofrecer mayor velocidad, seguridad o características adicionales.Para modificar la configuración de DNS en Windows, sigue estos pasos:1. Abre el Panel de Control y navega a Redes e Internet > Centro de redes y recursos compartidos.2. Haz clic en "Cambiar configuración del adaptador" en el panel izquierdo.3. Haz clic derecho en tu conexión de red activa (Ethernet o Wi-Fi) y selecciona "Propiedades".4. Selecciona "Protocolo de Internet versión 4 (TCP/IPv4)" y haz clic en el botón "Propiedades".5. En la pestaña "General", selecciona la opción "Usar las siguientes direcciones de servidor DNS" y escribe las direcciones IP de los servidores DNS que deseas utilizar. Algunas opciones populares incluyen:- Google Public DNS: 8.8.8.8 y 8.8.4.4 - Cloudflare: 1.1.1.1 y 1.0.0.1 - OpenDNS: 208.67.222.222 y 208.67.220.2206. Haz clic en "Aceptar" para guardar los cambios.Para modificar la configuración de DNS en macOS, sigue estos pasos:1. Abre Preferencias del Sistema y haz clic en "Red".2. Selecciona tu conexión de red activa (Ethernet o Wi-Fi) en la lista de la izquierda.3. Haz clic en el botón "Avanzado" en la esquina inferior derecha.4. Navega a la pestaña "DNS" y haz clic en el botón "+" en la parte inferior izquierda para agregar un nuevo servidor DNS.5. Escribe la dirección IP del servidor DNS que deseas utilizar y presiona Enter. Repite este paso para agregar un segundo servidor DNS si lo deseas.6. Arrastra los servidores DNS para ordenarlos según tu preferencia.7. Haz clic en "Aceptar" y luego en "Aplicar" para guardar los cambios.Recuerda que cambiar los servidores DNS puede afectar la velocidad de navegación y la capacidad de acceder a ciertos sitios web, dependiendo de la calidad y ubicación de los servidores DNS que elijas.

Para establecer servidores DNS globalmente para todos los contenedores, puedes modificar el archivo de configuración del demonio de Docker, que generalmente se encuentra en /etc/docker/daemon.json. If it doesn’t exist, you can create it. Below is an example configuration that sets custom DNS servers:

{
  "dns": ["8.8.8.8", "8.8.4.4"]
}

Después de realizar los cambios, reinicie el servicio de Docker para aplicar la nueva configuración:

sudo systemctl restart docker

Especificar dominios de búsqueda DNSSi su red utiliza nombres de dominio DNS internos, puede especificar dominios de búsqueda DNS para que los usuarios puedan acceder a los recursos de red utilizando nombres cortes en lugar de nombres de dominio completos. Por ejemplo, si especifica example.com como dominio de búsqueda DNS, los usuarios pueden acceder a un servidor llamado server1.example.com simplemente escribiendo server1 en la barra de direcciones de su navegador web.Para especificar dominios de búsqueda DNS, utilice el comando networksetup. El siguiente comando especifica example.com como dominio de búsqueda DNS para la interfaz de red Ethernet:networksetup -setsearchdomains Ethernet example.comPuede especificar múltiples dominios de búsqueda DNS separándolos con espacios. El siguiente comando especifica example.com y example.org como dominios de búsqueda DNS para la interfaz de red Ethernet:networksetup -setsearchdomains Ethernet example.com example.orgPara ver los dominios de búsqueda DNS actuales para una interfaz de red, utilice el comando -getsearchdomains. El siguiente comando muestra los dominios de búsqueda DNS para la interfaz de red Ethernet:networksetup -getsearchdomains Ethernet

Además de los servidores DNS, también puedes especificar dominios de búsqueda DNS, que ayudan a resolver nombres de host que no incluyen un nombre de dominio completo (FQDN). Esto es particularmente útil en aplicaciones de múltiples contenedores donde la comunicación interna es frecuente.

You can specify search domains with the --dns-search option:

docker run --dns-search example.local -d --name my_container my_image

Networking Modes and Their DNS Behavior

Docker admite varios modos de red que afectan el comportamiento de DNS.

1. Bridge Mode

When containers are run in bridge mode, they can communicate with each other using their names, thanks to the internal DNS server. This is the default mode for newly created containers.

2. Host Mode

In host mode, the container shares the host’s network stack. This means that the container won’t have an isolated network namespace. Consequently, DNS resolution will use the host’s DNS settings, and container names won’t be resolved to IP addresses within the container.

docker run --network host -d --name my_container my_image

3. Modo Superposición

Las redes overlay se utilizan en Docker Swarm para permitir la comunicación entre contenedores que se ejecutan en diferentes hosts Docker. Cuando se crea un servicio en una red overlay, Docker proporciona descubrimiento de servicios basado en DNS, lo que permite acceder a los servicios por sus nombres.

docker servicio crear --nombre my_service --red my_overlay my_image

Advanced DNS Features

Dynamic DNS (DDNS)

En entornos donde las IPs de los contenedores cambian con frecuencia, el DNS dinámico puede ser un salvavidas. Aunque Docker no tiene soporte nativo para DDNS, puedes integrar Docker con servicios de DDNS externos. Esto normalmente implica ejecutar un pequeño agente dentro de tu contenedor para actualizar los registros DNS en función de su dirección IP.

El almacenamiento en caché de DNS es una técnica utilizada para mejorar el rendimiento y la eficiencia de las consultas DNS. Cuando un cliente realiza una consulta DNS para resolver un nombre de dominio a una dirección IP, el servidor DNS puede almacenar la respuesta en su caché local durante un período de tiempo determinado. Esto significa que si otro cliente realiza la misma consulta dentro de ese período, el servidor DNS puede responder directamente desde su caché sin tener que realizar una nueva consulta a los servidores DNS autoritativos.El almacenamiento en caché de DNS ofrece varias ventajas:1. Reducción de la latencia: Al responder desde la caché, el servidor DNS puede proporcionar respuestas más rápidas, lo que mejora la experiencia del usuario.2. Reducción de la carga en los servidores DNS autoritativos: Al evitar consultas redundantes, se reduce la carga en los servidores DNS autoritativos, lo que mejora su rendimiento y escalabilidad.3. Ahorro de ancho de banda: Al reducir el número de consultas DNS que se envían a través de la red, se ahorra ancho de banda y se mejora la eficiencia general de la red.4. Mejora de la disponibilidad: Si los servidores DNS autoritativos no están disponibles temporalmente, el servidor DNS puede seguir respondiendo consultas desde su caché, lo que mejora la disponibilidad del servicio DNS.El tiempo durante el cual se almacena una respuesta DNS en la caché se conoce como tiempo de vida (TTL, por sus siglas en inglés). El TTL se especifica en el registro de recursos DNS y determina cuánto tiempo puede permanecer una respuesta en la caché antes de que expire y deba ser consultada nuevamente.Es importante tener en cuenta que el almacenamiento en caché de DNS también puede tener algunas desventajas:1. Información desactualizada: Si un registro DNS cambia antes de que expire su TTL, los clientes pueden seguir recibiendo información desactualizada desde la caché hasta que expire el TTL.2. Consumo de memoria: El almacenamiento en caché de DNS requiere memoria en el servidor DNS para almacenar las respuestas en caché, lo que puede ser un problema en entornos con recursos limitados.3. Posibles problemas de seguridad: Si un atacante logra envenenar la caché DNS con información falsa, los clientes pueden ser redirigidos a sitios web maliciosos.En resumen, el almacenamiento en caché de DNS es una técnica importante para mejorar el rendimiento y la eficiencia de las consultas DNS, pero también requiere una gestión cuidadosa para garantizar la precisión y la seguridad de la información almacenada en la caché.

Para mejorar el rendimiento y reducir la latencia en las búsquedas DNS, considere implementar un servidor DNS con caché como dnsmasq en su arquitectura. Al almacenar en caché las respuestas DNS, minimiza el tiempo que los contenedores dedican a realizar consultas DNS.

Puedes correr. dnsmasq en un contenedor secundario junto a tus contenedores de aplicación:

version: '3'
services:
  dnsmasq:
    image: andyshinn/dnsmasq:2.78
    ports:
      - "53:53/udp"
    command: ["--no-resolv", "--server=8.8.8.8", "--domain-needed", "--bogus-priv", "--listen-address=0.0.0.0"]

  app:
    image: my_app
    dns: 127.0.0.1
    depends_on:
      - dnsmasq

Descubrimiento de servicios con DNSEn esta sección, exploraremos cómo utilizar DNS para el descubrimiento de servicios en Kubernetes. DNS es un método común y eficiente para que los pods se comuniquen entre sí dentro de un clúster.Para demostrar esto, crearemos un nuevo deployment llamado "kuard" y expondremos un puerto específico:```bash kubectl run kuard --image=gcr.io/kuar-demo/kuard-amd64:blue --port=8080 ```Luego, expondremos este deployment como un servicio:```bash kubectl expose deployment kuard --type=LoadBalancer --port=80 --target-port=8080 ```Ahora, crearemos un pod temporal para probar la resolución DNS:```bash kubectl run -it --rm tools --image=alpine --restart=Never ```Dentro del pod, instalaremos la herramienta `bind-tools` para realizar consultas DNS:```bash apk add --no-cache bind-tools ```Una vez instalado, podemos realizar una consulta DNS para el servicio "kuard":```bash nslookup kuard ```Esto debería devolver la dirección IP del servicio "kuard".También podemos probar la conectividad con el servicio utilizando `wget`:```bash wget -O - -q http://kuard ```Esto debería devolver la página HTML del servicio "kuard".Finalmente, saldremos del pod temporal:```bash exit ```Ahora, limpiemos los recursos creados:```bash kubectl delete deployment kuard kubectl delete service kuard kubectl delete deployment tools ```En resumen, hemos demostrado cómo utilizar DNS para el descubrimiento de servicios en Kubernetes. Los pods pueden comunicarse entre sí utilizando el nombre del servicio, que se resuelve automáticamente a la dirección IP del servicio.

En las arquitecturas de microservicios, el descubrimiento de servicios se vuelve crítico. Docker Swarm proporciona descubrimiento de servicios integrado a través de DNS. Cuando se crea un servicio, Docker registra automáticamente el nombre del servicio y crea registros DNS para él. Los clientes pueden resolver el nombre del servicio para acceder al contenedor requerido.

Health Checks and DNS Resolution

Docker health checks can also impact DNS resolution. When a container fails its health check, DNS services will recognize the failure and can stop forwarding requests to the unhealthy container. This is particularly useful in a load-balanced environment where you want traffic to be directed only to healthy instances.

Troubleshooting DNS Issues in Docker

DNS problems can arise in various scenarios. Here are some common issues and their solutions:

1. Container Cannot Resolve Hostnames

Si un contenedor no puede resolver nombres de host, asegúrate de que esté conectado a la red correcta. Puedes inspeccionar la red con:

inspeccionar red 

2. Servidor DNS Inaccesible

If you configured a custom DNS server and the container cannot reach it, ensure that the DNS server is operational and that your container can access it (e.g., check firewall rules).

3. DNS Caching Issues

Si los cambios en los registros DNS no se reflejan en sus contenedores, podrían estar utilizando respuestas DNS almacenadas en caché. Reiniciar los contenedores o limpiar la caché DNS puede ayudar a mitigar estos problemas.

4. Conflicting DNS Settings

When running multiple containers or services, conflicting DNS settings can lead to confusion. Always ensure that DNS settings are consistent across your containers in a given network.

Conclusión

Managing DNS in Docker is a foundational aspect of orchestrating containerized applications. By understanding how Docker handles DNS, configuring DNS settings properly, leveraging advanced features like service discovery and dynamic DNS, and knowing how to troubleshoot common DNS issues, you can ensure robust and efficient communication between your containers. As you build increasingly complex applications with Docker, mastering DNS management will be crucial to maintaining a seamless user experience and achieving operational excellence.

Al emplear las técnicas discutidas en este artículo, puedes optimizar tu red Docker y mejorar el rendimiento general y la fiabilidad de tus aplicaciones. ¡Feliz Dockering!