¡Hola lemoncoder 👋🏻🍋 ! En esta lección aprenderemos cómo conectar contenedores entre sí y con el mundo exterior. Cubriremos los diferentes tipos de redes disponibles en Docker y cómo gestionarlas.En esta lección aprenderemos cómo conectar contenedores entre sí y con el mundo exterior. Cubriremos los diferentes tipos de redes disponibles en Docker y cómo gestionarlas.
Se asume que has visto los siguientes vídeos para comenzar con este módulo:
| # | Tema | Contenido Clave |
|---|---|---|
| 1 | Teoría - Basics networking | Para ponernos un poco al día de conceptos básicos de networking en general |
| 2 | Teoría - Redes en Docker | Tipos de redes y cómo funcionan |
| 3 | Demo 1 - Listar redes y probar la red bridge | En esta demo, listaremos las redes disponibles y probaremos la conectividad en la red bridge. |
| 4 | Demo 2 - Cómo crear redes | En esta demo, crearemos redes personalizadas y conectaremos contenedores a ellas. |
| 5 | Demo 3 - Red de tipo host | En esta demo, exploraremos la red de tipo host y cómo se comporta en comparación con otras redes. |
| 6 | Demo 4 - Conectarse a la red no red | Uso de --network none, aislamiento completo y escenarios de pruebas / hardening. |
Docker Networking permite que los contenedores se comuniquen entre sí y con sistemas externos. Cada contenedor puede estar conectado a una o más redes, facilitando la comunicación en función de las necesidades de la aplicación.
Hasta ahora has estado usando la red por defecto en Docker, sin tu saberlo 🥲. Asi que durante esta clase vamosa a centrarnos con más cariño en toda la parte que tiene que ver con la conectividad entre mis contenedores.
Lo primero que necesitas saber es qué tipo de redes podemos usar en Docker.
Para ver las redes disponibles en tu host:
docker network lsLas redes por defecto incluyen:
-
bridge: Red por defecto para contenedores en una sola máquina -
host: El contenedor comparte la red del host -
none: El contenedor no tiene conectividad de red
La red bridge es la red por defecto de Docker. Proporciona aislamiento de red entre contenedores y el host.
Para poder ver la configuración de una red específica, usamos el comando docker network inspect:
docker network inspect bridgeTambién es bastante cómodo apoyarnos en herramientas como jq para formatear la salida JSON:
docker network inspect bridge --format '{{json .Containers}}' | jqEsta es la red donde todo ha estado funcionando hasta ahora sin que te dieras cuenta 😉. Asi que ahora vamos a usar la misma con conocimiento de causa.
Para crear un contenedor en la red bridge (que es la red por defecto), simplemente ejecutamos:
docker run -d --name web nginx
docker run -d --name web-apache httpdSi ahora echamos la red bridge, veremos que ambos contenedores están conectados a ella:
docker network inspect bridge --format '{{json .Containers}}' | jqYa que estamos en una red, yo puedo hacer que dos contenedores se comuniquen entre sí.
docker exec -ti web /bin/bashapt update && apt -y install net-tools iputils-pingO ahora también puedo usar el comando debug de docker:
docker debug webY este ya viene con la herramienta necesaria para hacer ping.
ping 172.17.0.3Sin embargo, si yo intento hacer ping por nombre de contenedor, no va a funcionar:
ping web-apache[!NOTE]>
Esta limitación se resuelve usando redes personalizadas.
Las redes personalizadas permiten que los contenedores se comuniquen entre sí por su nombre, en lugar de por su dirección IP, gracias a un servidor DNS integrado. Esta es la mejor práctica para aplicaciones multi-contenedor.
-
✅ Resolución DNS automática por nombre de contened
-
✅ Mejor aislamiento y seguridad
-
✅ Control total sobre la conectividad
-
✅ Flexibilidad para conectar y desconectar contenedores
Para poder crear una red personalizada, usamos el comando docker network create:
docker network create lemoncode-netY puedes confirmar que la misma se ha creado sin problemas usando de nuevo el comando:
docker network lsTambién puedes inspeccionarla de la misma forma que hicimos con bridge:
docker network inspect lemoncode-netY verás que la misma tiene asignado un rango de IPs diferente al de bridge.
Vale y ahora ¿Cómo la uso?
Lo único que debes añadir como parte del comando docker run es el flag --network seguido del nombre de la red personalizada que acabas de crear:
docker run -d --name lemon-web --network lemoncode-net nginxdocker debug lemon-web[!NOTE]>
Si es la primera vez que usas
docker debug, tendrás que instalar el paquete ifconfig-net-tools. Ping ya está incluido.
Si ahora quisieramos intentar comunicarnos con un contenedor que está en la red bridge, no vamos a poder:
ping 172.17.0.2docker run -d --name lemon-apache --network lemoncode-net httpdPodrás ver que ahora sí ambos contenedores están en la misma red personalizada:
docker network inspect lemoncode-netY que por lo tanto pueden comunicarse por nombre:
ping 172.18.0.2Y ahora ya si, si intentamos hacer ping por nombre de contenedor, ¡FUNCIONA!
ping lemon-apachePero espera ¿Qué pasa si quiero que un contenedor esté en múltiples redes al mismo tiempo? Pues eso es totalmente posible.
docker network connect bridge lemon-webY ahora si intentamos volver a comunicarnos, en este caso por IP con alguno de la red bridge, ¡FUNCIONA!
ping 172.17.0.3Como el nombre del contenedor sigue siendo único, podemos verificar que efectivamente está en ambas redes:
docker network inspect bridge
docker network inspect lemoncode-netComo has podido ver, Docker lo que hace es crear una red interna para que los contenedores puedan comunicarse entre sí. Pero ¿Qué pasa si quiero que un contenedor sea accesible desde fuera de Docker? Aquí es donde entra el port mapping.
Hasta ahora lo hemos hecho varias veces, pero ahora que sabes un poquito más de networking tiene todo más sentido.
Como nuestros contenedores están en una red aislada, no son accesibles desde fuera de Docker por defecto. Para hacerlos accesibles, necesitamos mapear puertos del host a puertos del contenedor.
# Mapear puerto 9090 del host al puerto 80 del contenedor
docker run -d -p 9090:80 nginxAhora puedes acceder al servidor en http://localhost:9090.### 🔓 Demo 8: Abriendo la puerta principal
El comando EXPOSE en un Dockerfile documenta los puertos que usa la aplicación:
FROM nginx
EXPOSE 80
EXPOSE 443Pero simplemente hace eso, documentar. No mapea los puertos automáticamente. Lo que sí podemos hacer gracias a esta documentación es de forma automática mapear los puertos expuestos usando el flag -P o --publish-all al ejecutar el contenedor.
docker run -d -P nginx-customo bien:
docker run -d --publish-all nginx-custom
Y luego puedes ver qué puertos se han mapeado automáticamente usando:
```bash
docker inspect nginx-customTambién puedes verlo con docker port:
docker port lemon-webAhora que ya hemos jugado un rato con la red bridge y las redes personalizadas, vamos a ver otro tipo de red que es la red host.
Este tipo de red es un poco especial porque el contenedor no tiene su propia red aislada, sino que comparte la red del host. Esto significa que el contenedor puede usar directamente los puertos del host sin necesidad de mapearlos.
Para usarlo lo único que debes hacer es usar el flag --network host al crear el contenedor:
docker run -dit --network host --name web-host nginxPor último tenemos la red no red 😶. Esta hace que el contenedor esté totalmente aislado del mundo exterior.
docker run -dit --network none --name no-net-alpine alpine ashPuedes comprobar que no tiene ninguna interfaz de red activa:
docker exec no-net-alpine ip link showPara eliminar una red personalizada que ya no necesites, usa el comando docker network rm seguido del nombre de la red:
docker network rm mi-redTambién puedes limpiar de un plumazo todas las redes que no estés usando con:
docker network pruneTambién puedes desconectar contenedores de una red específica antes de eliminarla:
docker network disconnect lemoncode-net lemon-webSi usas Docker Desktop, puedes aprovechar la extensión de ngrok para exponer tus contenedores al mundo exterior de forma segura y sencilla. Esto es útil cuando quieres compartir tu trabajo con alguien sin necesidad de configurar puertos o redes complicadas.
En esta épica aventura de networking has aprendido a:
- 🕵️ Espiar redes disponibles como un verdadero detective de Docker
- 🌉 Dominar la red bridge (y entender por qué es básica)
- 🏙️ Crear barrios VIP donde los contenedores se conocen por nombre
- 🚪 Abrir puertas al mundo exterior con port mapping como un portero profesional
- 🏠 Mudarte con tus contenedores usando la red host
- 🏝️ Crear ermitaños digitales con contenedores sin red
- 🧹 Limpiar como Marie Kondo para mantener Docker organizado
Ahora ya no eres solo alguien que ejecuta contenedores. ¡Eres el arquitecto de redes, el casamentero de contenedores, el ninja del networking! 🥷
En la siguiente clase seguiremos escalando en el mundo de Docker. Mientras tanto, ¡practica conectando contenedores como si fueras el Cupido de la tecnología! 💘
Happy networking! {🍋}
