docker部署moodle核心是拆分web、php、数据库和存储四服务并用docker-compose编排;需用mariadb:10.6、moodlehq/moodle-php-apache:8.1等镜像,挂载命名卷持久化,设moodle_docker_skip_init=1手动浏览器安装。

用 Docker 部署 Moodle 教学系统,核心是把 Web、PHP、数据库和数据存储四部分合理拆开,各自容器化运行,并通过 docker-compose.yml 统一编排。不推荐直接用单体镜像(如 bitnami/moodle),因为灵活性差、升级难、配置黑盒。下面按实际部署逻辑分步说明。
准备基础服务容器
Moodle 运行依赖四个关键组件,需分别拉取对应镜像并确认兼容性:
-
数据库:推荐
mariadb:10.6(稳定、轻量、与 Moodle 兼容性好)。避免用 MySQL 8.0+ 的默认认证插件,否则 PHP 可能连不上;设MYSQL_USER和MYSQL_PASSWORD为专用 moodle 用户,别用 root 直连应用。 -
PHP + Web:官方维护的
moodlehq/moodle-php-apache:8.1是首选,已预装 gd、zip、mbstring、opcache、intl 等必需扩展;若需 Nginx,就只用它做反向代理,PHP 层仍由该镜像提供 Apache + PHP-FPM。 -
静态资源处理(可选但推荐):加一层
nginx:alpine容器,负责 HTTPS 终止、压缩、缓存和静态文件(CSS/JS/图片)直出,减轻 PHP 层压力。 -
持久化存储:必须为三处路径单独挂载命名卷:
/var/www/html(Moodle 代码)、/var/www/moodledata(用户上传、缓存、日志等运行时数据)、/var/lib/mysql(数据库文件)。
编写 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>
- 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://www.php.cn/link/bb122c8fe6c764e8aae555e2186a6344 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:
注意:MOODLE_WWWROOT 要填你最终访问的域名或 IP(如 https://moodle.example.com),不能写 localhost——除非你只在本机测试且没配 hosts。
启动并完成浏览器安装
执行命令启动全部服务:
docker-compose up -d
等 20–30 秒后,用 docker-compose logs php 查看 PHP 容器日志,确认无数据库连接错误;再用浏览器打开 https://www.php.cn/link/bb122c8fe6c764e8aae555e2186a6344(或你设的 MOODLE_WWWROOT 地址),会进入标准 Moodle 安装向导。此时:
- 数据库类型选
mysqli,主机填db(即 compose 中的服务名),端口默认3306; - 数据库名、用户名、密码严格对应
db服务里设的值; -
moodledata路径填/var/www/moodledata(容器内路径,不是宿主机路径); - 管理员账号密码按提示设置,后续可通过后台修改。
安装成功后,所有数据都落在命名卷中,删容器不丢数据;下次 docker-compose up -d 即可恢复完整环境。
常见问题快速定位
如果打不开页面或报错,优先检查这三项:
- 执行
docker-compose ps看所有容器状态是否为Up;若某容器是Exit,立刻用docker-compose logs <service></service>查日志; - 确认
php容器能否连通db:进容器执行nc -zv db 3306,不通说明网络或数据库未就绪; - 检查
web容器的nginx.conf是否正确定义了fastcgi_pass php:8000(若用 Apache 则是proxy_pass http://php)。
不复杂但容易忽略











