docker-redes-conceptos

Conceptos de red en Docker

  • 5 min

Las redes virtuales en Docker son un canal de comunicación seguro y aislado, que permite a los contenedores intercambiar datos entre sí, con el sistema anfitrión o con el mundo exterior.

Tus aplicaciones, normalmente, necesitarán conectividad. Pero en el caso de Docker, estas aplicaciones viven dentro de contendores aislados.

Así que en Docker, la red no es un cable físico, si no un componente de software. En esta entrada vamos a aprender a utilizarlas.

El aislamiento por defecto

Lo primero que tenemos que recordar es que un contenedor es un entorno hermético, aislado de tu ordenador.

Cuando arrancas un contenedor, Docker le asigna:

  1. Su propia pila de red (Network Stack).
  2. Su propia dirección IP (privada e interna).
  3. Su propio rango de puertos (del 1 al 65535).

Esto significa que si tienes un contenedor corriendo Nginx en el puerto 80, ese puerto 80 es del contenedor.

No tiene nada que ver con el puerto 80 de tu ordenador (Host). De hecho, tu ordenador ni siquiera sabe que ese Nginx existe.

Para romper este aislamiento, de forma controlada, Docker utiliza Drivers de Red.

Los drivers de red

Docker tiene varios modos de conectar estas islas. Vamos a ver los tres fundamentales que vienen de serie y cubren el 95% de los casos de uso.

DriverAislamientoRendimientoUso Recomendado
Bridge🟢 Alto (NAT)🟢 BuenoEstándar. El 99% de tus contenedores.
Host❌ Nulo🟢 NativoCasos específicos de rendimiento o protocolos de red complejos.
None🟢 Total❌ N/ASeguridad extrema / Trabajos aislados.

Es el modo por defecto. Si no especificas nada, tu contenedor nace aquí.

Imagina un Switch virtual dentro de tu ordenador. Todos los contenedores se conectan a este switch.

  • Entre ellos: Pueden hablarse si conocen sus IPs (o nombres, como veremos luego).
  • Con el exterior: Usan tu ordenador como pasarela (NAT) para salir a Internet.
  • Desde fuera: ¡Nadie puede entrar! Están protegidos detrás del NAT.

Es como la red WiFi de tu casa. Tus dispositivos tienen IPs privadas (192.168…) y salen a internet por el Router. Desde internet nadie puede acceder a tu impresora directamente a menos que configures el router.

Este es el driver que usaremos casi siempre, combinándolo con la publicación de puertos (-p) para dejar entrar tráfico selectivamente.

Este modo elimina el aislamiento de red. El contenedor comparte directamente la tarjeta de red de tu ordenador (Host).

Si el contenedor escucha en el puerto 80, está ocupando el puerto 80 real de tu tarjeta de red.

  • Ventaja: Rendimiento máximo (no hay NAT ni capas intermedias).
  • Desventaja: Solo puedes ejecutar un contenedor que use un puerto específico. No puedes tener dos Nginx en modo host porque ambos pelearían por el puerto 80 de tu PC.
docker run --network host nginx
Copied!

El driver host funciona de forma nativa en Linux. En Docker Desktop para Windows y Mac, debido a la máquina virtual intermedia, este driver tiene limitaciones y no funciona exactamente igual (el puerto no se expone directamente a Windows).

Como su nombre indica: Sin red.

El contenedor tiene una interfaz de loopback (localhost) y ya está. No tiene cable de red. No puede salir a internet, no puede hablar con otros contenedores y nadie puede hablar con él.

¿Para qué sirve? Para tareas de máxima seguridad o procesos batch que solo necesitan procesar archivos locales y queremos garantizar que no filtran datos a internet.

Verlo en práctica

Vamos a usar nuestros comandos de gestión para ver qué redes tenemos ahora mismo en nuestro Docker. El comando es:

docker network ls

Deberías ver algo así:

NETWORK ID     NAME      DRIVER    SCOPE
a1b2c3d4e5     bridge    bridge    local
f6g7h8i9j0     host      host      local
k1l2m3n4o5     none      null      local
Copied!

Ahí están las tres que acabamos de explicar. Docker las crea automáticamente al instalarse.

Inspeccionando la red

Si quieres ver los detalles técnicos de la red bridge (por ejemplo, qué rango de IPs está usando o qué contenedores están conectados a ella), usamos el comando inspect:

docker network inspect bridge

Esto te devolverá un JSON enorme. No te asustes. Busca la sección "Containers". Si tienes algún contenedor corriendo, lo verás ahí con su IP interna asignada (normalmente del tipo 172.17.0.x).

El problema del Driver Bridge

El driver bridge es genial porque protege nuestros contenedores. Pero tiene un problema: Si están protegidos, ¿cómo veo mi página web desde el navegador?

Aquí es donde entra el concepto de Publicación de Puertos (Port Forwarding), esa famosa bandera -p 80:80 que hemos usado sin pensar. En el siguiente artículo vamos a entender qué hace realmente ese comando.