Completo de Redes en Docker
Tutorial de Redes en Docker
Tabla de Contenidos
Conceptos Básicos
¿Qué son las redes en Docker?
Las redes en Docker permiten la comunicación entre contenedores, entre contenedores y el host, y con el mundo exterior.
Componentes principales:
Network Driver: Controla cómo se comunican los contenedores
Network Namespace: Espacio aislado de red
Bridge: Dispositivo virtual que conecta redes
Tipos de Redes Docker
1. Bridge (Por defecto)
# Red bridge por defecto
docker network ls2. Host
# Usa la red del host directamente
docker run --network host nginx3. None
# Sin acceso a red
docker run --network none nginx4. Overlay
# Para contenedores en diferentes hosts (Docker Swarm)
docker network create -d overlay my-overlay5. Macvlan
# Asigna direcciones MAC a contenedores
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 my-macvlanComandos Básicos
Listar redes
docker network lsInspeccionar una red
docker network inspect bridgeCrear una red
docker network create mi-redConectar un contenedor a una red
docker network connect mi-red mi-contenedorDesconectar un contenedor
docker network disconnect mi-red mi-contenedorEliminar una red
docker network rm mi-redEjemplos Prácticos
Ejemplo 1: Comunicación entre contenedores en la misma red
# Crear una red personalizada
docker network create red-app
# Ejecutar contenedores en la misma red
docker run -d --name web --network red-app nginx
docker run -d --name app --network red-app node-app
# Los contenedores pueden comunicarse usando sus nombres
# Desde 'app': curl http://web:80Ejemplo 2: Aplicación web con base de datos
# Crear red para la aplicación
docker network create app-network
# Base de datos
docker run -d --name db \
--network app-network \
-e MYSQL_ROOT_PASSWORD=secret \
mysql:8.0
# Aplicación web
docker run -d --name webapp \
--network app-network \
-p 8080:80 \
-e DB_HOST=db \
webapp-imageEjemplo 3: Múltiples redes
# Crear redes separadas
docker network create frontend-net
docker network create backend-net
# Contenedor en múltiples redes
docker run -d --name app \
--network frontend-net \
my-app
# Conectar a segunda red
docker network connect backend-net appRedes Personalizadas
Crear red bridge personalizada
docker network create \
--driver bridge \
--subnet=172.20.0.0/16 \
--gateway=172.20.0.1 \
--opt com.docker.network.bridge.name=mi-bridge \
mi-red-personalizadaConfigurar DNS personalizado
docker network create \
--driver bridge \
--dns=8.8.8.8 \
--dns-search=mydomain.local \
mi-red-dnsRed con IP fija
docker run -d --name contenedor-fijo \
--network mi-red \
--ip 172.20.0.100 \
nginxDocker Compose con Redes
Ejemplo de docker-compose.yml
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
networks:
- frontend
api:
image: node:14
networks:
- frontend
- backend
database:
image: postgres:13
environment:
POSTGRES_PASSWORD: secret
networks:
- backend
networks:
frontend:
driver: bridge
ipam:
config:
- subnet: 172.16.1.0/24
backend:
driver: bridgeComandos Avanzados
Limpiar redes no utilizadas
docker network pruneVer tráfico de red
# Instalar tcpdump en el host
docker run --rm -it --net=host nicolaka/netshoot tcpdump -i docker0Diagnosticar problemas de red
# Usar imagen de troubleshooting
docker run -it --rm --network container:mi-contenedor nicolaka/netshoot
# Comandos útiles dentro del contenedor
ping web
nslookup database
netstat -tulpnMejores Prácticas
1. Seguridad
# No usar --network=host en producción
# Aislar redes por función
docker network create --internal red-interna2. Nomenclatura
# Usar nombres descriptivos
docker network create backend-database
docker network create frontend-public3. Configuración de IP
# Planificar subredes
docker network create --subnet=10.1.0.0/16 red-app
docker network create --subnet=10.2.0.0/16 red-db4. Monitoreo
# Ver estadísticas de red
docker stats
# Inspeccionar tráfico
docker run -it --rm --net=container:mi-contenedor nicolaka/netshoot iftopScripts Útiles
Crear entorno de red completo
#!/bin/bash
# setup-networks.sh
echo "Creando redes de aplicación..."
# Red para frontend
docker network create \
--driver bridge \
--subnet=172.20.1.0/24 \
frontend-net
# Red para backend
docker network create \
--driver bridge \
--subnet=172.20.2.0/24 \
backend-net
# Red para base de datos
docker network create \
--driver bridge \
--subnet=172.20.3.0/24 \
database-net
echo "Redes creadas:"
docker network ls | grep -E "(frontend|backend|database)"Limpiar entorno
#!/bin/bash
# cleanup-networks.sh
echo "Deteniendo contenedores..."
docker stop $(docker ps -aq)
echo "Eliminando contenedores..."
docker rm $(docker ps -aq)
echo "Limpiando redes..."
docker network prune -f
echo "Limpieza completada"Troubleshooting Común
Problema: Contenedores no pueden comunicarse
# Solución:
# 1. Verificar que estén en la misma red
docker network inspect mi-red
# 2. Probar conectividad
docker exec -it contenedor1 ping contenedor2
# 3. Verificar DNS
docker exec -it contenedor1 nslookup contenedor2Problema: Puerto ya en uso
# Solución:
# Cambiar puerto o detener contenedor conflictivo
docker ps | grep :80
docker stop <contenedor-conflicto>Este tutorial cubre los conceptos esenciales de redes en Docker
📚 Introducción a las Redes Docker
Las redes en Docker facilitan la comunicación entre contenedores, permitiendo que interactúen y compartan datos de forma segura y controlada.
🏗️ Tipos de Redes en Docker
1. Red Bridge (Puente) - Predeterminada
# Es la red que Docker crea por defecto
docker network lsCaracterísticas:
✅ Contenedores en esta red pueden comunicarse entre sí
✅ Aislamiento del exterior
✅ Acceso a Internet desde los contenedores
✅ Asignación automática de IPs
2. Red Host
# El contenedor usa la red del equipo anfitrión directamente
docker run --network host nginxCaracterísticas:
✅ Comparte stack de red con el host
❌ No hay aislamiento de red
✅ Útil para aplicaciones que necesitan acceso directo a puertos
✅ Mejor rendimiento (sin NAT)
3. Red None
# Contenedor sin acceso a red
docker run --network none mi-aplicacion4. Redes Definidas por el Usuario
# Crear redes personalizadas para mayor control
docker network create mi-red-personalizada🛠️ Sintaxis Básica de Redes
1. Crear una Red
# Red básica
docker network create mi-red
# Red con configuración específica
docker network create \
--driver bridge \
--subnet=172.20.0.0/16 \
--gateway=172.20.0.1 \
mi-red-personalizada2. Listar Redes Disponibles
docker network ls3. Inspeccionar una Red
docker network inspect mi-red4. Conectar un Contenedor a una Red
# Al crear el contenedor
docker run -d --name mi-contenedor --network mi-red nginx
# A un contenedor existente
docker network connect mi-red mi-contenedor-existente5. Conectar a Múltiples Redes
# Conectar un contenedor a varias redes
docker network connect red-frontend mi-contenedor
docker network connect red-backend mi-contenedor
# Verificar conexiones
docker network inspect red-frontend
docker network inspect red-backend6. Desconectar un Contenedor
docker network disconnect mi-red mi-contenedor7. Eliminar una Red
docker network rm mi-red
# Eliminar redes no utilizadas
docker network prune📝 Ejemplos Prácticos
Ejemplo 1: Aplicación Web con Base de Datos
# 1. Crear redes
docker network create red-frontend
docker network create red-backend
# 2. Ejecutar base de datos en red backend
docker run -d --name mysql-db \
--network red-backend \
-e MYSQL_ROOT_PASSWORD=secret \
mysql:5.7
# 3. Ejecutar aplicación web en ambas redes
docker run -d --name web-app \
--network red-frontend \
-p 80:80 \
mi-aplicacion-web
# 4. Conectar la app a la red backend
docker network connect red-backend web-appEjemplo 2: Comunicación entre Contenedores
# Crear red personalizada
docker network create app-network
# Contenedor 1 - Servicio web
docker run -d --name web-service \
--network app-network \
nginx
# Contenedor 2 - Cliente (puede comunicarse con web-service)
docker run -it --name cliente \
--network app-network \
alpine ping web-service🐳 Uso de Redes en Docker Compose
Ejemplo Básico:
version: '3.8'
services:
web:
image: php:8.0-apache
ports:
- "8080:80"
networks:
- red-frontend
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: secret
networks:
- red-backend
networks:
red-frontend:
driver: bridge
red-backend:
driver: bridgeEjemplo Avanzado con Comunicación:
version: '3.8'
services:
frontend:
image: nginx:alpine
ports:
- "80:80"
networks:
- frontend-net
depends_on:
- backend
backend:
image: node:14
networks:
- frontend-net
- backend-net
environment:
- DB_HOST=database
database:
image: postgres:13
networks:
- backend-net
environment:
POSTGRES_PASSWORD: password
networks:
frontend-net:
driver: bridge
backend-net:
driver: bridge🔄 Comunicación entre Contenedores
En la Misma Red:
# docker-compose.yml
version: '3.8'
services:
app:
image: mi-aplicacion
networks:
- app-network
database:
image: mysql:5.7
networks:
- app-network
networks:
app-network:
driver: bridgeLa aplicación puede conectarse a la base de datos usando:
Nombre del servicio:
databaseNombre del contenedor:
nombre-proyecto-database-1
Ejemplo de Conexión:
# En tu aplicación Python
import mysql.connector
# Usando el nombre del servicio como host
db = mysql.connector.connect(
host="database", # ← Nombre del servicio
user="root",
password="secret"
)🎯 Comandos Prácticos para el Día a Día
1. Ver Contenedores en una Red
docker network inspect mi-red | grep -A 10 "Containers"2. Probar Conectividad
# Desde un contenedor, probar conexión a otro
docker exec -it mi-contenedor ping otro-contenedor
# Usar curl para probar servicios web
docker exec -it mi-contenedor curl http://web-service:803. Limpieza de Redes
# Eliminar todas las redes no utilizadas
docker network prune
# Eliminar un contenedor de todas sus redes
docker rm -f mi-contenedor📊 Tabla Resumen de Tipos de Red
| Tipo de Red | Aislamiento | Rendimiento | Casos de Uso |
|---|---|---|---|
| Bridge | ✅ Alto | 🟡 Medio | Desarrollo, aplicaciones aisladas |
| Host | ❌ Ninguno | ✅ Alto | Alto rendimiento, monitoring |
| None | ✅ Total | ✅ Alto | Procesos sin red |
| Usuario | ✅ Configurable | 🟡 Medio | Aplicaciones complejas |
🚀 Ejemplo Final: Arquitectura Completa
# docker-compose.yml
version: '3.8'
services:
# Frontend - Accesible desde exterior
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
networks:
- frontend-network
depends_on:
- app
# Aplicación principal
app:
image: node:14
networks:
- frontend-network
- backend-network
environment:
- DB_HOST=postgres
- REDIS_HOST=redis
# Base de datos - Solo backend
postgres:
image: postgres:13
networks:
- backend-network
environment:
POSTGRES_PASSWORD: password
# Cache - Solo backend
redis:
image: redis:alpine
networks:
- backend-network
networks:
frontend-network:
driver: bridge
backend-network:
driver: bridge❓ Preguntas Frecuentes
¿Cómo se comunican los contenedores?
Usando el nombre del servicio/contenedor como hostname dentro de la misma red.
¿Puedo cambiar la red de un contenedor en ejecución?
Sí, usando docker network connect y docker network disconnect.
¿Las redes persisten al eliminar contenedores?
Sí, las redes se mantienen hasta que las elimines explícitamente.
✅ Resumen Final
Red Bridge: Predeterminada, contenedores se comunican entre sí
Red Host: Máximo rendimiento, sin aislamiento
Redes Personalizadas: Control total sobre la configuración
Docker Compose: Define redes en el archivo YAML
Comunicación: Usar nombres de servicio como hostnames
Comentarios
Publicar un comentario