Este tutorial explorará el aprendizaje y la prueba de DNS en Docker. El DNS funciona de manera un poco diferente dependiendo de si está utilizando redes personalizadas o predeterminadas en su entorno. El buen funcionamiento de un DNS es importante con los contenedores, ya que no puede confiar en las direcciones IP en los contenedores porque los contenedores son muy dinámicos. Los contenedores tienden a ser efímeros y cambiantes. Es decir, se lanzan, derriban y se mueven con frecuencia entre entornos. Esta es la naturaleza de una arquitectura de microservicios. No se puede confiar en las direcciones IP como la forma de hablar de un contenedor a otro porque no hay garantía de que las direcciones IP sean las mismas. Esta es la razón por la que Docker tiene incorporada la nomenclatura de DNS y usa el nombre del contenedor como el equivalente a un nombre de host para que los contenedores se comuniquen entre sí. Exploremos cómo funciona el DNS en Docker.


Ejercicio de DNS de Docker

En este ejercicio, queremos completar los siguientes pasos.

  • Crea una nueva red personalizada
  • Encienda un contenedor de Ubuntu y conéctelo a la red personalizada
  • Encienda un segundo contenedor de Ubuntu y conéctelo a la red personalizada
  • Instale la utilidad Ping en ambos contenedores
  • Inicie ambos contenedores
  • Pruebe la conectividad de la red mediante pruebas de ping de ambos contenedores

Crea una red personalizada

Al crear una red personalizada en Docker, habilitamos la resolución DNS automática para cualquier contenedor que se adjunte a esta red. Debe asegurarse de nombrar cada contenedor, ya que el DNS en Docker funciona según el nombre del contenedor.

> red acoplable crear red_personalizada
f37fa69420f0bb17b0dc57ebce73005b9d82ae41ec6690754064ca346aad7a7d


> red acoplable ls
ID DE RED NOMBRE ALCANCE DEL CONTROLADOR
313d57da9944 puente puente local
f37fa69420f0 custom_network puente local
4c835cce5ea0 host host local
085638da5c3d ninguno nulo local

Crear el primer contenedor de Ubuntu

Cuando creamos el contenedor de Ubuntu, le damos un nombre y especificamos la red a la que se va a conectar. También instalamos ping de bash en el contenedor.

> Docker container run -it --name ubuntu_one --network custom_network ubuntu 
root @ b63bf5467665: / # apt update 
root @ b63bf5467665: / # apt install iputils-ping -y 
root @ b63bf5467665: / # exit 
exit

Crear segundo contenedor de Ubuntu

Para probar la conectividad de red entre contenedores, necesitamos configurar un segundo contenedor y conectarlo a la misma red personalizada.

> Docker container run -it --name ubuntu_two --network custom_network ubuntu 
root @ 899ef9635122: / # apt update 
root @ 899ef9635122: / # apt install iputils-ping -y 
root @ 899ef9635122: / # exit 
exit

Iniciar ambos contenedores

Un contenedor docker solo permanece en ejecución si hay un proceso activo ejecutándose en el contenedor. Desde que salimos del shell bash en cada contenedor anterior, se detuvieron. Podemos volver a ponerlos en marcha así.

> inicio del contenedor docker ubuntu_one ubuntu_two
ubuntu_one
ubuntu_two

Desde Ubuntu One Conéctese a Ubuntu Two

Ahora simplemente nos conectamos al contenedor y emitimos un comando ping de uno a otro.

> contenedor docker exec -it ubuntu_one ping -c 3 ubuntu_two
PING ubuntu_two (172.20.0.3) 56 (84) bytes de datos.
64 bytes de ubuntu_two.custom_network (172.20.0.3): icmp_seq = 1 ttl = 64 tiempo = 0.137 ms
64 bytes de ubuntu_two.custom_network (172.20.0.3): icmp_seq = 2 ttl = 64 tiempo = 0.148 ms
64 bytes de ubuntu_two.custom_network (172.20.0.3): icmp_seq = 3 ttl = 64 tiempo = 0,255 ms

--- estadísticas de ping ubuntu_two ---
3 paquetes transmitidos, 3 recibidos, 0% de pérdida de paquetes, tiempo 2063ms
rtt min / avg / max / mdev = 0,137 / 0,180 / 0,255 / 0,053 ms

Desde Ubuntu Two Conéctese a Ubuntu One

La misma prueba se puede realizar conectándose al segundo contenedor y probando la conectividad de la red al contenedor uno.

> contenedor docker exec -it ubuntu_two ping -c 3 ubuntu_one
PING ubuntu_one (172.20.0.2) 56 (84) bytes de datos.
64 bytes de ubuntu_one.custom_network (172.20.0.2): icmp_seq = 1 ttl = 64 tiempo = 0.192 ms
64 bytes de ubuntu_one.custom_network (172.20.0.2): icmp_seq = 2 ttl = 64 tiempo = 0.170 ms
64 bytes de ubuntu_one.custom_network (172.20.0.2): icmp_seq = 3 ttl = 64 tiempo = 0.168 ms

--- estadísticas de ping ubuntu_one ---
3 paquetes transmitidos, 3 recibidos, 0% de pérdida de paquetes, tiempo 2100ms
rtt min / avg / max / mdev = 0,168 / 0,176 / 0,192 / 0,010 ms

¡Funciona! Este ejercicio muestra cómo funciona DNS automáticamente con contenedores conectados a la misma red personalizada. Es bueno saberlo, ya que cuando tenga un proyecto con varios contenedores, querrá que puedan comunicarse fácilmente entre sí. Docker Compose facilita esto al crear automáticamente nuevas redes virtuales cuando inicia una aplicación, lo que hace que la comunicación del contenedor sea automática. Sin embargo, ayuda ver cómo funciona esto manualmente, para que sepamos lo que Docker compose realmente está haciendo por nosotros.


Resumen de cómo funciona el DNS de Docker

  • El DNS se utiliza para la comunicación entre contenedores.
  • El DNS funciona de manera diferente para la red puente predeterminada frente a las redes definidas a medida.
  • El comando –link se puede utilizar para DNS manual en la red de puente.
  • Utilice nombres, no direcciones IP: el direccionamiento IP estático para contenedores es un anti-patrón. En su lugar, use nombres para comunicarse.
  • Docker DNS: el demonio de Docker tiene un servidor DNS integrado que los contenedores usan de forma predeterminada.
  • Valores predeterminados de DNS: Docker predetermina el nombre de host al nombre del contenedor.
  • Es mucho más fácil crear una red personalizada en lugar de depender de un enlace en la red puente