A Docker image can be built by anyone who has the ability to write a script. That is why there are many similar images being built by the community, with minor differences but really serving a common purpose. A good (and popular) container image must have well-written documentation with clear explanations, an actively maintained repository and with regular updates. Check out this blog post if you want to learn how to build and publish your own Docker image for MySQL, or this blog post if you just want to learn the basics of running MySQL on Docker.
In this blog post, we are going to look at some of the most popular Docker images to run our MySQL or MariaDB server. The images we have chosen are general-purpose public images that can at least run a MySQL service. Some of them include non-essential MySQL-related applications, while others just serve as a plain mysqld instance. The listing here is based on the result of Docker Hub, the world’s largest library and community for container images.
The following table summarizes the different options:
|Aspect||MySQL (Docker)||MariaDB (Docker)||Percona (Docker)||MySQL (Oracle)||MySQL/MariaDB (CentOS)||MariaDB (Bitnami)|
|Base image||Debian 9||Ubuntu 18.04 (bionic)
Ubuntu 14.04 (trusty)
|CentOS 7||Oracle Linux 7||RHEL 7
|Debian 9 (minideb)
Oracle Linux 7
|Supported database versions||5.5
|129 MB||120 MB||193 MB||99 MB||178 MB||87 MB|
|First commit||May 18, 2014||Nov 16, 2014||Jan 3, 2016||May 18, 2014**||Feb 15, 2015||May 17, 2015|
The images are built and maintained by the Docker community with the help of MySQL team. It can be considered the most popular publicly available MySQL server images hosted on Docker Hub and one of the earliest on the market (the first commit was May 18, 2014). It has been forked ~1300 times with 18 active contributors. It supports the Docker version down to 1.6 on a best-effort basis. At this time of writing, all the MySQL major versions are supported – 5.5, 5.6, 5.7 and 8.0 on x86_64 architecture only.
Most of the MySQL images built by others are inspired by the way this image was built. MariaDB, Percona and MySQL Server (Oracle) images are following a similar environment variables, configuration file structure and container initialization process flow.
The following environment variables are available on most of the MySQL container images on Docker Hub:
The image size (tag: latest) is averagely small (129MB), easy to use, well maintained and updated regularly by the maintainer. If your application requires the latest MySQL database container, this is the most recommended public image you can use.
The images are maintained by Docker community with the help of MariaDB team. It uses the same style of building structure as the mysql (Docker) image, but it comes with multiple architectures support:
- Linux x86-64 (amd64)
- ARMv8 64-bit (arm64v8)
- x86/i686 (i386)
- IBM POWER8 (ppc64le)
At the time of this writing, the images support MariaDB version 5.5 up until 10.4, where image with the “latest” tag size is around 120MB. This image serves as a general-purpose image and follows the instructions, environment variables and configuration file structure as mysql (Docker). Most applications that required MySQL as the database backend is commonly compatible with MariaDB, since both are talking the same protocol.
MariaDB server used to be a fork of MySQL but now it has been diverted away from it. In terms of database architecture design, some MariaDB versions are not 100% compatible and no longer a drop-in replacement with theirs respective MySQL versions. Check out this page for details. However, there are ways to migrate between each other by using logical backup. Simply said, that once you are in the MariaDB ecosystem, you probably have to stick with it. Mixing or switching between MariaDB and MySQL in a cluster is not recommended.
If you would like to set up a more advanced MariaDB setup (replication, Galera, sharding), there are other images built to achieve that objective much more easily, e.g, bitnami/mariadb as explained further down.
Percona Server is a fork of MySQL created by Percona. These are the only official Percona Server Docker images, created and maintained by the Percona team. It supports both x86 and x86_64 architecture and the image is based on CentOS 7. Percona only maintains the latest 3 major MySQL versions for container images – 5.6, 5.7 and 8.0.
The code repository points out that first commit was Jan 3, 2016 with 15 actively contributors mostly from Percona development team. Percona Server for MySQL comes with XtraDB storage engine (a drop-in replacement for InnoDB) and follows the upstream Oracle MySQL releases very closely (including all the bug fixes in it) with some additional features like MyRocks storage engine, TokuDB as well as Percona’s own bug fixes. In a way, you can think of it as an improved version of Oracle’s MySQL. You can easily switch between MySQL and Percona Server images, provided you are running on the compatible version.
The images recognize two additional environment variables for TokuDB and RocksDB for MySQL (available since v5.6):
- INIT_TOKUDB – Set to 1 to allow the container to be started with enabled TOKUDB storage engine.
- INIT_ROCKSDB – Set to 1 to allow the container to be started with enabled ROCKSDB storage engine.
The repository is forked from mysql by Docker team. The images are created, maintained and supported by the MySQL team at Oracle built on top of Oracle Linux 7 base image. The MySQL 8.0 image comes with MySQL Community Server (minimal) and MySQL Shell and the server is configured to expose X protocol on port 33060 from minimal repository. The minimal package was designed for use by the official Docker images for MySQL. It cuts out some of the non-essential pieces of MySQL like innochecksum, myisampack, mysql_plugin, but is otherwise the same product. Therefore, it has a very small image footprint which is around 99 MB.
One important point to note is the images have a built-in health check script, which is very handy for some people who are in need for an accurate availability logic. Otherwise, people have to write a custom Docker’s HEALTHCHECK command (or script) to check for the container health.
The container images are built and maintained by CentOS team which include MySQL database server for OpenShift and general usage. For RHEL based images, you can pull them from Red Hat’s Container Catalog while the CentOS based images are hosted publicly at Docker Hub on different pages for every major version (only list out images with 10M+ downloads):
- MySQL 8.0: https://hub.docker.com/r/centos/mysql-80-centos7
- MySQL 5.7: https://hub.docker.com/r/centos/mysql-57-centos7
- MySQL 5.6: https://hub.docker.com/r/centos/mysql-56-centos7
- MySQL 5.5: https://hub.docker.com/r/centos/mysql-55-centos7
- MariaDB 10.2: https://hub.docker.com/r/centos/mariadb-102-centos7
- MariaDB 10.1: https://hub.docker.com/r/centos/mariadb-101-centos7
The image structure is a bit different and it doesn’t make use of image tag like others, thus the image name becomes a bit longer instead. Having said that, you have to go to the correct Docker Hub page to get the major version you want to pull.
According to the code repository page, 30 contributors have collaborated in the project since February 15, 2015. It supports MySQL 5.5 up until 8.0 and MariaDB 5.5 until 10.2 for x86_64 architecture only. If you heavily rely on Red Hat containerization infrastructure like OpenShift, these are probably the most popular or well-maintained images for MySQL and MariaDB.
The following environment variables influence the MySQL/MariaDB configuration file and they are all optional:
- MYSQL_LOWER_CASE_TABLE_NAMES (default: 0)
- MYSQL_MAX_CONNECTIONS (default: 151)
- MYSQL_MAX_ALLOWED_PACKET (default: 200M)
- MYSQL_FT_MIN_WORD_LEN (default: 4)
- MYSQL_FT_MAX_WORD_LEN (default: 20)
- MYSQL_AIO (default: 1)
- MYSQL_TABLE_OPEN_CACHE (default: 400)
- MYSQL_KEY_BUFFER_SIZE (default: 32M or 10% of available memory)
- MYSQL_SORT_BUFFER_SIZE (default: 256K)
- MYSQL_READ_BUFFER_SIZE (default: 8M or 5% of available memory)
- MYSQL_INNODB_BUFFER_POOL_SIZE (default: 32M or 50% of available memory)
- MYSQL_INNODB_LOG_FILE_SIZE (default: 8M or 15% of available memory)
- MYSQL_INNODB_LOG_BUFFER_SIZE (default: 8M or 15% of available memory)
- MYSQL_DEFAULTS_FILE (default: /etc/my.cnf)
- MYSQL_BINLOG_FORMAT (default: statement)
- MYSQL_LOG_QUERIES_ENABLED (default: 0)
The images support MySQL auto-tuning when the MySQL image is running with the –memory parameter set and if you didn’t specify value for the following parameters, their values will be automatically calculated based on the available memory:
- MYSQL_KEY_BUFFER_SIZE (default: 10%)
- MYSQL_READ_BUFFER_SIZE (default: 5%)
- MYSQL_INNODB_BUFFER_POOL_SIZE (default: 50%)
- MYSQL_INNODB_LOG_FILE_SIZE (default: 15%)
- MYSQL_INNODB_LOG_BUFFER_SIZE (default: 15%)
The images are built and maintained by Bitnami, experts in software packaging in virtual or cloud deployment. The images are released daily with the latest distribution packages available and use a minimalist Debian-based image called minideb. Thus, the image size for the latest tag is the smallest among all which is around 87MB. The project has 20 contributors with the first commit happened on May 17, 2015. At this time of writing, it only supports MariaDB 10.1 up until 10.3.
One outstanding feature of this image is the ability to deploy a highly available MariaDB setup via Docker environment variables. A zero downtime MariaDB master-slave replication cluster can easily be setup with the Bitnami MariaDB Docker image using the following environment variables:
- MARIADB_REPLICATION_MODE: The replication mode. Possible values master/slave. No defaults.
- MARIADB_REPLICATION_USER: The replication user created on the master on first run. No defaults.
- MARIADB_REPLICATION_PASSWORD: The replication users password. No defaults.
- MARIADB_MASTER_HOST: Hostname/IP of replication master (slave parameter). No defaults.
- MARIADB_MASTER_PORT_NUMBER: Server port of the replication master (slave parameter). Defaults to 3306.
- MARIADB_MASTER_ROOT_USER: User on replication master with access to MARIADB_DATABASE (slave parameter). Defaults to root
- MARIADB_MASTER_ROOT_PASSWORD: Password of user on replication master with access to
- MARIADB_DATABASE (slave parameter). No defaults.
In a replication cluster, you can have one master and zero or more slaves. When replication is enabled the master node is in read-write mode, while the slaves are in read-only mode. For best performance its advisable to limit the reads to the slaves.
In addition, these images also support deployment on Kubernetes as Helm Charts. You can read more about the installation steps in the Bitnami MariaDB Chart GitHub repository.
There are tons of MySQL server images that have been contributed by the community and we can’t cover them all here. Keep in mind that these images are popular because they are built for general purpose usage. Some less popular images can do much more advanced stuff, like database container orchestration, automatic bootstrapping and automatic scaling. Different images provide different approaches that can be used to address other problems.