Cómo instalar Drupal en Docker: Gestión de contenido empresarial con Drupal en Docker

Drupal | CMS | Docker

Drupal: Gestión de contenido empresarial en Docker

CMS de código abierto potente y flexible usado por gobiernos, universidades y empresas de todo el mundo. Todo en Docker con MySQL o PostgreSQL.

¿Qué es Drupal?


Drupal es un sistema de gestión de contenido (CMS) de código abierto construido en PHP y distribuido bajo la licencia GNU General Public License. Se utiliza como framework backend para al menos el 2.1% de todos los sitios web en el mundo, desde blogs personales hasta sitios corporativos, políticos y gubernamentales como WhiteHouse.gov y data.gov.uk.

A diferencia de otros CMS, Drupal está diseñado para ser extremadamente flexible y extensible, permitiendo crear desde simples blogs hasta complejas aplicaciones web empresariales, portales de conocimiento y plataformas de colaboración empresarial.

Filosofía de Drupal: No es solo un CMS, es un framework de gestión de contenido. Te da las herramientas para construir prácticamente cualquier tipo de sitio web o aplicación que necesites, con total control sobre la estructura de datos, presentación y flujos de trabajo.

Características principales

Gestión de contenido flexible

Tipos de contenido personalizables, taxonomía avanzada y relaciones complejas entre contenidos.

Arquitectura modular

Sistema de módulos y temas que extiende funcionalidades sin tocar el núcleo.

Multi-sitio

Gestiona múltiples sitios web desde una sola instalación de Drupal.

API robusta

RESTful Web Services integrado para crear aplicaciones headless o móviles.

Gestión de usuarios

Roles y permisos granulares con autenticación y autorización avanzada.

Multiidioma

Traducción integrada de contenido, interfaz y configuración sin módulos adicionales.

Responsive por defecto

Todos los temas core son responsive y mobile-first.

SEO avanzado

URLs limpias, meta tags, sitemaps y estructuración de datos integrados.

Seguridad empresarial

Equipo dedicado de seguridad con actualizaciones regulares y parches rápidos.

Workflows editoriales

Control de revisiones, moderación de contenido y flujos de aprobación.

Media management

Gestión avanzada de imágenes, vídeos y documentos con biblioteca de medios.

Community activa

Miles de módulos contrib y temas, documentación extensa y comunidad global.

Versiones disponibles

La imagen oficial de Drupal soporta múltiples versiones:

  • Drupal 11: Última versión major (11.2, 11.3). PHP 8.3+, Symfony 7, mejoras en rendimiento y DX
  • Drupal 10: Versión LTS actual (10.5, 10.6). PHP 8.1+, soporte hasta 2026
Recomendación: Para nuevos proyectos usa Drupal 11. Para proyectos existentes en Drupal 9, migra a Drupal 10 primero (soportado hasta 2026).

Instalación básica con Docker

Inicio rápido (SQLite)

La forma más rápida para probar Drupal sin base de datos externa:

docker run --name mi-drupal -p 8080:80 -d drupal:11-apache

Accede a http://localhost:8080 y durante la instalación selecciona SQLite como base de datos.

Advertencia: SQLite solo es para desarrollo/pruebas. Para producción usa MySQL o PostgreSQL.

Instalación con Docker Compose (MySQL)

Paso 1: Crear docker-compose.yml

services: drupal: image: drupal:11-apache container_name: drupal ports: - "8080:80" volumes: - drupal-modules:/var/www/html/modules - drupal-profiles:/var/www/html/profiles - drupal-themes:/var/www/html/themes - drupal-sites:/var/www/html/sites restart: unless-stopped depends_on: - mysql mysql: image: mysql:8.0 container_name: drupal-mysql environment: MYSQL_DATABASE: drupal MYSQL_USER: drupal MYSQL_PASSWORD: drupal-password MYSQL_ROOT_PASSWORD: root-password volumes: - mysql-data:/var/lib/mysql restart: unless-stopped volumes: drupal-modules: drupal-profiles: drupal-themes: drupal-sites: mysql-data:

Paso 2: Inicializar el volumen sites

El directorio sites necesita inicializarse con el contenido de la imagen:

# Crear el volumen docker volume create drupal-sites # Copiar contenido inicial docker run --rm -v drupal-sites:/temporary/sites \ drupal:11-apache cp -aRT /var/www/html/sites /temporary/sites

Paso 3: Iniciar los contenedores

docker compose up -d

Paso 4: Configurar Drupal

Abre http://localhost:8080 en tu navegador y sigue el instalador:

  1. Selecciona idioma
  2. Selecciona perfil de instalación (Standard recomendado)
  3. Configuración de base de datos:
    • Tipo de base de datos: MySQL, MariaDB, Percona Server o equivalente
    • Nombre de base de datos: drupal
    • Usuario: drupal
    • Contraseña: drupal-password
    • OPCIONES AVANZADAS → Host: mysql
  4. Configurar sitio (nombre, email administrador, contraseña)

Instalación con PostgreSQL

Para usar PostgreSQL en lugar de MySQL, reemplaza el servicio de base de datos:

postgres: image: postgres:16 container_name: drupal-postgres environment: POSTGRES_DB: drupal POSTGRES_USER: drupal POSTGRES_PASSWORD: drupal-password volumes: - postgres-data:/var/lib/postgresql/data restart: unless-stopped

Durante la instalación de Drupal:

  • Tipo de base de datos: PostgreSQL
  • Host (en OPCIONES AVANZADAS): postgres

Gestión de volúmenes persistentes

Por defecto la imagen no incluye volúmenes. Los directorios que generalmente deberías hacer persistentes:

  • /var/www/html/modules - Módulos personalizados y contrib
  • /var/www/html/profiles - Perfiles de instalación
  • /var/www/html/themes - Temas personalizados y contrib
  • /var/www/html/sites - Configuración del sitio, archivos subidos

Usando bind mounts (desarrollo)

Para desarrollo local con tu código en el host:

docker run --name drupal-dev -p 8080:80 -d \ -v $(pwd)/modules:/var/www/html/modules \ -v $(pwd)/themes:/var/www/html/themes \ -v $(pwd)/sites:/var/www/html/sites \ drupal:11-apache

Instalar Drush (Drupal Shell)

Drush no viene en la imagen oficial. Para añadirlo, crea tu propio Dockerfile:

FROM drupal:11-apache # Instalar Composer RUN curl -sS https://getcomposer.org/installer | php -- \ --install-dir=/usr/local/bin --filename=composer # Instalar Drush RUN composer global require drush/drush \ && ln -s /root/.composer/vendor/bin/drush /usr/local/bin/drush

Construye y usa:

docker build -t drupal-drush . docker run --name drupal -p 8080:80 -d drupal-drush

Añadir extensiones PHP

La imagen no incluye todas las extensiones PHP posibles. Para añadir extensiones adicionales:

FROM drupal:11-apache # Instalar dependencias del sistema RUN apt-get update && apt-get install -y \ libpng-dev \ libjpeg-dev \ libfreetype6-dev \ && rm -rf /var/lib/apt/lists/* # Configurar e instalar extensiones PHP RUN docker-php-ext-configure gd \ --with-freetype \ --with-jpeg \ && docker-php-ext-install -j$(nproc) gd

Gestión y mantenimiento

Ver logs

docker compose logs -f drupal

Acceder al contenedor

docker compose exec drupal bash

Reiniciar Drupal

docker compose restart drupal

Detener todo

docker compose down

Actualizar a nueva versión

# Hacer backup primero docker compose exec drupal drush sql-dump > backup.sql # Actualizar imagen docker compose pull drupal docker compose up -d

Backup y restore

Backup de base de datos

# MySQL docker compose exec mysql mysqldump -u drupal -pdrupal-password drupal \ > drupal-backup-$(date +%Y%m%d).sql # PostgreSQL docker compose exec postgres pg_dump -U drupal drupal \ > drupal-backup-$(date +%Y%m%d).sql

Backup de archivos

docker run --rm \ -v drupal-sites:/sites \ -v $(pwd):/backup \ alpine tar czf /backup/drupal-sites-$(date +%Y%m%d).tar.gz -C /sites .

Restore de base de datos

# MySQL cat drupal-backup-20260501.sql | \ docker compose exec -T mysql mysql -u drupal -pdrupal-password drupal # PostgreSQL cat drupal-backup-20260501.sql | \ docker compose exec -T postgres psql -U drupal drupal

Configurar reverse proxy (Nginx)

server { listen 443 ssl http2; server_name drupal.tudominio.com; ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem; client_max_body_size 100M; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }

Casos de uso

  • Sitios web corporativos: Portales empresariales con gestión de contenido compleja
  • Portales gubernamentales: Sitios oficiales con altos requisitos de seguridad y accesibilidad
  • Universidades: Portales educativos con múltiples sitios y contenido multiidioma
  • Medios de comunicación: Portales de noticias con publicación editorial compleja
  • Intranets corporativas: Gestión del conocimiento y colaboración interna
  • E-commerce: Tiendas online con Drupal Commerce
  • APIs headless: Backend para aplicaciones móviles y SPAs con Drupal como API
  • Comunidades: Plataformas sociales y foros con gestión de usuarios avanzada

Comentarios

Entradas populares de este blog

NAS SYNOLOGY DSM 7.1 en VMware ESXI - Guía instalación y configuración Synology DSM 7.1 en VMWARE

Solución al error: «user is not in the sudoers file» en Debian

Comando "NET USE", uso, parámetros y algunos ejemplos de uso