1.4 · Redes: hacer dialogar a los contenedores

Nivel 1 · Contenedores: imágenes, volúmenes, redes

1.4Redes: hacer dialogar a los contenedores

Objetivo: conectar dos contenedores entre sí en una red dedicada, sin exponer la base.
Tiempo estimado: 12 min · lectura autónoma · Si solo tienes 5 min: lee «Lo esencial en 30s» + el esquema.

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.

Error frecuente de interpretación: « Quedarse en el bridge por defecto con IP basta, y publicar la base ayuda a depurar ». No. Sin red dedicada, sin DNS por nombre: las IP cambian y la config se rompe. Y publicar la base « para probar » la expone a toda la máquina — un olvido basta para dejar Postgres abierto. Red dedicada + nombres + base sin publicar.
Red dedicada: cablear una app Una red por app: frontal publicado, base interna Red monapp create,una por appweb publicada -p Accesibledesde fuerabdd interna :5432 Accesible pornombre, nunca publicada
Una red por app: frontal publicado, base interna
Versión en texto del esquema (SEO / lectores de pantalla / traducción): 1) Crear: Idir crea la red monapp — una por aplicación, nombrada claramente. 2) Conectar: bdd relanzada en ella sin -p (invisible fuera), web relanzada en ella con -p 8080:80 (el único frontal). 3) Probar: ping bdd desde web — la resolución por nombre responde. Lección: publicar la base habría expuesto Postgres a toda la máquina; el nombre bdd:5432 sigue válido aunque la IP cambie.

🔎 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

  1. Cree una red monapp.
  2. Lance la base en ella, SIN publicación de puerto.
  3. Lance la web en ella, CON publicación 8080:80.
  4. Desde la web (exec), haga ping a la base por su nombre.
Sus servicios dialogan por nombres, con una superficie expuesta mínima.

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.

Lista de salida de la sección
  • 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.
Autoevaluación 1-5: ¿mi base es accesible por nombre sin estar publicada?¿sé probar el cableado (inspect, 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.

Comprueba tu comprensión

En una red dedicada, ¿cómo debe la web alcanzar la base llamada « bdd »?

Recursos adicionales (opcional, para ir más allá)

Examen del nivel 1Preguntas inéditas y más difíciles para validar tus conocimientos