用docker部署moodle并外接独立数据库容器是推荐方式,需拆分web、php、数据库服务,选用mariadb:10.6、moodlehq/moodle-php-apache:8.1和nginx:alpine镜像,通过docker-compose.yml编排,设moodle_docker_skip_init=1手动安装,持久化挂载/moodledata与/var/www/html。

用 Docker 部署 Moodle 并外接独立数据库容器,是兼顾稳定性、可维护性与资源复用的推荐方式。关键不是把所有服务塞进一个镜像,而是让 Moodle 应用容器只专注运行 PHP 和 Web 逻辑,数据库交由专用容器管理——这样升级、备份、迁移都更清晰。
选对镜像组合,避免“全家桶”陷阱
官方不提供开箱即用的完整 Moodle 容器,所以需自行组合可信镜像:
-
数据库容器:推荐
mariadb:10.6或mysql:8.0,轻量且兼容性好;避免用老旧版本(如 mariadb:10.1)以防 PHP 8+ 扩展不兼容 -
Moodle 应用容器:优先选用
moodlehq/moodle-php-apache:8.1(官方维护),已预装 gd、zip、mbstring、opcache 等必需扩展;不建议直接用moodle/moodle这类简单镜像,它缺少持久化设计和初始化控制 -
Web 层(可选但推荐):加一层
nginx:alpine反向代理,静态文件由 Nginx 直接服务,PHP 请求转发给 PHP 容器,降低 Apache 负载
数据库容器要独立启动并联网
外置数据库的核心是让它先就位、可通信、权限明确:
- 创建专用网络:
docker network create moodle-net,所有容器加入该网络,用服务名互访(如 PHP 容器访问db) - 启动 MariaDB 容器时显式指定用户和库:
docker run -d \<br> --name moodle-db \<br> --network moodle-net \<br> -e MYSQL_ROOT_PASSWORD=root123 \<br> -e MYSQL_DATABASE=moodle \<br> -e MYSQL_USER=moodleuser \<br> -e MYSQL_PASSWORD=moodlepass \<br> -v moodle_db:/var/lib/mysql \<br> -p 3307:3306 \<br> mariadb:10.6
注意:暴露宿主机端口(如-p 3307:3306)仅用于本地调试,生产环境建议关闭,仅靠容器内网通信 - 验证连通性:进入 PHP 容器执行
mysql -h moodle-db -u moodleuser -pmoodlepass moodle -e "SELECT 1",能返回结果才算通
应用容器通过环境变量对接数据库
Moodle 容器不内置数据库配置,全靠环境变量驱动连接行为:
- 必须设置的变量(缺一不可):
MOODLE_DB_TYPE=mysqli(不是 mariadb)MOODLE_DB_HOST=moodle-db(必须与数据库容器名一致)MOODLE_DB_NAME=moodleMOODLE_DB_USER=moodleuserMOODLE_DB_PASS=moodlepassMOODLE_WWWROOT=http://your-domain-or-ip(不能是 localhost,否则安装后跳转失败) - 跳过自动初始化:
MOODLE_DOCKER_SKIP_INIT=1,强制走浏览器安装向导,避免因时序问题导致数据库表未建好就写入配置 - 持久化两个关键路径:
/var/www/html(Moodle 代码)挂载命名卷或宿主机目录/var/www/moodledata(用户上传、缓存等)必须单独挂载,不可与代码混用
用 docker-compose.yml 编排更可靠
比手动 run 多个容器更可控,尤其适合外置数据库场景:
- 定义
db服务时,用command: --max-allowed-packet=64M防止大课程包导入失败 - 在
php服务中,用depends_on: [db]+healthcheck确保 DB 就绪后再启动 PHP - 为
web(Nginx)服务设volumes: ... :ro只读挂载,提升安全性 - 所有命名卷(
moodle_code、moodle_data、moodle_db)统一在volumes:区块声明,避免隐式创建临时卷
部署完成后,浏览器访问 http://your-domain-or-ip 进入安装向导,数据库主机填 moodle-db,其他字段按容器环境变量保持一致即可。整个过程不依赖宿主机装 PHP 或 MySQL,真正实现环境隔离与快速重建。











