Saltar al contenido

Cómo alojar múltiples webs en un mismo VPS con Docker

7 min de lectura Infraestructura
  • docker
  • traefik
  • vps
  • hosting
  • infraestructura

Alojamiento de múltiples webs en un VPS con Docker

Alojar múltiples webs en un mismo VPS con Docker no es solo una cuestión de ahorrar costes de hosting, sino de optimizar recursos y simplificar la gestión. Cuando un cliente me llega con varias aplicaciones o sitios web y un presupuesto ajustado, mi regla es clara: consolidar. El uso de contenedores permite aislar cada aplicación, y un proxy inverso como Traefik se encarga de dirigir el tráfico correctamente a cada uno de tus múltiples dominios.

El coste oculto de tener un servidor para cada proyecto es significativo. No solo pagas por el hardware, sino por la sobrecarga de gestión: actualizaciones del sistema operativo, parches de seguridad, configuraciones de firewall y monitorización individual. Multiplicar esa carga por cada servidor se vuelve insostenible rápidamente.

El problema de los recursos y la gestión sin un orquestador

Sin una estrategia de consolidación, cada instancia de servidor consume recursos base que no se aprovechan al máximo. La gestión individual de cada uno se convierte en una tarea tediosa y propensa a errores, especialmente al escalar horizontalmente sin una herramienta que orqueste.

La clave no es solo ejecutar varias webs, sino hacerlo de forma eficiente y segura. Los contenedores proporcionan el aislamiento que necesitas para que una aplicación no interfiera con otra, incluso si usan dependencias o versiones de software distintas. Esto resuelve el problema de la “dependencia infernal” de versiones en un mismo servidor, donde una actualización en un sitio puede romper otro.

Traefik como orquestador de tráfico dinámico

Traefik es un proxy inverso y balanceador de carga que se integra directamente con el entorno de contenedores. Su principal ventaja es que descubre automáticamente tus servicios en contenedores, asigna dominios y gestiona certificados SSL de Let’s Encrypt sin configuración manual. Esto elimina la necesidad de editar archivos de configuración de Nginx o Apache cada vez que añades o eliminas una web, un proceso lento y propenso a errores.

Cuando un nuevo contenedor se levanta, Traefik detecta las etiquetas que le has puesto en tu docker-compose.yml y redirige el tráfico a ese servicio. Por ejemplo, si tienes un servicio web con el dominio web1.com y otro con web2.com, Traefik se encarga de que cada petición llegue a su destino. Es la pieza central para gestionar certificados SSL automáticos con Let’s Encrypt en todo el stack, asegurando que todas tus webs tengan HTTPS sin esfuerzo.

# docker-compose.yml para Traefik
version: '3.8'

services:
  traefik:
    image: traefik:v2.10
    container_name: traefik
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro # Permite a Traefik leer eventos de Docker
      - ./traefik.yml:/etc/traefik/traefik.yml:ro # Configuración estática de Traefik
      - ./acme.json:/acme.json # Almacenamiento de certificados Let's Encrypt
    command:
      - --api.dashboard=true # Habilita el dashboard de Traefik (útil para monitorizar)
      - --providers.docker=true # Habilita el proveedor Docker
      - --providers.docker.exposedbydefault=false # Solo expone servicios con etiquetas 'traefik.enable=true'
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.myresolver.acme.tlschallenge=true # Desafío TLS para Let's Encrypt
      - --certificatesresolvers.myresolver.acme.email=tu@email.com # Tu email para notificaciones
      - --certificatesresolvers.myresolver.acme.storage=/acme.json # Ruta de almacenamiento de certificados
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.rule=Host(`monitor.tudominio.com`)" # Regla para el dashboard
      - "traefik.http.routers.api.service=api@internal" # Servicio interno del API de Traefik
      - "traefik.http.routers.api.entrypoints=websecure"
      - "traefik.http.routers.api.tls.certresolver=myresolver"
      - "traefik.http.middlewares.auth.basicauth.users=usuario:$$apr1$$..." # Proteger el dashboard con usuario y contraseña

Este docker-compose.yml de Traefik se ejecuta una sola vez. Después, cada servicio individual simplemente añade sus etiquetas para ser detectado. Puedes ver un ejemplo más complejo de cómo montar un servicio con Traefik en mi artículo sobre n8n en producción con Docker y Traefik.

Configurando tus aplicaciones con Docker Compose

Para cada web o aplicación que quieras alojar, defines un servicio en un archivo docker-compose.yml independiente. Este archivo describe cómo se construye y se ejecuta tu aplicación, incluyendo la imagen Docker a usar, los volúmenes para persistir datos y las etiquetas de Traefik que le dicen qué dominio debe servir y qué puerto interno usar. Cada docker-compose.yml reside en su propio directorio.

Aquí tienes un ejemplo básico para una web estática simple, como una landing page:

# web1/docker-compose.yml
version: '3.8'

services:
  web1:
    image: nginx:alpine
    container_name: web1
    restart: unless-stopped
    volumes:
      - ./html:/usr/share/nginx/html:ro # Contenido de la web
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.web1.rule=Host(`www.web1.com`, `web1.com`)" # Dominios para esta web
      - "traefik.http.routers.web1.entrypoints=websecure" # Usa el entrypoint HTTPS
      - "traefik.http.routers.web1.tls.certresolver=myresolver" # Resuelve el certificado con Let's Encrypt
      - "traefik.http.services.web1.loadbalancer.server.port=80" # Puerto interno del contenedor Nginx

Para lanzar esta web, simplemente navegas al directorio web1 y ejecutas docker compose up -d. Luego, para otra web, creas otro directorio (web2/) con su propio docker-compose.yml y lo levantas de la misma manera. Esto te permite tener entornos completamente separados para cada proyecto, facilitando su gestión y despliegue.

Ventajas y desventajas de esta configuración

Lo que ganas:

  • Optimización de recursos: Un único servidor puede servir múltiples aplicaciones, aprovechando mejor la RAM y CPU que si tuvieras varios servidores subutilizados.
  • Aislamiento: Cada web o aplicación corre en su propio contenedor, evitando conflictos de dependencias y versiones de software.
  • Gestión simplificada: Añadir o eliminar una web es cuestión de modificar un docker-compose.yml y levantar el servicio, sin tocar la configuración global del servidor.
  • Automatización SSL: Traefik gestiona los certificados Let’s Encrypt de forma automática para todos tus dominios, reduciendo la carga administrativa.

Lo que complicas:

  • Curva de aprendizaje inicial: Requiere entender Docker, Docker Compose y la configuración de Traefik. No es una solución plug-and-play sin conocimientos técnicos.
  • Punto único de fallo: Si el servidor principal cae, todas las webs alojadas en él dejan de funcionar. Esto es una consideración importante para proyectos de alta disponibilidad.
  • Monitorización avanzada: A medida que el número de servicios crece, necesitas una monitorización más sofisticada para detectar problemas de rendimiento o seguridad en contenedores específicos.
  • Gestión de recursos: Configurar correctamente los límites de CPU y memoria por contenedor es necesario para evitar que una aplicación acapare los recursos del sistema y afecte a las demás.

Mantener la seguridad y el rendimiento de tu stack Docker

Alojar múltiples sitios en un mismo servidor exige una buena gestión de los recursos y una especial atención a la seguridad. Asegúrate de que cada contenedor tenga solo los permisos necesarios y que los volúmenes de datos estén correctamente configurados. Usa firewalls como UFW para cerrar puertos innecesarios —aunque Traefik ya actúe como una barrera de entrada—.

La monitorización es clave para identificar cuellos de botella. Si una de tus webs empieza a consumir demasiados recursos, afectará al resto. Herramientas como el dashboard de Traefik te dan una visión básica, pero sistemas de monitorización más robustos pueden ser necesarios a largo plazo. Un buen seguimiento te permitirá escalar verticalmente el servidor o considerar la opción de añadir otro servidor cuando sea necesario.

Si vienes de un entorno de hosting compartido y te planteas dar el salto, esta comparativa entre hosting compartido y VPS te ayudará a entender las ventajas. Y si ya trabajas con Docker, pero necesitas mover tu stack completo, aquí explico cómo migrar un stack Docker a otro VPS sin downtime. Para una gestión granular de recursos y evitar que un servicio ahogue al resto, la limitación de recursos por contenedor en Docker Compose es clave.

Lucas Juárez
Lucas Juárez

Técnico freelance especializado en desarrollo a medida, automatizaciones con IA y gestión técnica para negocios en España. Más sobre mí →

Compartir:

¿Necesitas que alguien se ocupe de tu web?

Me encargo de que tu web funcione, esté segura y actualizada. Backups, actualizaciones y soporte directo. Planes desde 49 €/mes.

Chat