Docker 中部署 moodle

瞳人


发布于 July 4, 2015, 10:50 p.m.

0 个评论

Docker Moodle


介绍如何在docker中部署moodle.

Docker

应用容器. 请看官方的主页Docker.

Moodle

一个开源的课程平台. 请看官方主页Moodle.

部署架构

使用 docker-compose 来运行. 主要用到两个容器:

  1. 数据库, 此处采用 mysql
  2. moodle 本体. 包括 apache2, php, moodle 代码.

Build Moodle Image

Dockerfile 文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
FROM aplusplus/ubuntu:14.04
MAINTAINER Shengwei An (njuasw at google mail)

COPY start.sh /app/
COPY config.tmpl /app/

RUN apt-get update && \
    apt-get install -y apache2 php5 libapache2-mod-php5 \
        php5-mysql php5-curl php5-xmlrpc php5-gd php5-intl && \
    rm -rf /var/lib/apt/lists/* && \
    echo "AcceptPathInfo On" >> /etc/apache2/httpd.conf && \
    sed -i "s/;date.timezone =/date.timezone = \"Asia\/Shanghai\"/g" /etc/php5/apache2/php.ini && \
    sed -i "s/;date.timezone =/date.timezone = \"Asia\/Shanghai\"/g" /etc/php5/cli/php.ini && \
    sed -i 's/post_max_size = 8M/post_max_size = 32M/g' /etc/php5/apache2/php.ini && \
    sed -i 's/post_max_size = 8M/post_max_size = 32M/g' /etc/php5/cli/php.ini && \
    sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 32M/g' /etc/php5/apache2/php.ini && \
    sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 32M/g' /etc/php5/cli/php.ini && \
    chmod 755 /app/start.sh

EXPOSE 80

CMD ["/app/start.sh"]

start.sh 文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash

chmod 0777 /var/moodledata/
rm -rf /var/www/html/config.php
cp /app/config.tmpl /var/www/html/config.php
sed -i 's/{{MYSQL_PORT_3306_TCP_ADDR}}/'"${MYSQL_PORT_3306_TCP_ADDR}"'/g' /var/www/html/config.php
sed -i 's/{{MYSQL_ENV_DB_NAME}}/'"${MYSQL_ENV_DB_NAME}"'/g' /var/www/html/config.php
sed -i 's/{{MYSQL_ENV_DB_USER}}/'"${MYSQL_ENV_DB_USER}"'/g' /var/www/html/config.php
sed -i 's/{{MYSQL_ENV_DB_PASS}}/'"${MYSQL_ENV_DB_PASS}"'/g' /var/www/html/config.php

source /etc/apache2/envvars
tail -F /var/log/apache2/* &
exec apache2 -D FOREGROUND

config.tmpl 文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php  // Moodle configuration file

unset($CFG);
global $CFG;
$CFG = new stdClass();

$CFG->dbtype    = 'mysqli';
$CFG->dblibrary = 'native';
$CFG->dbhost    = {{MYSQL_PORT_3306_TCP_ADDR}};
$CFG->dbname    = {{MYSQL_ENV_DB_NAME}};
$CFG->dbuser    = {{MYSQL_ENV_DB_USER}};
$CFG->dbpass    = {{MYSQL_ENV_DB_PASS}};
$CFG->prefix    = 'mdl_';
$CFG->dboptions = array (
  'dbpersist' => 0,
  'dbport' => 3306,
  'dbsocket' => '',
);

$CFG->wwwroot   = 'http://example.com/'; //替换成你的网址
$CFG->dataroot  = '/var/moodledata';
$CFG->admin     = 'admin';

$CFG->directorypermissions = 0777;

require_once(dirname(__FILE__) . '/lib/setup.php');

// There is no php closing tag in this file,
// it is intentional because it prevents trailing whitespace problems!

创建 moodle 的 image:

1
docker build -t aplusplus/moodle .

下载 moodle 代码

moodle下载页面

1
2
3
# 解压缩 moodle-latest-29..tgz
cd /myapps/moodle/
tar zxvf moodle-latest-29.tgz

使用 docker-compose 运行 moodle

docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
mysql:
  image: aplusplus/mysql
  restart: always
  environment:
    - DB_NAME=moodle
    - DB_USER=moodle
    - DB_PASS=moodle
  volumes:
    - /myapps/moodle/mysql/data/:/var/lib/mysql/
moodle:
  image: aplusplus/moodle
  restart: always
  links:
    - mysql:mysql
  ports:
    - "80:80"
  volumes:
    - /myapps/moodle/moodle/:/var/www/html/
    - /myapps/moodle/moodledata/:/var/moodledata/

完成安装

使用浏览器访问你设置的网址来进行moodle的安装.


如果是全新的安装, 那么步骤到此就结束了. 如果是迁移或者更新, 请参考迁移更新部分.

更新 moodle

基本步骤与 moodle 官方文档一致. 请自行做好备份, 将 moodle 置为维护模式. 然后使用 docker-compose stop 停止正在运行的moodle. 然后下载最新的 moodle.

1
2
3
4
cd /myapps/moodle
mv moodle moodle.backup
tar zxvf moodle-latest-29.tgz
cp moodel.backup/config.tmpl moodle/

如果有自定义的 theme 或者 mod, 记得下载新版本.

你可以看看新的 moodle 的 config-dist.php 里面有什么新的选项. 可以和 config.tmpl 对比一下. 如果没什么问题. 就可以使用 docker-compose up -d 来重新创建container并运行. 然后使用浏览器访问你的网址来完成安装步骤.

迁移 moodle

这也是我之前做的一件事情, 我把 moodle 从虚拟机运行环境中迁移到 docker 运行环境中.

主要就是把原来的moodle数据, 以及数据库导出, 然后在新的 container 里面恢复就行了. moodle 的路径 就和上面定义的一样就行了. 这里主要讲一下我遇到的数据库导入遇到的问题.

  1. unsupported_db_storage_engine 错误

    之前moodle的mysql中使用的默认数据库存储引擎MyISAM, 而moodle要求的为InnoDB. 所以我们要对其转换. 有两种方法, 任选其一即可:

    1. (导入前) 我们的 docker mysql image 中默认使用的是 InnoDB 引擎, 而在导出的 sql 文件中, 我发现在创建每张表格 的时候, 后面有 ENGINE=MyISAM 这一片段. 所以我就直接删了这个片段. 采用默认引擎创建表.

    2. (导入后) 先导入数据库, 然后使用 moodle 提供的管理命令来转换数据库.

      1
      sudo -u www-data /usr/bin/php admin/cli/mysql_engine.php --engine=InnoDB
      
  2. unsupported_db_table_row_format 错误

    在导入数据库之后更新 moodle 的时候, 又发现这个错误. 这是由于 InnoDB 使用的是 Antelope 作为文件格式, 而 moodle 推荐使用 Barracuda. 我们可以使用moodle 提供的管理命令. 然而这需要数据库的超级权限. 所以我们要修改一下 docker-compose.yml:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    mysql:
      image: aplusplus/mysql
      restart: always
      environment:
        - DB_NAME=moodle
        - DB_USER=moodle
        - DB_PASS=moodle
        - DB_REMOTE_ROOT_NAME=root
        - DB_REMOTE_ROOT_PASS=moodle
        - DB_REMOTE_ROOT_HOST=%
      volumes:
        - /myapps/moodle/mysql/data/:/var/lib/mysql/
    

    然后把 moodle 的 config.tmpl 中的 $CFG->dbuser 改成 root. 然后运行 moodle. 进入 moodle 的 container 中, 执行如下命令:

    1
    2
    3
    4
    5
    cd /var/www/html/
    # 显示是否需要转换
    sudo -u www-data /usr/bin/php admin/cli/mysql_compressed_rows.php -l
    # 进行转换
    sudo -u www-data /usr/bin/php admin/cli/mysql_compressed_rows.php -f
    

    最后, 使用 docker-compose up -d 重启容器即可. 其他步骤和上面安装或更新一致.

迁移并更新

其实我做的是这件事情, 我从虚拟机中的 moodle 28 迁移并更新到了 docker 中的 moodle 29. 这就是上面迁移和更新合起来嘛.


哎呦, 不错哦!

0 Comments


Leave a Comment:

博客搜索

友情链接

公告

本博客代码已经公布在 Github 上,欢迎交流指正。

QQ 邮箱对 mailgun 不太友好, 所以使用 QQ 邮箱的评论, 可能会无法及时收到邮件。我会尽快寻找其他解决方案的。

本人现在独自使用 linode vps, 20 美元/月, 感觉压力大, 如果有意一起合租, 可以联系我. 在我的任意一篇文章下面留言即可. 关于使用方式, 现在倾向于使用 docker.