如何通过Docker容器高效部署Moodle在线学习平台?
- 内容介绍
- 文章标签
- 相关推荐
本文共计984个文字,预计阅读时间需要4分钟。
使用Docker部署Moodle最稳妥的方式是将其为独立容器:
选对核心镜像组合
官方不提供“一键安装”的完整 Moodle 容器,需自行组合可信镜像:
-
数据库:用
mariadb:10.6(轻量、兼容 PHP 8.1+)或mysql:8.0;避免mariadb:10.1等老旧版本,否则可能缺失 required MySQL 8 特性或 PHP 扩展支持 -
PHP 层:优先选
moodlehq/moodle-php-apache:8.1(Moodle 官方维护),已预装gd、mbstring、xml、opcache、zip、curl、intl等必需扩展 -
Web 层(推荐):加
nginx:alpine反向代理,静态资源由 Nginx 直接服务,PHP 请求转发至 PHP 容器,降低 Apache 负载并提升响应速度
准备持久化存储与网络
Moodle 运行依赖三类持久数据,必须挂载命名卷(不建议仅用宿主机路径):
-
moodle_code:挂载到/var/www/html,存放 Moodle 源码(可从 Git 克隆后映射) -
moodle_data:挂载到/var/www/moodledata,存储上传文件、缓存、插件数据等运行时内容 -
moodle_db:挂载到/var/lib/mysql,确保数据库状态不随容器销毁而丢失 - 创建专用网络:
docker network create moodle-net,所有容器加入该网络,用服务名(如db)互相访问,无需暴露宿主机端口给数据库
编写 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
php:
image: moodlehq/moodle-php-apache:8.1
restart: unless-stopped
depends_on: [db]
volumes:
- moodle_code:/var/www/html
- moodle_data:/var/www/moodledata
- ./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: https://your-domain.com
MOODLE_DOCKER_SKIP_INIT: "1"
web:
image: nginx:alpine
restart: unless-stopped
ports: ["80:80", "443:443"]
volumes:
- moodle_code:/var/www/html:ro
- moodle_data:/var/www/moodledata:ro
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on: [php]
volumes:
moodle_code:
moodle_data:
moodle_db:
启动并完成浏览器安装
执行 docker-compose up -d 启动全部服务后,注意两点:
- 环境变量
MOODLE_DOCKER_SKIP_INIT="1"已禁用自动初始化,所以不会跳转到安装页——这是预期行为,避免因数据库未就绪导致失败 - 用浏览器访问
http://your-domain.com(或http://localhost),会进入标准 Moodle 安装向导,按提示填写数据库信息(主机名填db,用户名/密码与db容器中一致)即可完成部署 - 首次安装成功后,
/var/www/moodledata中会生成config.php,后续重启容器将复用该配置,无需重复安装
本文共计984个文字,预计阅读时间需要4分钟。
使用Docker部署Moodle最稳妥的方式是将其为独立容器:
选对核心镜像组合
官方不提供“一键安装”的完整 Moodle 容器,需自行组合可信镜像:
-
数据库:用
mariadb:10.6(轻量、兼容 PHP 8.1+)或mysql:8.0;避免mariadb:10.1等老旧版本,否则可能缺失 required MySQL 8 特性或 PHP 扩展支持 -
PHP 层:优先选
moodlehq/moodle-php-apache:8.1(Moodle 官方维护),已预装gd、mbstring、xml、opcache、zip、curl、intl等必需扩展 -
Web 层(推荐):加
nginx:alpine反向代理,静态资源由 Nginx 直接服务,PHP 请求转发至 PHP 容器,降低 Apache 负载并提升响应速度
准备持久化存储与网络
Moodle 运行依赖三类持久数据,必须挂载命名卷(不建议仅用宿主机路径):
-
moodle_code:挂载到/var/www/html,存放 Moodle 源码(可从 Git 克隆后映射) -
moodle_data:挂载到/var/www/moodledata,存储上传文件、缓存、插件数据等运行时内容 -
moodle_db:挂载到/var/lib/mysql,确保数据库状态不随容器销毁而丢失 - 创建专用网络:
docker network create moodle-net,所有容器加入该网络,用服务名(如db)互相访问,无需暴露宿主机端口给数据库
编写 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
php:
image: moodlehq/moodle-php-apache:8.1
restart: unless-stopped
depends_on: [db]
volumes:
- moodle_code:/var/www/html
- moodle_data:/var/www/moodledata
- ./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: https://your-domain.com
MOODLE_DOCKER_SKIP_INIT: "1"
web:
image: nginx:alpine
restart: unless-stopped
ports: ["80:80", "443:443"]
volumes:
- moodle_code:/var/www/html:ro
- moodle_data:/var/www/moodledata:ro
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on: [php]
volumes:
moodle_code:
moodle_data:
moodle_db:
启动并完成浏览器安装
执行 docker-compose up -d 启动全部服务后,注意两点:
- 环境变量
MOODLE_DOCKER_SKIP_INIT="1"已禁用自动初始化,所以不会跳转到安装页——这是预期行为,避免因数据库未就绪导致失败 - 用浏览器访问
http://your-domain.com(或http://localhost),会进入标准 Moodle 安装向导,按提示填写数据库信息(主机名填db,用户名/密码与db容器中一致)即可完成部署 - 首次安装成功后,
/var/www/moodledata中会生成config.php,后续重启容器将复用该配置,无需重复安装

