Docker Networking: conectando contenedores
Docker crea redes virtuales para que los contenedores se comuniquen entre si. Por defecto, cada contenedor se conecta a una red bridge que le da acceso a internet, pero los contenedores en la red bridge por defecto NO se pueden comunicar por nombre.
Tipos de redes en Docker:
• bridge (default): Red aislada en el host. Los contenedores se comunican por IP, pero NO por nombre en la red default. • custom bridge: Red creada por ti. Los contenedores SI se resuelven por nombre (DNS automatico). • host: El contenedor comparte la red del host directamente. Sin aislamiento de puertos. • none: Sin red. Contenedor totalmente aislado.
# Listar redes existentes
docker network ls
# Crear una red custom
docker network create mi-red
# Ejecutar contenedores en la misma red custom
docker run -d --name api --network mi-red node:20-alpine sleep 3600
docker run -d --name db --network mi-red postgres:16-alpine
# Desde "api" puedes hacer ping a "db" por nombre!
docker exec api ping db
# Responde: PING db (172.18.0.3): 56 data bytes
# Conectar un contenedor existente a otra red
docker network connect mi-red contenedor-existente
# Desconectar de una red
docker network disconnect bridge contenedor-existente
# Inspeccionar una red (ver contenedores conectados)
docker network inspect mi-red
Port mapping (mapeo de puertos):
Cuando usas -p HOST:CONTENEDOR, Docker redirige trafico del puerto del host al contenedor.
• -p 8080:3000 → accedes en localhost:8080, llega al puerto 3000 del contenedor • -p 127.0.0.1:8080:3000 → solo accesible desde localhost (mas seguro) • -p 3000 → Docker asigna un puerto aleatorio del host
DNS entre contenedores: En una red custom, Docker ejecuta un DNS interno. Cada contenedor se registra con su --name como hostname. Asi "api" puede conectarse a "db:5432" sin conocer la IP.
# docker-compose.yml con redes personalizadas
version: "3.8"
services:
frontend:
image: nginx:alpine
ports:
- "80:80"
networks:
- frontend-net
api:
build: ./api
ports:
- "3000:3000"
networks:
- frontend-net
- backend-net
db:
image: postgres:16-alpine
networks:
- backend-net
networks:
frontend-net:
backend-net:
# frontend NO puede hablar con db (redes separadas)
# api puede hablar con ambos (esta en las dos redes)
Practica esta lección
Resuelve los ejercicios del curso de Docker & Kubernetes en la app, gratis y con corrección automática.
Empezar a practicar