Skip to content

MariaDB and Docker Compose

This is a short instructions how to run #mariadb with #docker official image with docker compose and have suitable developer env. Let’s have follow docker-compose.yml

version: "3.9"
volumes:
mysql:
services:
mariadb:
image: mariadb:latest
environment:
TZ: Europe/Prague
MARIADB_ROOT_PASSWORD: root
MARIADB_DATABASE: exampledb
MARIADB_AUTO_UPGRADE: "yes" # will run mysql_uprade
restart: always
volumes:
- mysql:/var/lib/mysql # mysql data
- ./etc/mysql.ini:/etc/mysql/conf.d/my.ini # config file
- ./etc/db/mariadb:/docker-entrypoint-initdb.d/:ro # init sql
ports:
- "3306:3306"
# php-fpm:
# nginx:
# ...

Optionally you can define database with config file - here is mine ./etc/mysql.ini:

[mysqld]
character-set-server=utf8
collation-server=utf8_czech_ci

Initializing a fresh instance

When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions.sh,.sql,.sql.gz,.sql.xzand.sql.zstthat are found in/docker-entrypoint-initdb.d

Let’s create ./etc/db/mariadb/01-init.sql file that will create database:

CREATE DATABASE IF NOT EXISTS exampledb CHARACTER SET utf8 COLLATE utf8_general_ci;

Then you can add 02-schema.sql file with database schema and 03-data.sql file with init data. You can commit those files to git and share them with all coworkers.

Now it’s time run docker compose up

Connect to database prompt

Terminal window
docker compose exec mariadb bash -c 'mysql -u root -p$MARIADB_ROOT_PASSWORD $MARIADB_DATABASE'

Backup database

First backup database schema

Terminal window
docker compose exec mariadb bash -c 'mysqldump --no-data -uroot -p$MARIADB_ROOT_PASSWORD $MARIADB_DATABASE --databases $MARIADB_DATABASE | sed "s/ AUTO_INCREMENT=[0-9]*\b//g"' > etc/db/mariadb/02-scheme.sql

then backup data

Terminal window
docker compose exec mariadb bash -c 'mysqldump --hex-blob --no-create-info --databases $MARIADB_DATABASE --skip-extended-insert --complete-insert=true --default-character-set=utf8 -uroot -p$MARIADB_ROOT_PASSWORD $MARIADB_DATABASE' > etc/db/mariadb/03-data.sql

or you can backup everything together

Terminal window
docker compose exec mariadb bash -c 'mysqldump -uroot -p$MARIADB_ROOT_PASSWORD $MARIADB_DATABASE --databases $MARIADB_DATABASE' > backup/database.sql

Restore database from SQL file

Terminal window
docker compose exec mariadb bash -c 'mysql -uroot -p$MARIADB_ROOT_PASSWORD $MARIADB_DATABASE' < backup/database.sql

Execute mysql_upgrade after upgrade

Terminal window
docker compose exec mariadb bash -c 'mysql_upgrade -uroot p$MARIADB_ROOT_PASSWORD'

Visit https://hub.docker.com/_/mariadb for more invormation.