用 Docker 部署 Moodle 需拆分 Web、PHP、数据库和存储服务,组合 mariadb:10.6、moodlehq/moodle-php-apache:8.1 和 nginx:alpine 镜像,通过 docker-compose.yml 编排,启用命名卷持久化,并设 MOODLE_DOCKER_SKIP_INIT=1 手动完成浏览器安装。

用 Docker 部署 Moodle 是目前最轻量、可复现性最强的方式之一,核心在于合理拆分服务(Web + PHP + 数据库 + 存储),避免直接使用单体镜像。官方不提供“开箱即用”的完整 Moodle 容器,所以需组合官方或可信镜像,自行编排。
准备基础服务容器
Moodle 依赖 PHP(≥7.4)、MySQL/MariaDB、Web 服务器(Nginx 或 Apache)及持久化存储。推荐使用以下组合:
-
数据库:用
mariadb:10.6或mysql:8.0,设置MYSQL_ROOT_PASSWORD和专用 moodle 用户 -
PHP-FPM:用
moodlehq/moodle-php-apache(官方维护)或基于php:8.1-apache自定义构建,确保启用gd, zip, xml, mbstring, curl, intl, opcache等扩展 -
Web 代理(可选但推荐):用
nginx:alpine反向代理 PHP-FPM,分离静态资源处理与动态请求 -
数据卷:为
/var/www/html(代码)、/moodledata(运行时数据)、数据库目录分别挂载命名卷或宿主机路径
编写 docker-compose.yml 编排文件
这是部署成败关键。以下是一个最小可行配置(含注释):
version: '3.8'
services:
db:
image: mariadb:10.6
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: moodle
MYSQL_USER: moodleuser
MYSQL_PASSWORD: moodlepass
volumes:
- moodle_db:/var/lib/mysql
command: --max-allowed-packet=64M
<p>php:
image: moodlehq/moodle-php-apache:8.1
restart: unless-stopped
depends_on: [db]
volumes:</p><ul><li>moodle_code:/var/www/html</li><li>moodle_data:/var/www/moodledata</li><li>./php.ini:/usr/local/etc/php/php.ini:ro
environment:
MOODLE_DB_TYPE: mysqli
MOODLE_DB_HOST: db
MOODLE_DB_NAME: moodle
MOODLE_DB_USER: moodleuser
MOODLE_DB_PASS: moodlepass
MOODLE_WWWROOT: <a href="https://www.php.cn/link/bb122c8fe6c764e8aae555e2186a6344">https://www.php.cn/link/bb122c8fe6c764e8aae555e2186a6344</a>
MOODLE_DOCKER_SKIP_INIT: "1" # 跳过自动安装,手动初始化更可控</li></ul><p>web:
image: nginx:alpine
restart: unless-stopped
ports: ["80:80", "443:443"]
volumes:</p><ul><li>moodle_code:/var/www/html:ro</li><li>moodle_data:/var/www/moodledata:ro</li><li>./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on: [php]</li></ul><p>volumes:
moodle_code:
moodle_data:
moodle_db:
注意:MOODLE_DOCKER_SKIP_INIT: "1" 防止容器启动时自动执行 install.php,便于你通过浏览器首次访问完成向导安装。
初始化与首次安装
启动后按顺序操作:
- 执行
docker-compose up -d启动全部服务 - 等待 10–20 秒让 MariaDB 初始化完成(可用
docker-compose logs -f db查看) - 访问
https://www.php.cn/link/bb122c8fe6c764e8aae555e2186a6344,进入 Moodle 安装向导 - 数据库配置页填入:
数据库类型:MySQLi
主机:db(Docker 内部服务名)
数据库名/用户/密码:与 docker-compose 中一致 - 安装完成后,系统会生成
config.php并写入moodle_code卷中,该文件将被持久化
后续维护与升级要点
Docker 部署不是一劳永逸,需关注以下实践:
-
备份:定期导出数据库(
docker exec moodle_db mysqldump -umoodleuser -pmoodlepass moodle > backup.sql)+ 打包moodle_data卷内容 -
升级 Moodle:拉取新版 PHP 镜像 → 更新
docker-compose.yml中 image 标签 →docker-compose down && docker-compose up -d→ 访问/admin/upgrade.php执行数据库升级 -
插件安装:上传 ZIP 到
moodle_code卷的local/或mod/目录,或通过管理后台安装,重启 PHP 容器非必需(除非插件含 PHP 扩展依赖) -
HTTPS 支持:替换
nginx.conf启用 SSL,挂载证书到容器,并开放 443 端口;生产环境强烈建议启用
不复杂但容易忽略:每次修改 config.php 或上传插件后,记得确认容器内文件权限(如 www-data 用户可读写 moodledata),否则易出现“Can’t write to moodledata”错误。

















