System Administrator's Guide/Installing Mahara/MySQL and Docker

From Mahara Wiki

< System Administrator's Guide‎ | Installing Mahara

Note: This is intended to assist developers. If you are using this in a production environment it is expected that you will be rolling your own docker config for much higher security than this offers.


Docker can make things easy. It can also be fiddly. This worked for me.

  • Create the docker-compose.yml file
  • Update your config.php file
  • Spin up the container: docker-compose run --service-ports -d db
  • Point a browser at your site.

The longer version


Add this to a docker-compose.yml file. This file can live anywhere and doesn't need to be in your checked out repo.

version: '3'
       image: mysql
       command: --default-authentication-plugin=mysql_native_password
       restart: always
           MYSQL_ROOT_PASSWORD: "password"
           MYSQL_USER: "maharauser"
           MYSQL_PASSWORD: "maharapassword"
           MYSQL_DATABASE: "mahara"
           - 3323:3306
           - my-datavolume:/var/lib/mysql

Spin up the container

docker-compose run --service-ports -d db

What is this doing?

We are creating a service (db) and a volume (for persistent storage).

The image is the official image.

The environment tells the container to set the root users password to "password" and to create another user that we will connect to the DB as. It also creates the "mahara" database.

The ports map port 3323 on the host to port 3306 in the container. Set 3323 to anything you like if this is in conflict. This is preconfigured to a non-standard port just for ease of copy/paste. By default MySQL will be running on port 3306 and if you already have a different version running this will let you spin up your target version without conflicting with the existing one. Update the image with the version you want. The current value will fetch the latest version.

The volumes tells docker to use persistent storage so your data will still be there after a restart of the container. The lack of settings on my-datavolume tells docker to pick how to manage this.



Add the following to your config.php file:

$cfg->dbtype = 'mysql';
$cfg->dbhost = '';
$cfg->dbport = 3323;
$cfg->dbuser = 'maharauser';
$cfg->dbpass = 'maharapassword';
$cfg->dbname = 'mahara';

It is important to use as the host. If mysql receives localhost here it will try and connect via the local unix socket on the filesystem despite having a port set.


I have had issues with the maharauser not being able to create triggers and these are needed on site install. To get around this connect to the database as root and run the following:

GRANT ALL PRIVILEGES ON *.* TO 'maharauser'@'%';

THIS IS DANGEROUS... Do not do this anywhere except in a development environment. I could not figure out why, but running this on mahara.* was not enough.