Docker Compose Networks

Intermedio
Docker
Docker
Actualizado: 13/08/2025

¡Desbloquea el curso de Docker completo!

IA
Ejercicios
Certificado
Entrar

Mira la lección en vídeo

Accede al vídeo completo de esta lección y a más contenido exclusivo con el Plan Plus.

Desbloquear Plan Plus

Redes en compose.yaml

Docker Compose permite definir y gestionar redes de forma declarativa mediante el archivo compose.yaml, proporcionando una alternativa más organizada y reproducible que los comandos manuales de docker network. Esta aproximación facilita la orquestación de aplicaciones multi-contenedor con requisitos específicos de conectividad.

Red por defecto

Cuando no especificas ninguna red en tu archivo compose.yaml, Docker Compose crea automáticamente una red bridge personalizada para todos los servicios del proyecto. Esta red recibe el nombre del directorio del proyecto seguido de _default.

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
  
  app:
    image: node:24-alpine
    command: npm start

En este ejemplo, ambos servicios web y app pueden comunicarse entre sí usando sus nombres de servicio como hostnames, gracias a la resolución DNS automática que proporciona Docker Compose.

Definición de redes personalizadas

Para casos más complejos, puedes definir redes personalizadas en la sección top-level networks del archivo compose.yaml:

services:
  frontend:
    image: nginx:latest
    networks:
      - frontend-net
      - shared-net
  
  backend:
    image: node:24-alpine
    networks:
      - backend-net
      - shared-net
  
  database:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secretpassword
    networks:
      - backend-net

networks:
  frontend-net:
    driver: bridge
  backend-net:
    driver: bridge
  shared-net:
    driver: bridge

Esta configuración crea tres redes separadas que permiten aislar y segmentar la comunicación entre servicios según las necesidades arquitecturales.

Configuración de redes en servicios

Dentro de cada servicio, la clave networks puede utilizarse de varias formas para controlar la conectividad:

1 - Asignación simple a redes:

services:
  api:
    image: node:24-alpine
    networks:
      - backend
      - monitoring

2 - Configuración avanzada con aliases:

services:
  database:
    image: mysql:8.0
    networks:
      backend:
        aliases:
          - db
          - mysql-server
          - primary-db
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword

Los aliases permiten que otros servicios en la misma red accedan al contenedor utilizando nombres alternativos, proporcionando flexibilidad en la comunicación entre servicios.

Opciones de configuración de red

Las redes definidas en el nivel superior admiten diversas opciones de configuración:

networks:
  production-net:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: prod-bridge
    ipam:
      driver: default
      config:
        - subnet: 172.20.0.0/16
          gateway: 172.20.0.1
    
  external-net:
    external: true
    name: company-network

La opción external: true permite reutilizar redes existentes creadas fuera de Compose, útil cuando múltiples proyectos necesitan compartir la misma infraestructura de red.

Redes con configuración IPAM

Para entornos que requieren control específico sobre direccionamiento IP, puedes configurar el IPAM (IP Address Management):

services:
  web-server:
    image: nginx:latest
    networks:
      custom-subnet:
        ipv4_address: 172.25.0.10

networks:
  custom-subnet:
    driver: bridge
    ipam:
      config:
        - subnet: 172.25.0.0/24
          gateway: 172.25.0.1

Esta configuración asigna una dirección IP estática específica al servicio, proporcionando predictibilidad en la comunicación de red.

Uso de múltiples redes por servicio

Un servicio puede conectarse a múltiples redes simultáneamente, permitiendo arquitecturas complejas donde diferentes aspectos de la aplicación requieren distintos niveles de acceso:

services:
  api-gateway:
    image: nginx:latest
    networks:
      - public
      - internal
      - monitoring
    ports:
      - "80:80"
      - "443:443"
  
  payment-service:
    image: node:24-alpine
    networks:
      internal:
        aliases:
          - payments
          - billing-api
      secure:
        aliases:
          - secure-payments

networks:
  public:
    driver: bridge
  internal:
    driver: bridge
  secure:
    driver: bridge
    internal: true  # Red sin acceso externo
  monitoring:
    driver: bridge

La opción internal: true crea una red completamente aislada del tráfico externo, ideal para comunicaciones sensibles como procesamiento de pagos o datos confidenciales.

Aislamiento y puertos

Guarda tu progreso

Inicia sesión para no perder tu progreso y accede a miles de tutoriales, ejercicios prácticos y nuestro asistente de IA.

Progreso guardado
Asistente IA
Ejercicios
Iniciar sesión gratis

Más de 25.000 desarrolladores ya confían en CertiDevs

El aislamiento de servicios y la publicación controlada de puertos constituyen aspectos fundamentales de la seguridad y arquitectura en Docker Compose. Las redes personalizadas proporcionan un mecanismo robusto para segmentar la comunicación, mientras que la gestión de puertos permite controlar qué servicios son accesibles desde el exterior.

Aislamiento mediante segmentación de redes

La separación por redes permite crear boundaries lógicos entre diferentes capas de una aplicación. Los servicios que no comparten ninguna red no pueden comunicarse entre sí, proporcionando un aislamiento efectivo:

services:
  # Frontend público
  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - frontend-tier
  
  # API intermedia
  api:
    image: node:24-alpine
    networks:
      - frontend-tier  # Acceso desde web
      - backend-tier   # Acceso a base de datos
  
  # Base de datos privada
  database:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secretpassword
    networks:
      - backend-tier   # Solo accesible desde API
    volumes:
      - db-data:/var/lib/postgresql/data

networks:
  frontend-tier:
    driver: bridge
  backend-tier:
    driver: bridge

volumes:
  db-data:

En este ejemplo, el servicio web no puede acceder directamente a database, ya que no comparten ninguna red común. Toda la comunicación debe pasar a través del servicio api, creando un punto de control centralizado.

Publicación selectiva de puertos

La clave ports en Docker Compose controla qué servicios son accesibles desde el host y desde redes externas. Solo los servicios que necesitan acceso público deben exponer puertos:

services:
  # Proxy público - único punto de entrada
  reverse-proxy:
    image: nginx:latest
    ports:
      - "80:80"
      - "443:443"
    networks:
      - public
      - internal
  
  # Aplicación - sin puertos públicos
  app:
    image: node:24-alpine
    # Sin ports: solo accesible internamente
    networks:
      - internal
      - database-tier
  
  # Base de datos - completamente privada
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
    networks:
      - database-tier
    # Sin ports: sin acceso externo

networks:
  public:
    driver: bridge
  internal:
    driver: bridge
  database-tier:
    driver: bridge
    internal: true  # Red sin routing externo

Esta configuración implementa un patrón de proxy reverso donde solo el componente reverse-proxy tiene acceso público, mientras que los servicios internos permanecen completamente aislados del exterior.

Configuración avanzada de puertos

Docker Compose ofrece opciones específicas para controlar cómo se publican los puertos:

services:
  web-secure:
    image: nginx:latest
    ports:
      # Puerto específico del host
      - "8080:80"
      
      # Solo localhost
      - "127.0.0.1:8443:443"
      
      # Rango de puertos
      - "9000-9005:9000-9005"
      
      # UDP específico
      - "53:53/udp"
      
      # Múltiples protocolos
      - target: 80
        published: 8080
        protocol: tcp
        mode: host
    
    networks:
      - web-tier

networks:
  web-tier:
    driver: bridge

La sintaxis extendida permite controlar precisamente el protocolo, la interfaz de escucha y el modo de publicación del puerto.

Estrategias de aislamiento por entorno

Para diferentes entornos de despliegue, puedes implementar niveles de aislamiento variables usando archivos de configuración específicos:

# compose.prod.yaml
services:
  api:
    image: mycompany/api:production
    networks:
      - internal-only
    # Sin ports: solo acceso interno
    
  monitoring:
    image: prometheus:latest
    networks:
      - internal-only
      - monitoring-tier
    # Solo métricas internas

networks:
  internal-only:
    driver: bridge
    internal: true
  monitoring-tier:
    driver: bridge
    internal: true
# compose.dev.yaml  
services:
  api:
    image: mycompany/api:dev
    ports:
      - "3000:3000"  # Acceso directo en desarrollo
    networks:
      - development
      
  monitoring:
    image: prometheus:latest
    ports:
      - "9090:9090"  # Dashboard accesible
    networks:
      - development

networks:
  development:
    driver: bridge

Esta aproximación permite mantener la seguridad en producción mientras facilita el debugging y desarrollo local.

Aislamiento con redes internas

Las redes marcadas como internal proporcionan el máximo nivel de aislamiento, bloqueando completamente el acceso a internet y a otras redes del host:

services:
  payment-processor:
    image: payment-service:latest
    networks:
      - payment-secure
      - audit-logs
    environment:
      - ENCRYPTION_KEY_FILE=/run/secrets/payment_key
  
  audit-service:
    image: audit-logger:latest
    networks:
      - audit-logs
      - external-reporting
  
  external-gateway:
    image: nginx:latest
    ports:
      - "443:443"
    networks:
      - external-reporting
      - public

networks:
  payment-secure:
    driver: bridge
    internal: true  # Sin acceso a internet
    
  audit-logs:
    driver: bridge
    internal: true  # Comunicación interna únicamente
    
  external-reporting:
    driver: bridge
    
  public:
    driver: bridge

En este ejemplo, el payment-processor opera en una red completamente aislada, mientras que external-gateway actúa como único punto de contacto con el exterior, implementando un patrón de defensa en profundidad.

Validación de aislamiento

Para verificar que el aislamiento funciona correctamente, puedes usar comandos de diagnóstico desde los contenedores:

services:
  test-isolation:
    image: alpine:latest
    command: sleep infinity
    networks:
      - isolated-net
  
  should-be-unreachable:
    image: alpine:latest
    command: sleep infinity
    networks:
      - different-net

networks:
  isolated-net:
    driver: bridge
  different-net:
    driver: bridge

Desde un contenedor en isolated-net, intentar hacer ping o conectar al servicio en different-net debería fallar, confirmando que el aislamiento está funcionando según lo esperado.

Aprendizajes de esta lección de Docker

  • Comprender la red por defecto que crea Docker Compose y cómo los servicios se comunican usando nombres de servicio.
  • Definir y configurar redes personalizadas en el archivo compose.yaml para segmentar la comunicación entre servicios.
  • Utilizar aliases y opciones avanzadas para controlar la conectividad y direccionamiento IP de los contenedores.
  • Implementar aislamiento de servicios mediante segmentación de redes y publicación selectiva de puertos.
  • Aplicar configuraciones específicas para entornos de desarrollo y producción que aseguren la seguridad y funcionalidad adecuada.

Completa este curso de Docker y certifícate

Únete a nuestra plataforma de cursos de programación y accede a miles de tutoriales, ejercicios prácticos, proyectos reales y nuestro asistente de IA personalizado para acelerar tu aprendizaje.

Asistente IA

Resuelve dudas al instante

Ejercicios

Practica con proyectos reales

Certificados

Valida tus conocimientos

Más de 25.000 desarrolladores ya se han certificado con CertiDevs

⭐⭐⭐⭐⭐
4.9/5 valoración