Instalar Moodle 4.5 en Docker con Apache, PHP-FPM y MySQL: Guía Paso a Paso

Instalar Moodle 4.5 en Docker con Apache, PHP-FPM y MySQL: Guía Paso a Paso

Moodle es uno de los sistemas de gestión del aprendizaje (LMS) más utilizados en el mundo, ideal para instituciones educativas y empresas que necesitan una plataforma flexible y escalable.
En esta guía, aprenderás a instalar Moodle 4.5 en un entorno basado en Docker con Apache, PHP-FPM y MySQL. Usaremos docker-compose para gestionar los contenedores y mkcert para configurar SSL de forma local. Este método te permitirá levantar un entorno de pruebas o desarrollo rápido y reproducible. Al final de este tutorial, tendrás un Moodle totalmente funcional listo para personalizar y probar.

El montaje de Moodle en un entorno Docker es ideal tanto para pruebas (testing ) como para desarrollo, ya que permite replicar fácilmente configuraciones y evitar problemas relacionados con dependencias. Sin embargo, es importante recordar que nunca debes bajar la guardia cuando se trata de seguridad . Aunque este entorno puede funcionar perfectamente para pruebas o desarrollo local, si decides llevarlo a producción, deberás asegurarte de implementar todas las medidas necesarias para proteger tu plataforma y los datos de tus usuarios

¿Qué es Moodle y por qué usarlo en Docker?

Docker permite crear entornos de desarrollo y pruebas de forma rápida y reproducible, evitando problemas de dependencias y configuraciones complejas. Con esta instalación:

Automatizarás la configuración y evitarás conflictos de versiones en servidores locales.
Podrás replicar fácilmente tu entorno en diferentes máquinas o servidores.
Tendrás un entorno seguro y aislado, sin afectar la instalación de otros servicios en tu equipo.

Aunque este entorno es ideal para desarrollo y pruebas, si planeas llevar Moodle a producción, deberás implementar medidas adicionales de seguridad y rendimiento.
A lo largo de este tutorial, configuraremos Docker Compose para definir los servicios, optimizaremos la configuración de PHP y MySQL, habilitaremos HTTPS con mkcert y, finalmente, desplegaremos Moodle para que puedas comenzar a trabajar con él.

¡Empecemos! 🚀

¿Necesitas una solución LMS personalizada o integrada con tus sistemas actuales?

En Entornos de Formación (www.edf.global) desarrollamos e integramos plataformas de aprendizaje a medida, adaptadas a las necesidades de tu organización. ¡No dudes en contactarnos para una consulta sin compromiso! Estamos aquí para ayudarte a crear el entorno de aprendizaje perfecto para tu equipo o institución.

Tabla de contenidos

Introducción

¿Qué es Moodle?

Moodle es un Sistema de Gestión del Aprendizaje (LMS, por sus siglas en inglés) de código abierto que permite crear plataformas educativas en línea. Su nombre proviene de Modular Object-Oriented Dynamic Learning Environment , lo que refleja su naturaleza flexible y adaptable. Puedes conocer más sobre Moodle en su sitio oficial: https://moodle.org .

Moodle ha sido adoptado por instituciones educativas, empresas y organizaciones en todo el mundo debido a su capacidad para gestionar cursos en línea, facilitar la colaboración entre usuarios y proporcionar herramientas avanzadas para el aprendizaje.

Características principales de Moodle:

  • Personalización : Moodle es altamente personalizable. Puedes adaptarlo a las necesidades específicas de tu organización mediante la instalación de complementos (plugins ) o desarrollando funcionalidades propias.
  • Colaboración : Ofrece herramientas como foros, chats, wikis y grupos de trabajo que fomentan la interacción entre estudiantes y profesores.
  • Gestión de contenido : Permite subir recursos multimedia, crear quizzes, realizar evaluaciones y organizar materiales didácticos de manera estructurada.
  • Seguridad : Moodle incluye múltiples capas de seguridad para proteger la información sensible de tus usuarios.
  • Comunidad activa : Cuenta con una comunidad global de desarrolladores y usuarios que contribuyen constantemente con mejoras, soporte técnico y nuevas ideas. Puedes unirte a esta comunidad en https://moodle.org/community .

¿Por qué Moodle es una excelente opción para tu entorno de aprendizaje en línea?

Moodle no solo es una plataforma educativa; es una herramienta integral diseñada para potenciar tu entorno de aprendizaje en línea . Aquí te presentamos algunas razones clave por las cuales Moodle se destaca:

  1. Flexibilidad y escalabilidad : Moodle puede adaptarse tanto a proyectos pequeños, como un curso individual, como a grandes implementaciones corporativas o universitarias. Su arquitectura modular permite expandir sus capacidades según sea necesario.
  2. Accesibilidad : Moodle es compatible con múltiples dispositivos, lo que permite a los estudiantes acceder al contenido desde ordenadores, tablets y teléfonos móviles. Además, ofrece opciones para mejorar la accesibilidad para personas con discapacidades.
  3. Interacción y colaboración : Ofrece herramientas como foros, chats, wikis y grupos de trabajo que fomentan la interacción entre estudiantes y profesores, promoviendo un entorno de aprendizaje dinámico y participativo.
  4. Gestión de contenidos : Permite subir recursos multimedia, crear quizzes, realizar evaluaciones y organizar materiales didácticos de manera estructurada, facilitando la planificación y ejecución de tus actividades educativas.
  5. Seguridad : Moodle incluye múltiples capas de seguridad para proteger la información sensible de tus usuarios, garantizando un entorno confiable para el aprendizaje en línea.
  6. Comunidad activa : Cuenta con una comunidad global de desarrolladores y usuarios que contribuyen constantemente con mejoras, soporte técnico y nuevas ideas, asegurando que siempre estés utilizando una plataforma actualizada y robusta.

En resumen, Moodle es mucho más que un LMS; es una solución completa que potencia el aprendizaje, la colaboración y el crecimiento continuo en tu entorno de aprendizaje en línea .

Requisitos previos para instalar Moodle 4.5 con Docker

Antes de comenzar, asegúrate de cumplir con los siguientes requisitos:

1. Sistema operativo : GNU-Linux, macOS o Windows.
Aunque Docker puede correr hoy en día en cualquier máquina portátil o de escritorio, es importante verificar que tu sistema cumpla con los requisitos mínimos de hardware y software necesarios para ejecutar contenedores de manera eficiente . Además, ten en cuenta que algunas configuraciones específicas (como WSL2 en Windows) pueden ser necesarias para optimizar el rendimiento.

Si planeas desplegar este entorno en un servidor de producción, se recomienda utilizar un sistema operativo basado en GNU-Linux, como Ubuntu , Debian u otras distribuciones similares. Estos sistemas son ideales para entornos de servidor debido a su estabilidad, seguridad y compatibilidad con Docker. Asegúrate de seguir las mejores prácticas de seguridad al configurar tu servidor de producción.

Nota importante para usuarios de Windows : Si estás utilizando Docker en Windows, es altamente recomendable habilitar WSL2 (Windows Subsystem for Linux 2) . WSL2 mejora significativamente el rendimiento de Docker en comparación con el motor Hyper-V tradicional. Asegúrate de instalar WSL2 y configurarlo correctamente antes de comenzar. Puedes encontrar instrucciones oficiales en la documentación de Docker.

2. Comprobación de hardware de virtualización:
La mayoría de las máquinas modernas tienen soporte para virtualización de hardware , una característica necesaria para ejecutar Docker de manera eficiente. Sin embargo, si usas un equipo antiguo, verifica que tu procesador tenga esta funcionalidad habilitada.

En sistemas basados en Intel, busca la opción Intel VT-x en los ajustes de BIOS/UEFI. Para procesadores AMD, busca AMD-V . Si no está habilitada, activa esta opción en los ajustes de tu BIOS/UEFI antes de continuar.

3. Docker Desktop:
Utilizaremos Docker Desktop , una herramienta que simplifica la gestión de contenedores y proporciona una interfaz gráfica intuitiva. Descárgala e instálala desde https://www.docker.com/products/docker-desktop . Docker Desktop también incluye características avanzadas como la integración con WSL2 en Windows y mejor compatibilidad con macOS.

Nota : Asegúrate de que Docker Desktop esté configurado para usar WSL2 si estás en Windows. Para servidores Linux en producción, utiliza la versión de línea de comandos de Docker.

4. Memoria RAM:
Moodle requiere recursos significativos para funcionar correctamente, especialmente si planeas cargar muchos usuarios o cursos. Se recomienda asignar al menos 4 GB de RAM a Docker Desktop para garantizar un rendimiento óptimo. Puedes ajustar esta configuración en las opciones de Docker Desktop:

  • En Windows o macOS: Ve a Settings > Resources > Memory y establece un valor adecuado según tu sistema.
  • En Linux: Ajusta los límites de recursos en el fichero de configuración de Docker (/etc/docker/daemon.json) si es necesario.

5. Editor de texto o IDE :
Para editar ficheros de configuración, recomendamos herramientas como Visual Studio Code o Sublime Text.

Creación del archivo docker-compose.yml para Moodle

Ahora que hemos preparado nuestro entorno y creado el directorio de trabajo, llega el momento de definir la estructura de nuestra aplicación mediante el fichero docker-compose.yml. Este fichero es el corazón de nuestra configuración en Docker Compose, ya que permite describir y gestionar todos los servicios necesarios para ejecutar Moodle de manera eficiente.

Componentes y su rol en la arquitectura

En este paso, crearemos un fichero docker-compose.yml que defina tres servicios principales:

  • Apache (Servidor Web)
    • Actúa como servidor HTTP y maneja las peticiones de los usuarios.
    • No ejecuta directamente los scripts PHP, sino que los delega a PHP-FPM.
    • Puede usarse como proxy inverso en algunos casos.
  • PHP-FPM (FastCGI Process Manager)
    • Se encarga de procesar las peticiones PHP de Apache.
    • Mejora el rendimiento y escalabilidad en comparación con ejecutar PHP como un módulo dentro de Apache (mod_php).
    • Puede manejar múltiples procesos simultáneamente sin bloquear el servidor web.
  • MySQL (Base de Datos)
    • Almacena toda la información de Moodle: usuarios, cursos, configuraciones, etc.
    • Se comunica con PHP a través de la extensión mysqli o pdo_mysql.
    • Debe configurarse correctamente para manejar grandes volúmenes de datos y consultas concurrentes.

Cómo Fluye una Petición

1️⃣ Un usuario accede a Moodle desde su navegador (ejemplo: https://localhost).
2️⃣ Apache recibe la solicitud y detecta que es una página PHP.
3️⃣ Apache envía la solicitud a PHP-FPM usando FastCGI para su procesamiento.
4️⃣ PHP-FPM ejecuta el código PHP de Moodle y, si es necesario, consulta la base de datos.
5️⃣ PHP-FPM obtiene la respuesta de MySQL y la devuelve a Apache.
6️⃣ Apache entrega la página generada al usuario en el navegador.
7️⃣ Si hay archivos subidos o generados, Moodle los guarda en el volumen moodledata.

Ventajas de Esta Arquitectura

Modularidad y escalabilidad → Podemos actualizar cada servicio por separado.
Mejor rendimiento → PHP-FPM es más eficiente que mod_php en Apache.
Facilidad de mantenimiento → Se pueden reiniciar contenedores individualmente sin afectar todo el sistema.
Seguridad mejorada → Separar los servicios evita que fallos en uno afecten a los demás.

Nuestro sistema quedará como en el siguiente diagrama, en el que se muestran los diferentes componentes que lo integran.

Arquitectura Docker para correr Moodle 4.5


Además, configuraremos volúmenes persistentes para asegurar que los datos importantes, como la base de datos y los ficheros de Moodle, no se pierdan si detenemos o eliminamos los contenedores. También habilitaremos HTTPS utilizando certificados SSL generados con la herramienta mkcert, lo que garantizará una conexión segura en nuestro entorno local.

Al final de este paso, tendrás un fichero docker-compose.yml completamente funcional que servirá como base para iniciar nuestros contenedores y comenzar la instalación de Moodle.

¿Por qué utilizar PHP-FPM con Apache en lugar de mod_php?

En esta configuración, se utiliza PHP-FPM (FastCGI Process Manager) en lugar del módulo tradicional de Apache (mod_php). Esta elección responde a diversas razones de rendimiento, escalabilidad y gestión de recursos:

  1. Separación de responsabilidades: PHP-FPM ejecuta los procesos PHP de manera independiente del servidor web, permitiendo una gestión más eficiente y desacoplada. Apache se encarga exclusivamente de servir contenido estático y gestionar conexiones, mientras que PHP-FPM procesa las peticiones PHP en segundo plano.
  2. Mejor rendimiento y escalabilidad: PHP-FPM permite manejar múltiples procesos en paralelo y optimizar el uso de recursos a través de un pool de procesos configurado dinámicamente. Esto reduce la carga en el servidor y mejora la capacidad de respuesta en aplicaciones con alto tráfico.
  3. Uso optimizado de memoria: A diferencia de mod_php, que carga PHP en cada proceso de Apache, PHP-FPM mantiene un conjunto de procesos dedicados que solo ejecutan código PHP cuando es necesario. Esto evita la sobrecarga de memoria en entornos con muchas conexiones simultáneas.
  4. Compatibilidad con entornos modernos: PHP-FPM es la opción recomendada para arquitecturas basadas en contenedores y configuraciones con balanceo de carga, ya que permite integrar Apache o Nginx sin restricciones impuestas por mod_php.
  5. Mayor control y configurabilidad: PHP-FPM proporciona configuraciones avanzadas como el manejo de peticiones lentas (slowlog), límites de procesos por usuario y ajustes de rendimiento adaptables al tráfico de la aplicación.

Introducción al fichero docker-compose.yml

El fichero docker-compose.yml es un fichero de configuración escrito en el formato YAML (YAML Ain’t Markup Language), un lenguaje de serialización de datos humano-legible que se utiliza comúnmente para definir configuraciones jerárquicas. En este caso, el fichero docker-compose.yml define cómo deben crearse y ejecutarse los contenedores Docker necesarios para nuestra instalación de Moodle.

Cada servicio o contenedor se describe como una sección dentro del fichero, especificando aspectos como la imagen base, las variables de entorno, los puertos expuestos, los volúmenes montados y las dependencias entre servicios. A continuación, te proporcionamos una descripción detallada de cada componente del fichero docker-compose.yml.

Nuestro proyecto debe tener el siguiente árbol de ficheros-directorios.

Configuración del fichero docker-compose.yml

Nuestro fichero completo docker-compose.yml utilizado para instalar Moodle 4.5 tendrá el siguiente contenido. Recuerda que está escrito en formato YAML y que debes respetar toda la identación, espacios y tabuladores, cualquier cambio, implicará que Docker no será capaz de leer el fichero correctamente y provocará un error de sintaxis.

YAML
version: '3.8'

services:
  apache:
    image: httpd:2.4
    container_name: moodle_apache
    ports:
      - "80:80"
      - "443:443"  
    volumes:
      - ./apache/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
      - ./application/moodle:/var/www/moodle                       
      - ./application/ssl:/etc/ssl/certs:ro                      
    networks:
      - moodle_network
    depends_on:
      - php

  php:
    build:
      context: .
      dockerfile: Dockerfile.php
    container_name: moodle_php
    volumes:
      - ./application/moodle:/var/www/moodle
      - ./application/moodledata:/var/www/moodledata
      - ./php.ini:/usr/local/etc/php/conf.d/custom.ini
    environment:
      UPLOAD_MAX_FILESIZE: 512M
      POST_MAX_SIZE: 512M
      MEMORY_LIMIT: 2048M
      MAX_INPUT_VARS: 9999
    networks:
      - moodle_network

  mysql:
    image: mysql:8.3
    user: mysql
    container_name: moodle_mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: moodle
      MYSQL_USER: moodleuser
      MYSQL_PASSWORD: moodlepassword
    volumes:
      - ./application/mysql_data:/var/lib/mysql
    networks:
      - moodle_network

networks:
  moodle_network:
    driver: bridge

Explicación del fichero docker-compose.yml

El fichero docker-compose.yml es un fichero de configuración escrito en el formato YAML, utilizado para definir y gestionar múltiples contenedores Docker en un solo comando. Este fichero describe cómo deben crearse y ejecutarse los contenedores necesarios para nuestra instalación de Moodle, especificando aspectos como las imágenes base, las variables de entorno, los puertos expuestos, los volúmenes montados y las redes utilizadas.

En nuestro caso, hemos definido tres servicios principales: Apache HTTPD , PHP-FPM 8.3 y MySQL 8.3 , además de una red personalizada llamada moodle_network para facilitar la comunicación entre ellos. También hemos configurado volúmenes persistentes para asegurar que los datos importantes, como la base de datos y los ficheros de Moodle, no se pierdan si los contenedores se detienen o eliminan.
A continuación, desglosaremos cada uno de los componentes del fichero:

Red Personalizada moodle_network

YAML
networks:
  moodle_network:
    driver: bridge

  • Propósito: La red moodle_network es una red personalizada en modo bridge que conecta todos los contenedores entre sí. Esta red aísla nuestros servicios de otras redes Docker, mejorando la seguridad y facilitando la comunicación interna.
  • Ventajas :
    • Los contenedores pueden comunicarse utilizando sus nombres (moodle_apache, moodle_php, moodle_mysql) en lugar de direcciones IP.
    • Mejora el aislamiento y la gestión de la red.

Contenedor moodle_apache (servidor web Apache HTTPD)

YAML
apache:
    image: httpd:2.4
    container_name: moodle_apache
    ports:
      - "80:80"
      - "443:443"  
    volumes:
      - ./apache/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
      - ./application/moodle:/var/www/moodle                       
      - ./application/ssl:/etc/ssl/certs:ro                      
    networks:
      - moodle_network
    depends_on:
      - php

  • Propósito : Este contenedor actúa como el servidor web principal, manejando las solicitudes HTTP/HTTPS y redirigiendo las peticiones .php al servicio PHP-FPM.
  • Características :
    • Imagen : Utiliza la imagen oficial de Apache HTTPD (httpd:2.4).
    • Puertos : Expone los puertos 80 (HTTP) y 443 (HTTPS) para permitir el acceso desde navegadores web.
    • Volúmenes :
      • ./apache/conf:/usr/local/apache2/conf: Monta la configuración personalizada de Apache desde el sistema host.
      • ./application/moodle:/var/www/moodle: Comparte los ficheros de Moodle entre el sistema host y el contenedor.
      • ./application/moodledata:/var/www/moodledata: Almacena datos adicionales, como ficheros subidos por los usuarios.
      • ./application/ssl:/etc/ssl/certs:ro: Monta los certificados SSL generados con mkcert en modo de solo lectura.
    • Redes : Conectado a la red moodle_network.
    • Dependencias : Dependiente del contenedor moodle_php, asegurando que PHP esté listo antes de iniciar Apache.

Deberemos generar un fichero de configuración llamado httpd.conf que incluya la configuración del servidor Apache. Este fichero debe estar en el directorio apache/conf/httpd.conf .

Apache
ServerRoot "/usr/local/apache2"
Listen 80
Listen 443

# Cargar los módulos necesarios
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule dir_module modules/mod_dir.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule headers_module modules/mod_headers.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule alias_module modules/mod_alias.so

# Usuario y grupo
User www-data
Group www-data

# DocumentRoot
DocumentRoot "/var/www/moodle"

<Directory "/var/www/moodle">
    Options FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

# Enviar todas las peticiones de .php a PHP-FPM
<FilesMatch \.php$>
    SetHandler "proxy:fcgi://moodle_php:9000"
</FilesMatch>

# Redirección HTTP a HTTPS
<VirtualHost *:80>
    ServerName localhost
    Redirect permanent / https://localhost/
</VirtualHost>

# HTTPS VirtualHost
<VirtualHost *:443>
    ServerName localhost
    DocumentRoot "/var/www/moodle"

    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://moodle_php:9000/var/www/moodle/$1

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/localhost.pem
    SSLCertificateKeyFile /etc/ssl/certs/localhost-key.pem

    <Directory "/var/www/moodle">
	      Options +FollowSymLinks
        AllowOverride All
        Require all granted

        AcceptPathInfo On
        RewriteEngine On
        RewriteBase /
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d

        RewriteEngine On
 
        RewriteRule "(\/vendor\/)" - [F]
        RewriteRule "(\/node_modules\/)" - [F]
        RewriteRule "(^|/)\.(?!well-known\/)" - [F]
        RewriteRule "(composer\.json)" - [F]
        RewriteRule "(\.lock)" - [F]
        RewriteRule "(\/environment.xml)" - [F]
        Options -Indexes
        RewriteRule "(\/install.xml)" - [F]
        RewriteRule "(\/README)" - [F]
        RewriteRule "(\/readme)" - [F]
        RewriteRule "(\/moodle_readme)" - [F]
        RewriteRule "(\/upgrade\.txt)" - [F]
        RewriteRule "(phpunit\.xml\.dist)" - [F]
        RewriteRule "(\/tests\/behat\/)" - [F]
        RewriteRule "(\/fixtures\/)" - [F]
            
        DirectoryIndex index.php
    </Directory>

</VirtualHost>

# Logs
ErrorLog /proc/self/fd/2
CustomLog /proc/self/fd/1 combined

Configuración de Certificados SSL con mkcert

Para habilitar HTTPS en nuestro entorno local, utilizaremos mkcert , una herramienta simple y eficiente para generar certificados SSL válidos. Sigue estos pasos:

a. Instalar mkcert
  • En Linux : Puedes instalar mkcert usando un gestor de paquetes como snap o compilarlo desde el código fuente. Ejemplo con snap:
Bash
snap install mkcert
  • En macOS : Utiliza Homebrew para instalar mkcert:
Bash
brew install mkcert nss

b. Instalar un Certificado Raíz de Confianza

Antes de generar certificados, debes instalar un certificado raíz de confianza en tu sistema. Ejecuta el siguiente comando:

Bash
mkcert -install

Este comando instala el certificado raíz en tu sistema operativo, lo que permitirá que los navegadores web reconozcan los certificados generados por mkcert como válidos.

c. Generar Certificados para localhost
Genera certificados SSL específicos para localhost. Ejecuta el siguiente comando:
Bash
mkcert localhost

Esto creará dos ficheros:

  • localhost.pem: El certificado público.
  • localhost-key.pem: La clave privada.

    Guarda estos ficheros en el directorio ./application/ssl dentro del proyecto.

Contenedor moodle_php (PHP-FPM 8.3) puente entre servidor web y PHP

YAML
php:
    build:
      context: .
      dockerfile: Dockerfile.php
    container_name: moodle_php
    volumes:
      - ./application/moodle:/var/www/moodle
      - ./application/moodledata:/var/www/moodledata
      - ./php.ini:/usr/local/etc/php/conf.d/custom.ini
    environment:
      UPLOAD_MAX_FILESIZE: 512M
      POST_MAX_SIZE: 512M
      MEMORY_LIMIT: 2048M
      MAX_INPUT_VARS: 9999
    networks:
      - moodle_network 

  • Propósito : Este contenedor procesa los scripts PHP necesarios para ejecutar Moodle.
  • Características :
    • Construcción : Se construye una imagen personalizada utilizando el contexto actual (.) y el fichero Dockerfile.php.
    • Volúmenes :
      • ./application/moodle:/var/www/moodle: Comparte los ficheros de Moodle entre el sistema host y el contenedor.
      • ./application/moodledata:/var/www/moodledata: Almacena datos adicionales, como ficheros subidos por los usuarios.
    • Variables de Entorno : Configura límites de PHP, como el tamaño máximo de subidas (UPLOAD_MAX_FILESIZE) y el límite de memoria (MEMORY_LIMIT).
    • Redes : Conectado a la red moodle_network.

Por otro lado, este contenedor utiliza un fichero YAML de instrucciones de generación de la imagen del contenedor, conocido como Dockerfile.
En nuestro caso utilizaremos una imagen derivada de PHP:8.3-FPM que a su vez está basada en la distribución de Linux Debian 12 Slim a la que le añadiremos algunos paquetes extra, principalmente extensiones de PHP necesarias para correr Moodle así como otras extensiones necesarias para desarrollo de PHP.
Después instalaremos GIT y nos descargaremos Moodle versión 4.5 desde el repositorio oficial de GIT de Moodle, dejándolo listo para trabajar.

YAML
FROM php:8.3-fpm

# Instalar las dependencias de PHP y herramientas necesarias
RUN apt-get update && apt-get install -y \
    git \
    cron \
    libzip-dev \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libxml2-dev \
    libcurl4-openssl-dev \
    libonig-dev \
    zip \
    unzip \
    --no-install-recommends && \
    docker-php-ext-configure gd --with-freetype --with-jpeg && \
    docker-php-ext-install \
    gd \
    mysqli \
    pdo_mysql \
    bcmath \
    intl \
    soap \
    xml \
    zip && \
    pecl install xdebug && \
    docker-php-ext-enable xdebug && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Copiar php.ini modificado
COPY php.ini /usr/local/etc/php/conf.d/custom.ini

# Copiar script entrypoint.sh
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# Configurar el cron de Moodle
RUN echo "* * * * * www-data php /var/www/moodle/admin/cli/cron.php > /dev/null 2>&1" > /etc/cron.d/moodle-cron && \
    chmod 0644 /etc/cron.d/moodle-cron && \
    crontab -u www-data /etc/cron.d/moodle-cron

# Asegurar que el servicio de cron se ejecuta al inicio
RUN touch /var/log/cron.log

WORKDIR /var/www/moodle

ENTRYPOINT ["/entrypoint.sh"]

Para traernos Moodle 4.5 desde su repositorio GIT y que este se clone la primera vez que se inicie el contenedor, debremos escribir un script llamado entrypoint.sh que compruebe si ya se ha clonado Moodle y clonarlo sólo en caso necesario.

Bash
#!/bin/bash
set -e

# Arreglar permisos 
git config --global --add safe.directory /var/www/moodle

# Comprobar si está Moodle clonado del repo GIT
if [ ! -d "/var/www/moodle/.git" ]; then
    echo "Moodle no descargado, clonando del repo git"
    git clone --depth=1 -b MOODLE_405_STABLE https://github.com/moodle/moodle.git /var/www/moodle
    chown -R www-data:www-data /var/www/moodle
    chmod -R 755 /var/www/moodle
fi

# Lanzar PHP-FPM
exec docker-php-entrypoint php-fpm


Finalmente generaremos un fichero PHP.ini que incluya la configuración de determinadas variables de PHP necesarias para su buen funcionamiento.

INI
; Incrementar el tamaño máximo de las subidas
upload_max_filesize = 512M

; Incrementar el tamaño máximo de POST
post_max_size = 512M

; Aumentar la memoria RAM
memory_limit = 2048M

; Incrementar max_input_vars , necesario para Moodle
max_input_vars = 9999

; Habilitar el informe de error, para desarrollo
error_reporting = E_ALL
display_errors = On

; Configurar zona horaria
date.timezone = Europe/Amsterdam

Contenedor moodle_mysql (MySQL 8.3)

YAML
mysql:
    image: mysql:8.3
    user: mysql
    container_name: moodle_mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: moodle
      MYSQL_USER: moodleuser
      MYSQL_PASSWORD: moodlepassword
    volumes:
      - ./application/mysql_data:/var/lib/mysql
    networks:
      - moodle_network

  • Propósito : Este contenedor almacena la base de datos de Moodle.
  • Características :
    • Imagen : Utiliza la imagen oficial de MySQL (mysql:8.3).
    • Variables de Entorno : Configura las credenciales de la base de datos, incluyendo la contraseña del usuario root (MYSQL_ROOT_PASSWORD) y las credenciales del usuario de Moodle (MYSQL_USER y MYSQL_PASSWORD).
    • Volúmenes :
      • ./application/mysql_data:/var/lib/mysql: Almacena los datos de la base de datos en un volumen persistente dentro del directorio /application/mysql_data del sistema host.
    • Redes : Conectado a la red moodle_network.

Consideraciones de seguridad para entornos de producción

Si bien esta guía está optimizada para un entorno de desarrollo y pruebas, si deseas desplegar Moodle en producción con esta arquitectura basada en Docker, es fundamental aplicar medidas de seguridad adicionales. A continuación, se detallan algunas buenas prácticas clave:

Configuración segura de MySQL

  • Uso de contraseñas seguras: En lugar de definir credenciales directamente en docker-compose.yml, usa un archivo .env para gestionarlas de forma segura.
  • Restricción de acceso: Configura MySQL para aceptar conexiones solo desde servicios autorizados (por defecto, bind-address=127.0.0.1 evita accesos remotos no controlados).
  • Usuarios con privilegios mínimos: No uses el usuario root en producción; crea un usuario específico con permisos limitados para la base de datos de Moodle.

Protección de volúmenes y persistencia de datos

  • Almacenamiento cifrado: Si los datos son sensibles, usa volúmenes cifrados o almacenamiento en bases de datos gestionadas como Amazon RDS o Google Cloud SQL.
  • Backups regulares: Implementa una estrategia de copias de seguridad automatizadas para la base de datos y los archivos de Moodle. Puedes usar mysqldump o soluciones como AutoMySQLBackup.
  • Restricción de permisos: Configura los volúmenes con permisos adecuados (chown -R www-data:www-data /var/www/html/moodledata) para evitar accesos no autorizados.

Seguridad en la configuración de Apache y PHP-FPM

  • Deshabilitar módulos innecesarios: Revisa la configuración de Apache y desactiva módulos que no sean estrictamente necesarios para minimizar la superficie de ataque.
  • Límites en PHP-FPM: Configura php.ini para evitar ejecuciones excesivas de scripts y restricciones en tamaño de archivos (upload_max_filesize, post_max_size).
  • Protección contra ataques comunes: Implementa reglas en .htaccess para mitigar ataques de inyección SQL y XSS.

Seguridad en Docker y Docker Compose

  • Uso de redes personalizadas: Define redes específicas en Docker Compose en lugar de exponer servicios directamente al host.
  • No ejecutar contenedores como root: Asegúrate de que los servicios dentro de los contenedores se ejecuten con un usuario sin privilegios elevados.
  • Actualización regular de imágenes: Usa imágenes oficiales y manténlas actualizadas para corregir vulnerabilidades (docker-compose pull && docker-compose up -d).

Configuración de HTTPS con SSL en producción

Aunque mkcert es útil para desarrollo, en producción es recomendable utilizar Let’s Encrypt con Certbot o un certificado SSL de una entidad certificadora reconocida. Configura un proxy inverso con Nginx o Traefik para manejar SSL y mejorar la seguridad del tráfico.

Iniciar el sistema

Hemos configurado todos los ficheros necesarios y definido los servicios que conforman nuestro entorno Docker para Moodle. Primero debemos construir nuestro Moodle dockerizado, para ello utilizaremos el comando docker compose build. Posteriormente en este paso, iniciaremos los contenedores utilizando el comando docker-compose up, lo que permitirá que Apache HTTPD, PHP-FPM y MySQL comiencen a funcionar. Verificaremos que todos los servicios estén operativos y listos para ejecutar Moodle.

Este es un momento crucial, ya que pondremos en marcha el entorno que hemos diseñado previamente.

Una vez que los servicios estén activos, podremos acceder a Moodle desde nuestro navegador a través de la url https://localhost/install.php y comenzar la configuración inicial de la plataforma.

Instalación de Moodle

Iniciar instalación

Una vez desplegado el Moodle en Docker, el siguiente paso es instalarlo, para ello accederemos a la url https://localhost/install.php y seleccionaremos nuestro idioma y una vez hecho, haremos click en «Siguiente».

El primer paso que nos pedirá a Moodle es que confirmemos los directorios en los que se instalará.

Configuración de base de datos


Después nos solicitará el tipo de base de datos, en nuestro caso, estamos utilizando MySQL, así que utilizaremos el driver MySQLi para que nuestro Moodle se conecte a través de él a la base de datos del contenedor de Docker.

Después introduciremos nuestras credenciales de la base de datos, en nuestro caso, si no se ha modificado el fichero docker-compose.yml estas son las siguientes:

  • Servidor de la base de datos: moodle_mysql
  • Nombre de la base de datos: moodle
  • Usuario de la base de datos: moodleuser
  • Contraseña de la base de datos: moodlepassword

El resto de datos los dejaremos por defecto y apretaremos el botón siguiente.

Si todo ha ido bien nos encontraremos con un página en la que debemos aceptar la licencia de Moodle. Si no, Moodle nos mostrará dónde está fallando la conexión con la base de datos.

Instalación ( de verdad )

Al apretar en continuar Moodle realizará una comprobación de los requisitos de PHP y del servidor – Dockerizado en nuestro caso – . En caso que todas las comprobaciones hayan pasado correctamente, nos dará todo OK. Si hay algún valor a corregir, nos dará un warning con texto ‘Revisar’ , pero nos dejará continuar con la instalación, en caso contrario, aparecerá un mensaje de error en algún elemento y nos impedirá continuar la instalación a menos que lo solucionemos.

Si todo ha ido correctamente, podremos apretar el botón Continuar y entonces Moodle empezará a instalar toda la plataforma, mostrando en la página el progreso de instalación.
Nota: Esto puede tardar un tiempo, e incluso cortarse, dependiendo de la memoria RAM y cantidad de memoria RAM asignada a PHP. Si se cortara ( por timeout del servidor Apache, por ejemplo ) sería necesario recargar la página, refrescar desde el navegador. Moodle continuaría instalando el entorno. Hay que tener paciencia, ya que la instalación de Moodle por muy rápido que sea la máquina o el entorno dockerizado, es algo lenta y puede tardar varios minutos.

Finalmente, al acabar la instalación, nos aparecerá un botón de continuar y nos cargará otra página en la que nos solicitará los detalles de nuestra plataforma Moodle. Entre estos detalles se encuentra el usuario administrador. Introduciremos los detalles y Moodle nos creará un usuario administrador con los datos que le hayamos facilitado.

Configuración de usuario administrador

Configuración de la plataforma Moodle


Cuando acabemos de crear el usuario, nos solicitará los datos de nuestra plataforma Moodle, como nombre de nuestro LMS, zona horaria y otros ajustes.

Finalmente, al completar estos datos, nos aparecerá Moodle con su página de inicio.

Acceso como administrador y creación de curso

Una vez nuestro Moodle esté instalado, podremos acceder al administrador de la plataforma y navegar por el panel de control o cargar cursos.
En esta última parte del tutorial, accederemos a Moodle, visitando rápidamente algunas secciones del panel de control e importando un curso de demostración.
Para acceder a la página de login haremos click en la home arriba a la derecha, en el enlace donde pone ‘Acceder’. Tras esto, se nos abrirá una ventana de Login, en la que introduciremos las credenciales del usuario administrador que hemos configurado en los pasos anteriores: usuario y contraseña.

Si las credenciales introducidas son correctas, accederemos a la página de usuario o área personal de Moodle, en la que nos mostrará nuestros cursos y el calendario de actividades a realizar. Evidentemente como este Moodle no tiene contenido, estará todavía en blanco.

Para acceder al menú o área de administración, haremos click en ‘Administración del sitio’ y se nos mostrará una página con todas las opciones posibles de administración separadas en grandes grupos o pestañas.

Administrador de Moodle

Después accederemos a la sección de cursos, que en nuestro caso está vacía.
Desde esta sección pueden gestionarse los cursos y categorías de cursos que tenemos cargadas en Moodle.

Administrador de cursos y categorías de Moodle

Ahora vamos a importar un curso de demostración ya diseñado y creado por la comunidad de Moodle. Para ello accederemos a https://moodle.net/resource/QX8uIgso/curso-virtual-de-moodle-para-docentes y dentro de esta página nos descargaremos el curso apretando en el botón Download File, esto nos descargará un curso de Moodle en formato comprimido ( extensión .mbz ).

Descarga de curso de Moodle

Una vez descargado el fichero .mbz, lo importaremos dentro de nuestro Moodle, para ello dentro del menú administrador, entraremos a la opción ‘Restaurar curso’. Dentro de esta ventana seleccionaremos el fichero MBZ que hemos descargado con anterioridad y lo subiremos a la web.

Administrador de Moodle, restaurar curso

Una vez subido, haremos click el botón restaurar y el sistema comenzará a trabajar en la restauración.

Configuración para la restauración del curso de Moodle

Tras apretar el botón de restaurar, el sistema mostrará un asistente de 7 pasos en los que informa paso a paso de las posibles configuraciones a utilizar al restaurar el curso. Iremos paso por paso seleccionando las opciones que necesitemos o que nos interesen

Configuración para restauración del curso de Moodle

En el penúltimo paso del proceso es donde pasa todo.
Aquí debe estar corriendo el planificador de tareas o Cron, para que ejecute la tarea de restauración de contenidos en segundo plano.

Restaurando curso de Moodle

Cuando termine el proceso de restauración, Moodle mostrará la barra de progreso en color verde, indicando que el proceso ha finalizado.

Restauración de curso de Moodle 100%

Finalmente, se mostrará el curso ya restaurado y en él podremos incluir participantes y configurar más sobre el curso.
Como el tema de este tutorial era la creación de un entorno Moodle con Docker, lo dejaremos por ahora, para volver en un próximo tutorial de Moodle.

Curso de Moodle una vez restaurado

Conclusiones

En este tutorial, hemos recorrido paso a paso la instalación y configuración de Moodle 4.5 utilizando Docker con Apache, PHP-FPM 8.3 y MySQL 8.3. Esta guía te ha permitido crear un entorno de aprendizaje virtual seguro, escalable y fácil de replicar, ideal tanto para desarrollo como para pruebas. Con Docker, has logrado aislar las dependencias y simplificar la gestión de los servicios necesarios para Moodle. Ahora que tu plataforma está en funcionamiento, puedes comenzar a personalizarla, crear cursos y aprovechar todas las herramientas que Moodle ofrece para potenciar el aprendizaje en línea.

Sin embargo, si necesitas una solución más robusta, personalizada o integrada con otras herramientas, en Entornos de Formación (www.edf.global) estamos especializados en el desarrollo e integración de soluciones LMS a medida. Ya sea que necesites una plataforma educativa completamente personalizada, integraciones con sistemas existentes, o soporte técnico avanzado, nuestro equipo de expertos está listo para ayudarte. No dudes en contactarnos para una consulta sin compromiso.

Entornos de Formación edTech

¡Estamos aquí para convertir tus ideas en realidad y ayudarte a crear entornos de aprendizaje que se adapten a tus necesidades específicas!

5 respuestas a “Instalar Moodle 4.5 en Docker con Apache, PHP-FPM y MySQL: Guía Paso a Paso”

  1. Tenes idea de como se procede con las actualizaciones del core cuando se usa esta imagen?. Estoy usando la imagen de bitnami/moodle y se actualiza solo. Salvo en las ultimas versiones.

    • ¡Hola Pablo! Gracias por tu comentario 😊

      Cuando usas una instalación personalizada de Moodle, como la que explico en el artículo (con Apache, PHP-FPM y MySQL en Docker), las actualizaciones del core no se realizan automáticamente como ocurre con algunas imágenes como la de Bitnami. Sin embargo, eso también te da mayor control y flexibilidad sobre tu entorno.

      Para gestionar las actualizaciones en este tipo de instalaciones, te recomiendo seguir el método que detallo en este otro artículo:

      👉 Mantén tu Moodle al día: Guía profesional para una actualización con éxito

      En esa guía explico cómo mantener tu Moodle actualizado de forma ordenada y profesional, utilizando Git como herramienta central del proceso. Git te permite gestionar versiones, controlar los cambios y actualizar el core de Moodle de forma mucho más segura y trazable, incluso cuando estás trabajando en un entorno Dockerizado.

      ¡Espero que te sirva! Si te animas a probarlo o tienes más dudas, estaré encantado de ayudarte.

  2. Y cuando lo gestiones en versionado con git, y por ejemplo tenes montada las carpetas de moodle normales. El git lo usas desde el contenedor o desde afuera?

    • ¡Hola de nuevo Pablo!
      El proyecto de Git de Moodle está montado sobre el directorio /application/moodle de mi proyecto de Moodle Dockerizado.
      De hecho, siempre instalo Moodle clonando el repositorio Git oficial Moodle Github y después creo el repositorio en mi Gitlab on-premises o en la infraestructura DevOps de mi cliente, esto me permite añadir los parches de Moodle y llevar un control absoluto del código de Moodle, plugins y themes centralizado en el Git.
      A la respuesta de git utilizado dentro o fuera del contenedor de PHP-FPM ( en el que reside Moodle ), la respuesta es utilización desde fuera del contenedor, desde la máquina host, aunque también podría hacer las operaciones dentro del contenedor, pero por temas de permisos y otros, lo utilizo desde fuera del contenedor.
      Eso sí, para actualizar Moodle, debes ejecutar los comandos desde dentro del contenedor de PHP-FPM.

      Espero haberte resuelto tu duda.
      Un saludo desde España

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *