Completo de Redes en Docker

Tutorial de Redes en Docker

Tabla de Contenidos

  1. Conceptos Básicos

  2. Tipos de Redes Docker

  3. Comandos Básicos

  4. Ejemplos Prácticos

  5. Redes Personalizadas

  6. Mejores Prácticas

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)

bash
# Red bridge por defecto
docker network ls

2. Host

bash
# Usa la red del host directamente
docker run --network host nginx

3. None

bash
# Sin acceso a red
docker run --network none nginx

4. Overlay

bash
# Para contenedores en diferentes hosts (Docker Swarm)
docker network create -d overlay my-overlay

5. Macvlan

bash
# 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-macvlan

Comandos Básicos

Listar redes

bash
docker network ls

Inspeccionar una red

bash
docker network inspect bridge

Crear una red

bash
docker network create mi-red

Conectar un contenedor a una red

bash
docker network connect mi-red mi-contenedor

Desconectar un contenedor

bash
docker network disconnect mi-red mi-contenedor

Eliminar una red

bash
docker network rm mi-red

Ejemplos Prácticos

Ejemplo 1: Comunicación entre contenedores en la misma red

bash
# 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:80

Ejemplo 2: Aplicación web con base de datos

bash
# 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-image

Ejemplo 3: Múltiples redes

bash
# 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 app

Redes Personalizadas

Crear red bridge personalizada

bash
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-personalizada

Configurar DNS personalizado

bash
docker network create \
  --driver bridge \
  --dns=8.8.8.8 \
  --dns-search=mydomain.local \
  mi-red-dns

Red con IP fija

bash
docker run -d --name contenedor-fijo \
  --network mi-red \
  --ip 172.20.0.100 \
  nginx

Docker Compose con Redes

Ejemplo de docker-compose.yml

yaml
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: bridge

Comandos Avanzados

Limpiar redes no utilizadas

bash
docker network prune

Ver tráfico de red

bash
# Instalar tcpdump en el host
docker run --rm -it --net=host nicolaka/netshoot tcpdump -i docker0

Diagnosticar problemas de red

bash
# Usar imagen de troubleshooting
docker run -it --rm --network container:mi-contenedor nicolaka/netshoot

# Comandos útiles dentro del contenedor
ping web
nslookup database
netstat -tulpn

Mejores Prácticas

1. Seguridad

bash
# No usar --network=host en producción
# Aislar redes por función
docker network create --internal red-interna

2. Nomenclatura

bash
# Usar nombres descriptivos
docker network create backend-database
docker network create frontend-public

3. Configuración de IP

bash
# Planificar subredes
docker network create --subnet=10.1.0.0/16 red-app
docker network create --subnet=10.2.0.0/16 red-db

4. Monitoreo

bash
# Ver estadísticas de red
docker stats

# Inspeccionar tráfico
docker run -it --rm --net=container:mi-contenedor nicolaka/netshoot iftop

Scripts Útiles

Crear entorno de red completo

bash
#!/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

bash
#!/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

bash
# 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 contenedor2

Problema: Puerto ya en uso

bash
# 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

bash
# Es la red que Docker crea por defecto
docker network ls

Caracterí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

bash
# El contenedor usa la red del equipo anfitrión directamente
docker run --network host nginx

Caracterí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

bash
# Contenedor sin acceso a red
docker run --network none mi-aplicacion

4. Redes Definidas por el Usuario

bash
# Crear redes personalizadas para mayor control
docker network create mi-red-personalizada

🛠️ Sintaxis Básica de Redes

1. Crear una Red

bash
# 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-personalizada

2. Listar Redes Disponibles

bash
docker network ls

3. Inspeccionar una Red

bash
docker network inspect mi-red

4. Conectar un Contenedor a una Red

bash
# 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-existente

5. Conectar a Múltiples Redes

bash
# 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-backend

6. Desconectar un Contenedor

bash
docker network disconnect mi-red mi-contenedor

7. Eliminar una Red

bash
docker network rm mi-red

# Eliminar redes no utilizadas
docker network prune

📝 Ejemplos Prácticos

Ejemplo 1: Aplicación Web con Base de Datos

bash
# 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-app

Ejemplo 2: Comunicación entre Contenedores

bash
# 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:

yaml
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: bridge

Ejemplo Avanzado con Comunicación:

yaml
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:

yaml
# 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: bridge

La aplicación puede conectarse a la base de datos usando:

  • Nombre del servicio: database

  • Nombre del contenedor: nombre-proyecto-database-1

Ejemplo de Conexión:

python
# 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

bash
docker network inspect mi-red | grep -A 10 "Containers"

2. Probar Conectividad

bash
# 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:80

3. Limpieza de Redes

bash
# 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 RedAislamientoRendimientoCasos de Uso
Bridge✅ Alto🟡 MedioDesarrollo, aplicaciones aisladas
Host❌ Ninguno✅ AltoAlto rendimiento, monitoring
None✅ Total✅ AltoProcesos sin red
Usuario✅ Configurable🟡 MedioAplicaciones complejas

🚀 Ejemplo Final: Arquitectura Completa

yaml
# 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

Entradas más populares de este blog

ejercicios-Crear Carpeta y Archivo de Texto en Ubuntu

Instalar Docker en Ubuntu Server usando docker.io

Tutorial de Carpetas y Directorios en Ubuntu Linux