Inmersión en las Redes de Docker

DockerBeginner
Practicar Ahora

Introducción

En este laboratorio, exploraremos conceptos avanzados de redes en Docker, partiendo de los fundamentos básicos. Analizaremos en profundidad los tres modos de red principales: Bridge (Puente), Host (Anfitrión) y None (Ninguno). También aprenderemos a crear redes personalizadas, conectar contenedores a través de diferentes redes y comprender las implicaciones de cada modo en la comunicación y el aislamiento de los contenedores. Esta experiencia práctica te proporcionará una base sólida en las prácticas de redes de Docker.

Este es un Laboratorio Guiado, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y ganar experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 98%. Ha recibido una tasa de valoraciones positivas del 100% por parte de los alumnos.

Redes de Puente Personalizadas

Aunque Docker proporciona una red de puente (bridge) por defecto, la creación de redes de puente personalizadas ofrece un mejor aislamiento y control sobre la comunicación entre contenedores.

  1. Primero, veamos la lista actual de redes de Docker:
docker network ls

Deberías ver algo como esto:

NETWORK ID     NAME      DRIVER    SCOPE
296d1b460b17   bridge    bridge    local
91199fc6ad2e   host      host      local
1078d2c781b6   none      null      local
  1. Ahora, vamos a crear una red de puente personalizada:
docker network create my-custom-bridge
  1. Enumera todas las redes de Docker nuevamente para verificar la creación:
docker network ls

Ahora deberías ver my-custom-bridge en la salida:

NETWORK ID     NAME               DRIVER    SCOPE
296d1b460b17   bridge             bridge    local
91199fc6ad2e   host               host      local
7215f99d0080   my-custom-bridge   bridge    local
1078d2c781b6   none               null      local
  1. Inicia dos contenedores en la red de puente personalizada e instala la utilidad ping:
docker run --network=my-custom-bridge --name container1 -d nginx
docker run --network=my-custom-bridge --name container2 -d nginx

Ahora, instalaremos la utilidad ping en ambos contenedores. Necesitamos hacer esto porque la imagen predeterminada de Nginx no incluye ping:

docker exec container1 apt-get update && docker exec container1 apt-get install -y iputils-ping
docker exec container2 apt-get update && docker exec container2 apt-get install -y iputils-ping
  1. Prueba la comunicación entre los contenedores:
docker exec container1 ping -c 4 container2

Deberías ver respuestas de ping exitosas, lo que demuestra que los contenedores en la misma red de puente personalizada pueden comunicarse utilizando los nombres de los contenedores. Esto funciona porque el DNS integrado de Docker resuelve los nombres de los contenedores a sus direcciones IP dentro de la misma red.

Si no ves pings exitosos, asegúrate de que ambos contenedores estén en ejecución (docker ps) y que hayas instalado correctamente la utilidad ping.

Conexión de Contenedores entre Redes

Docker permite que los contenedores se conecten a múltiples redes, facilitando la comunicación entre contenedores que se encuentran en redes distintas. Esto es particularmente útil cuando deseas aislar ciertos contenedores pero aún así permitir comunicaciones específicas entre ellos.

  1. Primero, vamos a crear una segunda red de puente personalizada:
docker network create my-second-bridge
  1. Verifica la creación de la red:
docker network ls

Ahora deberías ver ambas redes personalizadas:

NETWORK ID     NAME               DRIVER    SCOPE
296d1b460b17   bridge             bridge    local
91199fc6ad2e   host               host      local
7215f99d0080   my-custom-bridge   bridge    local
8a15f99d0081   my-second-bridge   bridge    local
1078d2c781b6   none               null      local
  1. Conecta el container2 a la nueva red:
docker network connect my-second-bridge container2

Este comando añade el container2 a la red my-second-bridge mientras lo mantiene conectado a my-custom-bridge.

  1. Crea un nuevo contenedor en la segunda red:
docker run --network=my-second-bridge --name container3 -d nginx
docker exec container3 apt-get update && docker exec container3 apt-get install -y iputils-ping
  1. Prueba la comunicación entre todos los contenedores:
docker exec container1 ping -c 2 container2
docker exec container1 ping -c 2 container3
docker exec container2 ping -c 2 container3

Observa los resultados:

  • container1 puede comunicarse con container2 (están en la misma red).
  • container1 no puede comunicarse con container3 (están en redes diferentes).
  • container2 puede comunicarse tanto con container1 como con container3 (está conectado a ambas redes).

Si container1 pudiera hacer ping a container3, significaría que algo falla en el aislamiento de tu red.

Modo de Red Host

El modo de red Host elimina el aislamiento de red entre el contenedor y el anfitrión (host) de Docker, permitiendo que el contenedor utilice directamente la red del host. Esto puede ser útil para maximizar el rendimiento, pero conlleva implicaciones de seguridad al reducir el aislamiento.

  1. Crea un contenedor utilizando el modo de red host:
docker run --network host --name host-container -d nginx
  1. Verifica la lista de redes actual:
docker network ls

No verás una red nueva para este contenedor porque está utilizando la red del host directamente.

  1. Verifica que el contenedor esté usando la red del host:
docker inspect --format '{{.HostConfig.NetworkMode}}' host-container

Esto debería devolver host.

  1. Intenta acceder a la página por defecto de Nginx desde tu máquina host:
curl localhost:80

Deberías ver la página de bienvenida de Nginx. Esto funciona porque el contenedor utiliza la red del host y Nginx está escuchando en el puerto 80 de la interfaz de red del anfitrión.

Nota: Si ya tienes un servicio ejecutándose en el puerto 80 de tu máquina host, este paso podría fallar. En ese caso, tendrías que detener el servicio existente primero.

Modo de Red None

El modo de red 'none' crea contenedores sin ninguna interfaz de red, aislándolos completamente de cualquier red. Esto es útil para lograr un aislamiento de seguridad máximo, pero significa que el contenedor no puede comunicarse a través de la red en absoluto.

  1. Crea un contenedor sin red:
docker run --network none --name isolated-container -d alpine sleep infinity
  1. Verifica la lista de redes actual:
docker network ls

No verás una red nueva para este contenedor porque no está conectado a ninguna.

  1. Verifica que el contenedor no tenga interfaz de red:
docker exec isolated-container ip addr

Solo deberías ver la interfaz de bucle invertido o loopback (lo). No habrá interfaces eth0 ni de ningún otro tipo.

  1. Intenta hacer ping a Google desde el contenedor aislado:
docker exec isolated-container ping -c 2 google.com

Esto debería fallar con un error de "Network is unreachable" (Red inalcanzable), ya que el contenedor no tiene acceso a la red.

Alias de Red y Descubrimiento de Servicios

Las redes de Docker admiten el descubrimiento de servicios mediante alias de red, lo cual es muy útil para crear aplicaciones resilientes y escalables. Esta función permite que múltiples contenedores respondan al mismo nombre DNS, facilitando un equilibrio de carga básico.

  1. Crea una nueva red de puente para este ejercicio:
docker network create service-network
  1. Verifica la creación de la red:
docker network ls

Deberías ver service-network en la lista.

  1. Crea dos contenedores con el mismo alias de red:
docker run -d --network service-network --network-alias myservice --name service1 nginx
docker run -d --network service-network --network-alias myservice --name service2 nginx
  1. Crea un contenedor cliente y usa nslookup para resolver el servicio:
docker run --rm --network service-network appropriate/curl nslookup myservice

Deberías ver las IPs de ambos contenedores, lo que demuestra que el servidor DNS embebido de Docker está realizando un equilibrio de carga entre los dos contenedores.

  1. Prueba el acceso al servicio varias veces:
for i in {1..4}; do docker run --rm --network service-network appropriate/curl ping -c 1 myservice; done

Deberías ver respuestas de ambos contenedores, demostrando el equilibrio de carga básico. El servidor DNS de Docker alternará entre las dos direcciones IP al resolver myservice.

PING myservice (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.106 ms

--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.106/0.106/0.106 ms
PING myservice (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.119 ms

--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.119/0.119/0.119 ms
PING myservice (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.097 ms

--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.097/0.097/0.097 ms
PING myservice (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.140 ms

--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.140/0.140/0.140 ms

Resumen

En este laboratorio avanzado de redes de Docker, hemos explorado varios conceptos clave:

  1. Redes de puente personalizadas para mejorar el aislamiento y la comunicación de los contenedores.
  2. Conexión de contenedores a través de múltiples redes.
  3. Modo de red Host para acceso directo a la pila de red del anfitrión.
  4. Modo de red None para un aislamiento de red total.
  5. Alias de red y descubrimiento de servicios para construir aplicaciones escalables.

Estas características avanzadas de red en Docker proporcionan herramientas potentes para diseñar aplicaciones complejas de múltiples contenedores con un control preciso sobre la comunicación y el aislamiento. Comprender estos conceptos es crucial para diseñar aplicaciones contenedorizadas eficientes, seguras y escalables.

Recuerda que, aunque las redes de Docker ofrecen una gran flexibilidad, es importante considerar las implicaciones de seguridad al diseñar la arquitectura de red de tus contenedores. Sigue siempre el principio de mínimo privilegio, exponiendo únicamente los puertos y servicios estrictamente necesarios.

A medida que continúes trabajando con Docker, estos conceptos de red te resultarán invaluables para orquestar aplicaciones complejas y arquitecturas de microservicios. Practica estos conceptos con regularidad para dominar la gestión eficaz de las redes de Docker.