1.4Redes: hacer dialogar a los contenedores
Lo esencial en 30 segundos
- El bridge por defecto aísla sin nombrar : cada contenedor tiene una IP privada, pero los nombres no se resuelven ahí — se chapucea con IP que cambian.
- Una red por aplicación : docker network create monapp y luego --network monapp en cada run — desde la web, la base se alcanza por su --name (bdd:5432).
- Frontal publicado, base interna : solo se publica (-p) la web; la base queda invisible desde fuera pero accesible desde dentro — inspect y ping prueban el cableado.
Minicaso conductor — Idir cablea web + base
La demo de Idir crece: su frontal debe hablar con la base por su nombre, no por una IP anotada en un pósit. Crea una red monapp, relanza bdd en ella sin publicar su puerto, luego relanza web en ella con -p 8080:80. Desde la web, hace ping a bdd: responde por nombre. Cuando un colega sugiere « publicar la base para probar », Idir se niega: exponer Postgres a toda la máquina para una prueba es instalar un hábito peligroso.
Continuación del caso 1.1-1.3 — Idir pasa de los contenedores aislados a una aplicación cableada.
1. La red por defecto aísla
Cada contenedor recibe una IP privada en la red bridge por defecto, pero los nombres no se resuelven ahí: se chapucea con IP que cambian en cada relanzamiento. Codificar una IP en duro en la config es programar la próxima avería.
La buena práctica es crear una red dedicada por aplicación: Docker activa ahí la resolución por nombre.
2. Una red por aplicación
docker network create monapp y luego --network monapp en el run de cada servicio: desde la web, la base se alcanza por su --name (bdd:5432). Solo se publica (-p) el frontal; la base queda invisible desde fuera pero accesible desde dentro.
Este esquema « una red, un frontal publicado » es exactamente lo que Compose automatizará en el nivel 3.
3. Ver para creer: inspect y ping
docker network ls e inspect muestran quién está conectado dónde. Desde un contenedor, ping bdd o una conexión prueba la resolución. Método: crear, conectar, probar — en este orden.
Si dos contenedores no se ven, se verifica primero que compartan la misma red, luego que se acceda al nombre y no a una IP.
🔎 Ejemplo concreto — 🔎 Ejemplo concreto — Web + base en red privada
La aplicación cableada de Idir: un frontal, una base invisible.
docker network create monapp
docker run -d --name bdd --network monapp -e POSTGRES_PASSWORD=secret postgres:16.4
docker run -d --name web --network monapp -p 8080:80 nginx:1.27
docker exec web ping -c2 bdd
Lectura: el ping funciona por nombre, sin publicar la base.
Lección: publicar la base habría expuesto Postgres a toda la máquina.
Vocabulario de la sección
- Bridge
- Controlador de red aislado por defecto entre contenedores y anfitrión; sin resolución por nombre.
Ejemplo sencillo: La red por defecto donde Idir chapuceaba con IP.
Lo que no es: una red de aplicación con DNS por nombre.
Reflejo: defecto = provisional, app = red dedicada.
- Red dedicada
- Red creada por aplicación (network create), con resolución DNS por nombre entre sus contenedores.
Ejemplo sencillo: monapp, donde web alcanza bdd:5432.
Lo que no es: una red por contenedor.
Reflejo: separar por app, no por servicio.
- Resolución por nombre
- Alcanzar un contenedor por su --name en lugar de por su IP cambiante.
Ejemplo sencillo: ping bdd desde web, válido tras cada relanzamiento.
Lo que no es: una IP codificada en duro en la config.
Reflejo: siempre el nombre, nunca la IP.
- Frontal
- El único servicio publicado hacia fuera (la web); todo lo demás queda interno.
Ejemplo sencillo: web en 8080:80, bdd sin publicar en casa de Idir.
Lo que no es: cada servicio publicado « por si acaso ».
Reflejo: uno solo publicado: el frontal.
En la práctica — En práctica — Cablear una mini-app
- Cree una red monapp.
- Lance la base en ella, SIN publicación de puerto.
- Lance la web en ella, CON publicación 8080:80.
- Desde la web (exec), haga ping a la base por su nombre.
Script listo para decir — cablear dos contenedores (30 s)
« Creo una red por app: network create monapp. Conecto la base en ella sin publicar su puerto, y la web en ella con -p 8080:80. Desde la web, hago ping a la base por su nombre: bdd. El frontal está publicado, la base nunca. »
Para decir escribiendo create y luego los dos runs; terminar con el ping logrado.
Modelo copiar-pegar — app de dos servicios
docker network create monapp
docker run -d --name bdd --network monapp -e POSTGRES_PASSWORD=secret postgres:16.4
docker run -d --name web --network monapp -p 8080:80 nginx:1.27
docker exec web ping -c2 bdd # preuve par nom
docker network ls # vérifier les branchements
App de Idir
Como arriba: monapp, bdd interna, web publicada — el esquema que Compose retomará automáticamente en el nivel 3.
Dos apps conviven
monapp y compta, dos redes separadas: las bdd de cada app se alcanzan por nombre sin verse entre apps.
Diagnóstico de avería
Dos contenedores sordos: verificar network inspect por ambos lados — nueve de cada diez veces, no comparten la misma red.
Negativa a publicar la base
« Para probar »: no — se prueba desde la web con exec y ping, la base queda cerrada fuera. Hábito peligroso rechazado.
✓ Buenas prácticas
- Una red por aplicación, nombrada claramente.
- Publicar solo el frontal.
- Alcanzar por nombre, nunca por IP.
✗ Errores frecuentes
- Quedarse en el bridge por defecto (sin DNS).
- Publicar la base « para probar » y olvidarla.
- Codificar IP en duro en la config.
Puntos clave
- La red dedicada activa el DNS por nombre.
- Base en interno, frontal publicado: la regla.
- inspect y ping prueban el cableado.
- Compose retomará este esquema automáticamente.
Desafío 48h — aplique mañana
Cree monapp, conecte bdd (sin -p) y web (8080:80), luego haga ping a bdd por su nombre desde web. Verifique con network inspect quién está conectado dónde.
- Creo una red dedicada por aplicación.
- Solo publico el frontal, la base queda interna.
- Alcanzo los servicios por nombre y lo pruebo con ping.
Preguntas frecuentes
¿Por qué dos contenedores no se ven?
A menudo no comparten la misma red, o se intenta una IP en lugar del nombre. Verifique network inspect por ambos lados, luego acceda al --name.
¿Hace falta una red por contenedor?
No: una red por aplicación (web + base + caché juntas). Separar por app, no por servicio.
En una red dedicada, ¿cómo debe la web alcanzar la base llamada « bdd »?