Sumérgete en las redes de Docker

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, exploraremos conceptos avanzados de redes de Docker, basándonos en los fundamentos de las redes de Docker. Profundizaremos en los tres principales modos de red: Bridge (Puente), Host (Anfitrión) y None (Ninguno). También aprenderemos cómo crear redes personalizadas, conectar contenedores en diferentes redes y comprender las implicaciones de cada modo de red 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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") subgraph Lab Skills docker/run -.-> lab-389047{{"Sumérgete en las redes de Docker"}} docker/exec -.-> lab-389047{{"Sumérgete en las redes de Docker"}} docker/inspect -.-> lab-389047{{"Sumérgete en las redes de Docker"}} docker/network -.-> lab-389047{{"Sumérgete en las redes de Docker"}} end

Redes de puente personalizadas

Si bien Docker proporciona una red de puente predeterminada, crear 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, creemos 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 ping:
docker run --network=my-custom-bridge --name container1 -d nginx
docker run --network=my-custom-bridge --name container2 -d nginx

Ahora, instalemos la utilidad ping en ambos contenedores. Debemos 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 nombres de contenedores. Esto funciona porque el DNS integrado de Docker resuelve los nombres de 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 de que hayas instalado correctamente la utilidad ping.

Conectando contenedores a través de redes

Docker permite que los contenedores se conecten a múltiples redes, lo que habilita la comunicación entre contenedores en diferentes redes. Esto es especialmente útil cuando se desea aislar ciertos contenedores pero aún permitir comunicaciones específicas entre ellos.

  1. Primero, creemos una segunda red de puente personalizada:
docker network create my-second-bridge
  1. Verifiquemos 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. Conectemos container2 a la nueva red:
docker network connect my-second-bridge container2

Este comando agrega container2 a la red my-second-bridge mientras mantiene su conexión a my-custom-bridge.

  1. Creemos 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. Probemos 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 diferentes redes)
  • container2 puede comunicarse tanto con container1 como con container3 (está conectado a ambas redes)

Si container1 pudiera hacer ping a container3, habría algo mal con el aislamiento de tu red.

Modo de red de anfitrión (Host Network Mode)

El modo de red de anfitrión elimina el aislamiento de red entre el contenedor y el anfitrión de Docker, permitiendo que el contenedor utilice directamente la red del anfitrión. Esto puede ser útil para maximizar el rendimiento, pero tiene implicaciones de seguridad ya que reduce el aislamiento.

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

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

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

Esto debería mostrar host.

  1. Intenta acceder a la página predeterminada de Nginx desde tu máquina anfitrión:
curl localhost:80

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

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

Modo de red "None"

El modo de red "none" crea contenedores sin interfaz de red, aislando completamente estos del resto de la red. Esto es útil para 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 actual de redes:
docker network ls

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

  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 (lo). No habrá ninguna interfaz eth0 u otras interfaces de red.

  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" (La red no es alcanzable), 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 utilizando alias de red, lo cual puede ser útil para crear aplicaciones resistentes y escalables. Esta característica permite que múltiples contenedores respondan al mismo nombre DNS, lo que habilita 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 utiliza nslookup para resolver el servicio:
docker run --rm --network service-network appropriate/curl nslookup myservice

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

  1. Prueba acceder 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, lo que demuestra un 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, exploramos varios conceptos clave:

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

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

Recuerda que, aunque la red de Docker ofrece gran flexibilidad, es importante considerar las implicaciones de seguridad al diseñar la arquitectura de tu red de contenedores. Siempre sigue el principio del menor privilegio, exponiendo solo los puertos y servicios necesarios.

A medida que continúes trabajando con Docker, encontrarás que estos conceptos de redes son invaluable para orquestar aplicaciones complejas y arquitecturas de microservicios. Practica estos conceptos regularmente para adquirir competencia en la gestión efectiva de las redes de Docker.