How to use Docker to create a MariaDB sandbox for testing

Preamble

Docker is a buzz word you have most probably seen in the news. I’m not going to enter in the definition/explanations of this lightweight virtualization solution, using containers, as there are already plenty of very good documents on Internet.

My idea when testing docker was to understand if I could be able to create a small sandbox with latest MariaDB or MySQL release without the hassle of creating the required filesystems, installing the binaries, creating the instance. In other word play with latest release of many tools without working hard to install and configure them.

And yes it is possible !! I have been really impressed by the simplicity to have something working as expected with Docker. I have tested MariaDB 10.1 that was in beta as the time of writing this post…

This blog post has been done using a virtual machine running under VirtualBox with Oracle Linux Server release 7.0. Docker release available at that time was 1.3.3.

Docker installation

The lazy approach is always to use the packages provided by your Linux distribution:

[root@server3 ~]# yum install docker docker-registry

Start it with:

[root@server3 ~]# systemctl start docker
[root@server3 ~]# docker version
Client version: 1.3.3
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): 4e9bbfa/1.3.3
OS/Arch (client): linux/amd64
Server version: 1.3.3
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): 4e9bbfa/1.3.3

As a complementary configuration I had to fight with certificates, docker search command look in Docker registry for available packages. You can also go to https://registry.hub.docker.com/, favor the official and well rated images:

[root@server3 ~]# docker search mariadb
2015/02/12 17:17:33 Error response from daemon: Get https://index.docker.io/v1/search?q=mariadb: dial tcp: lookup index.docker.io: no such host

Configured my web proxy and credentials:

[root@server3 ~]# cat /etc/sysconfig/docker
OPTIONS=--selinux-enabled
HTTP_PROXY=http://account:password@proxyserver.domain.com:proxy_port
http_proxy=$HTTP_PROXY
HTTPS_PROXY=$HTTP_PROXY
https_proxy=$HTTP_PROXY
export HTTP_PROXY HTTPS_PROXY http_proxy https_proxy

Doing a test with Docker 1.12.3 the configuration is now slightly different:

[root@server3 ~]# mkdir -p /etc/systemd/system/docker.service.d
[root@server3 ~]# vi /etc/systemd/system/docker.service.d/docker.conf
[root@server3 ~]# cat /etc/systemd/system/docker.service.d/docker.conf
[Service]
Environment="HTTP_PROXY=http://account:password@proxyserver.domain.com:proxy_port/"

This resolved my proxy issue (unknown host) but this time I had a certificate issue:

[root@server3 ~]# docker search mariadb
2015/02/13 12:31:52 Error response from daemon: Get https://index.docker.io/v1/search?q=mariadb: x509: certificate signed by unknown authority

I’m not at all expert in this area but found a nice url (see references) explaining that my proxy server is replacing the final web site certificate by its own (so certificate authority not part of standard authorized ones). So exported my proxy certificate (Zscaler product) from my web browser:

docker01
docker01

Chose DER-encoded binary X.509 format. Transferred the file to my guest machine under /tmp and executed:

[root@server3 ~]# cp /tmp/za.cer /etc/pki/ca-trust/source/anchors/
[root@server3 ~]# update-ca-trust extract

Then restarted docker and everything went well this time:

[root@server3 ~]# systemctl restart docker
[root@server3 ~]# docker search mariadb
NAME                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mariadb                        MariaDB is a community-developed fork of M...   47        [OK]
dockerfile/mariadb             Trusted automated MariaDB (https://mariadb...   32                   [OK]
paintedfox/mariadb             A docker image for running MariaDB 5.5, a ...   24                   [OK]
fedora/mariadb                                                                 22                   [OK]
tutum/mariadb                  MariaDB image - listens in port 3306. For ...   11                   [OK]
tianon/mariadb                 ♪ "I just met a girl named Maria!"5                    [OK]
maxexcloo/mariadb              Docker service container with MariaDB inst...   3                    [OK]
dylanlindgren/docker-mariadb   Docker image for MariaDB                        3                    [OK]
hachque/mariadb                                                                1                    [OK]
cosmicq/openstack-mariadb      (project not complete) MariaDB and PHPMyAd...   1                    [OK]
needo/mariadb                                                                  1                    [OK]
seetheprogress/mariadb         MariaDB image provided by SeeTheProgress u...   1                    [OK]
marklee77/mariadb                                                              0                    [OK]
partlab/ubuntu-mariadb         Docker image to run an out of the box Mari...   0                    [OK]
mmckeen/mariadb                MariaDB image based on openSUSE 13.1            0                    [OK]
million12/mariadb              MariaDB 10 on CentOS-7 with UTF8 defaults       0                    [OK]
etna/mariadb                                                                   0                    [OK]
dasrick/fedora-mariadb         MariaDB image - port 3306 - based on Fedora20   0                    [OK]
m0ikz/mariadb                                                                  0                    [OK]
gchiam/mariadb                 MariaDB on Docker. Built from https://gith...   0                    [OK]
aostanin/mariadb                                                               0                    [OK]
combro2k/mariadb                                                               0                    [OK]
bnchdrff/mariadb                                                               0                    [OK]
muzili/mariadb                                                                 0                    [OK]
spiritdev/mariadb              MariaDB Dock built from spiritdev/ubuntu        0                    [OK]

Docker package installation

To download packages, use (the -a option allows to download all versions, or you will get only latest GA one):

[root@server3 ~]# docker pull -a mariadb
Pulling repository mariadb
69468eff0e53: Pulling dependent layers
.
.

When completed:

[root@server3 ~]# docker images mariadb
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
mariadb             5.5.42              69468eff0e53        5 days ago          238.8 MB
mariadb             5.5                 69468eff0e53        5 days ago          238.8 MB
mariadb             5                   69468eff0e53        5 days ago          238.8 MB
mariadb             10.1                69c9e7aa9778        5 days ago          262.9 MB
mariadb             10.1.2              69c9e7aa9778        5 days ago          262.9 MB
mariadb             10.0.16             461aa7f79c6a        5 days ago          257.6 MB
mariadb             latest              461aa7f79c6a        5 days ago          257.6 MB
mariadb             10                  461aa7f79c6a        5 days ago          257.6 MB
mariadb             10.0                461aa7f79c6a        5 days ago          257.6 MB
mariadb             5.5.41              902a37810c09        3 weeks ago         245.7 MB
mariadb             10.0.15             bbe548cddf43        5 weeks ago         261.1 MB
mariadb             5.5.40              6c6ba5cb73b1        3 months ago        245.6 MB
mariadb             10.1.1              ad8dfc3a6047        3 months ago        270.8 MB

And that’s it, MariaDB Docker package is downloaded on your server…

Docker package testing

To run the docker images I inherit what’s in official MariaDB docker page:

[root@server3 ~]# docker run --name mariadb -e MYSQL_ROOT_PASSWORD=secure_password -d mariadb:10.1.2
ced16a97f5e5236e273df771fb18f674bbd8f8f53ebbe3907aef8a64be42480d
[root@server3 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
ced16a97f5e5        mariadb:10.1        "/docker-entrypoint.   19 seconds ago      Up 18 seconds       3306/tcp            mariadb

The container is called mariadb (–name), MYSQL_ROOT_PASSWORD environment is set (-e), the container will run in the background (-d) and I choose to run the 10.1.2 docker image (mariadb:10.1.2).

I will try to connect with an interactive session (MySQL client) to this running container. Again I inherit options from MariaDB official docker image:

  • -i keep STDIN open and -t allocate a pseudo tty
  • –name set a name to the container
  • –rm remove the container after exit
  • –link option is the most confusing one. From official documentation it is in the form of –link <name or id>:<alias>. <name or id> will be the name of my MariaDB container so mariadb and I thought alias could be anything I wish. But I was wrong, reading further the documentation I have seen that docker will create environment variables in the form of <alias>_PORT_<port>_<protocol>, example: MYSQL_PORT_3306_TCP_ADDR. So alias name must match environment variables name (in uppercase) you are using in mysql client to specify host IP address and MySQL listening port
[root@server3 ~]# docker run -it --link mariadb:mysql  --name=mysql_client --rm mariadb sh \
-c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.1.2-MariaDB-1~wheezy-wsrep-log mariadb.org binary distribution, wsrep_25.10.r4123
 
Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
MariaDB [(none)]> select version();
+-----------------------------------+
| version()                         |
+-----------------------------------+
| 10.1.2-MariaDB-1~wheezy-wsrep-log |
+-----------------------------------+
1 row in set (0.00 sec)
 
MariaDB [(none)]>

In another session you can now see you MySQL client docker container running (as well as initial MariaDB one):

CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
07e4b15c92ef        mariadb:10          "\"/docker-entrypoin   6 seconds ago       Up 4 seconds        3306/tcp            mysql_client
ced16a97f5e5        mariadb:10.1        "/docker-entrypoint.   7 days ago          Up 43 hours         3306/tcp            mariadb

You can also see the environment variables in MySQL client connected (and linked) to your MariaDB container:

[root@server3 ~]# docker run -it --link mariadb:mysql --name=mysql_client --rm mariadb sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 10.1.2-MariaDB-1~wheezy-wsrep-log mariadb.org binary distribution, wsrep_25.10.r4123
 
Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
MariaDB [(none)]> \! env
HOSTNAME=07e4b15c92ef
MYSQL_ENV_MARIADB_VERSION=10.1.2+maria-1~wheezy
SHLVL=0
HOME=/root
MARIADB_MAJOR=10.0
TERM=xterm
COLUMNS=207
MYSQL_PORT_3306_TCP_ADDR=172.17.0.2
MYSQL_ENV_MYSQL_ROOT_PASSWORD=secure_password
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_PORT_3306_TCP_PROTO=tcp
MYSQL_ENV_MARIADB_MAJOR=10.1
MYSQL_PORT=tcp://172.17.0.2:3306
MYSQL_PORT_3306_TCP=tcp://172.17.0.2:3306
PWD=/
MYSQL_NAME=/mysql_client/mysql
MARIADB_VERSION=10.0.16+maria-1~wheezy
LINES=58

And again quite rapidly you are done and can start to play with MariaDB 10.1 in just few commands… The principle would have been exactly the same for MySQL 5.7 development release…

References

About Post Author

Share the knowledge!

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>