user icon

Docker公式イメージで開発用RDBをゲットだぜ(MariaDB、Percona Server編)

まえがき

Docker公式イメージで開発用RDBをゲットだぜ(PostgreSQL編)
Docker公式イメージで開発用RDBをゲットだぜ(MySQL編)

に続き予定どおりMariaDB編をお送りします。一言で済むので結論を書くと

「公式イメージのページを読み比べたらMySQLと同じでした。ありがとうございます」

という内容です。ついでに

というわけでPercona Serverの公式イメージのページも見てみたらこれもMySQLの場合と同じ扱いでしたので含めてみましたよ。

Docker for Macを使用しております。

MySQL派生RDBMS達の公式イメージ

まえがきに引用したTwitterのつぶやきにあるようにDocker HubでOfficial縛りでMySQLを検索しました。

Docker HubでOfficial縛りでMySQLを検索

この様に3件引っかかります。

MariaDBとPercona ServerはMySQL派生のRDBMSです。概要をつかみやすいかと思うページへのリンクをあげておきますね。

MariaDB – Wikipedia
MySQL 互換のDB、Percona Server を使う理由 – Qiita

個人的に、これからはMySQLよりMariaDBを使うことが多くなりそうに感じておりますし、以前からPercona Serverは良さそうだと思っていました(そして忘れる)。

これらの公式イメージのページを読み比べた所、設定用の環境変数の名称も含めてMySQLと同じで、扱いかたはほぼ同じと考えて良いのではないかと思います。

というわけで、調査はすっとばしてMySQL用に作成したファイルをベースにイメージの日本語化とDocker Composeでの起動をしてみようと思います。

基本的に変更点だけ書いていきますのでベースについては前回MySQLの記事をご参照ください。

MariaDB

OFFICIAL REPOSITORY mariadb

2016年8月中旬現在の対応バージョン。

10.1(10.1.16), 10.0 (10.0.26), 5.5(5.5.51)

デフォルトで選択されるlatestは10.1系。今回は10.1系で進めます。

日本語化されたイメージの作成

default localeを設定するDockerfileを作ります。

Dockerfile

FROM mariadb:10.1

MAINTAINER murave

RUN apt-get update && apt-get install locales -y && localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.utf8

日本語化されたイメージ、mariadb_jp:10.1を作ります。

$ docker build -t mariadb_jp:10.1 ./

確認

$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
mariadb_jp           10.1                3fa6fd548f5b        11 seconds ago      420.8 MB
mariadb              10.1                9a0138c02438        3 weeks ago         391.6 MB

参考に元の公式イメージも載せましたが、サイズが結構でかいですね。

Docker Compose で起動する

docker-compose.ymlを調整。ポートフォワードは23306に設定しました。

docker-compose.yml

datastore:
  image: busybox
  volumes:
    - /var/lib/mysql
  container_name: mariadb-datastore

mariadb:
  image: mariadb_jp:10.1
  environment:
    MYSQL_ROOT_PASSWORD: mysecretpassword
    MYSQL_USER: foo
    MYSQL_PASSWORD: foopassword
    MYSQL_DATABASE: foodb
  volumes:
    - ./conf.d/:/etc/mysql/conf.d
    - ./initdb/:/docker-entrypoint-initdb.d
  ports:
    - "23306:3306"
  volumes_from:
    - datastore
  container_name: mariadb-db

起動します。

$ docker-compose up -d  
Creating mariadb-datastore
Creating mariadb-db

起動状態の確認。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                          PORTS                     NAMES
ad95de15a67a        mariadb_jp:10.1     "docker-entrypoint.sh"   About a minute ago   Up About a minute               0.0.0.0:23306->3306/tcp   mariadb-db
3515029a71b5        busybox             "sh"                     About a minute ago   Exited (0) About a minute ago                             mariadb-datastore

Sequel Pro を使いポートフォワードした23306にユーザーfooでfoodbデータベースに接続して初期化スクリプトが動作していることを確認できました。

クライアントコンテナでの接続用に作成したclientスクリプトを調整。

client

docker run -it --link mariadb-db:mysql --rm mariadb_jp:10.1 sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'

接続して動作確認します。

$ ./client  
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 10.1.16-MariaDB-1~jessie mariadb.org binary distribution

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| foodb              |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]> select Host, User from mysql.user;
+------+------+
| Host | User |
+------+------+
| %    | foo  |
| %    | root |
+------+------+
2 rows in set (0.00 sec)

MariaDB [(none)]> USE foodb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [foodb]> SHOW TABLES;
+-----------------+
| Tables_in_foodb |
+-----------------+
| users           |
+-----------------+
1 row in set (0.00 sec)

MariaDB [foodb]> SELECT * from users;
+------+--------+
| id   | name   |
+------+--------+
|    1 | first  |
|    1 | second |
+------+--------+
2 rows in set (0.00 sec)

MariaDB [foodb]> exit
Bye

Percona Server

OFFICIAL REPOSITORY percona

2016年8月中旬現在の対応バージョン。

5.7(5.7.13), 5.6 (5.6.32), 5.5 (5.5.51)

MariaDBと違ってMySQL準拠ですね。latestは5.7系。今回は5.7系で進めます。

日本語化されたイメージの作成

default localeを設定するDockerfileを作ります。

Dockerfile

FROM percona:5.7

MAINTAINER murave

RUN apt-get update && apt-get install locales -y && localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.utf8

日本語化されたイメージ、percona_jp:5.7を作ります。

$ docker build -t percona_jp:5.7 ./

確認

$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
percona_jp           5.7                 22e3746fb304        8 minutes ago       367.2 MB
percona              5.7                 ed3fc6a159be        3 weeks ago         338.2 MB

こちらも参考に元の公式イメージも載せました。

Docker Compose で起動する

docker-compose.ymlを調整。ポートフォワードは33306に設定しました。

docker-compose.yml

datastore:
  image: busybox
  volumes:
    - /var/lib/mysql
  container_name: percona-datastore

percona:
  image: percona_jp:5.7
  environment:
    MYSQL_ROOT_PASSWORD: mysecretpassword
    MYSQL_USER: foo
    MYSQL_PASSWORD: foopassword
    MYSQL_DATABASE: foodb
  volumes:
    - ./conf.d/:/etc/mysql/conf.d
    - ./initdb/:/docker-entrypoint-initdb.d
  ports:
    - "33306:3306"
  volumes_from:
    - datastore
  container_name: percona-db

起動します。

$ docker-compose up -d
Creating percona-datastore
Creating percona-db

起動状態の確認。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                     NAMES
b39630e2fd38        percona_jp:5.7      "docker-entrypoint.sh"   35 seconds ago      Up 33 seconds               0.0.0.0:33306->3306/tcp   percona-db
ea4c9a0a21b5        busybox             "sh"                     35 seconds ago      Exited (0) 34 seconds ago                             percona-datastore

Sequel Pro を使いポートフォワードした33306にユーザーfooでfoodbデータベースに接続して初期化スクリプトが動作していることを確認できました。

クライアントコンテナでの接続用に作成したclientスクリプトを調整。

client

docker run -it --link percona-db:mysql --rm percona_jp:5.7 sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'

接続して動作確認します。

$ ./client  
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.13-6 Percona Server (GPL), Release '6', Revision 'e3d58bb'

Copyright (c) 2009-2016 Percona LLC and/or its affiliates
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| foodb              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> select Host, User from mysql.user;
+------+------+
| Host | User |
+------+------+
| %    | foo  |
| %    | root |
+------+------+
2 rows in set (0.00 sec)

せっかくのPercona Serverなのでレスポンスタイム分布の取得をやってみましょう。

Response Time Distribution

を参考にPluginを導入して有効化します。

mysql> INSTALL PLUGIN QUERY_RESPONSE_TIME_AUDIT SONAME 'query_response_time.so';
Query OK, 0 rows affected (0.03 sec)

mysql> INSTALL PLUGIN QUERY_RESPONSE_TIME SONAME 'query_response_time.so';
Query OK, 0 rows affected (0.03 sec)

mysql> INSTALL PLUGIN QUERY_RESPONSE_TIME_READ SONAME 'query_response_time.so';
Query OK, 0 rows affected (0.03 sec)

mysql> INSTALL PLUGIN QUERY_RESPONSE_TIME_WRITE SONAME 'query_response_time.so';
Query OK, 0 rows affected (0.02 sec)

mysql> SHOW PLUGINS;
+-----------------------------+----------+--------------------+------------------------+---------+
| Name                        | Status   | Type               | Library                | License |
+-----------------------------+----------+--------------------+------------------------+---------+
                                     (長いので省略しました)
| QUERY_RESPONSE_TIME_AUDIT   | ACTIVE   | AUDIT              | query_response_time.so | GPL     |
| QUERY_RESPONSE_TIME         | ACTIVE   | INFORMATION SCHEMA | query_response_time.so | GPL     |
| QUERY_RESPONSE_TIME_READ    | ACTIVE   | INFORMATION SCHEMA | query_response_time.so | GPL     |
| QUERY_RESPONSE_TIME_WRITE   | ACTIVE   | INFORMATION SCHEMA | query_response_time.so | GPL     |
+-----------------------------+----------+--------------------+------------------------+---------+
52 rows in set (0.00 sec)

mysql> SET GLOBAL query_response_time_stats = on;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * from INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
+----------------+-------+----------------+
| TIME           | COUNT | TOTAL          |
+----------------+-------+----------------+
|       0.000001 |     0 |       0.000000 |
|       0.000010 |     0 |       0.000000 |
|       0.000100 |     0 |       0.000000 |
|       0.001000 |     1 |       0.000271 |
|       0.010000 |     0 |       0.000000 |
|       0.100000 |     0 |       0.000000 |
|       1.000000 |     0 |       0.000000 |
|      10.000000 |     0 |       0.000000 |
|     100.000000 |     0 |       0.000000 |
|    1000.000000 |     0 |       0.000000 |
|   10000.000000 |     0 |       0.000000 |
|  100000.000000 |     0 |       0.000000 |
| 1000000.000000 |     0 |       0.000000 |
| TOO LONG       |     0 | TOO LONG       |
+----------------+-------+----------------+
14 rows in set (0.01 sec)

おー。取れた取れた。

初期投入データのサンプルについてsecondのidを1にしているという恥ずかしい状況に気づいたのでSequel Proで編集、ついでに3:thirdを追加してから再度レスポンスタイム分布を取得してみます。

mysql> SELECT * from INFORMATION_SCHEMA.QUERY_RESPONSE_TIME;
+----------------+-------+----------------+
| TIME           | COUNT | TOTAL          |
+----------------+-------+----------------+
|       0.000001 |     0 |       0.000000 |
|       0.000010 |     8 |       0.000057 |
|       0.000100 |     3 |       0.000173 |
|       0.001000 |     9 |       0.001866 |
|       0.010000 |     0 |       0.000000 |
|       0.100000 |     2 |       0.058591 |
|       1.000000 |     0 |       0.000000 |
|      10.000000 |     0 |       0.000000 |
|     100.000000 |     0 |       0.000000 |
|    1000.000000 |     0 |       0.000000 |
|   10000.000000 |     0 |       0.000000 |
|  100000.000000 |     0 |       0.000000 |
| 1000000.000000 |     0 |       0.000000 |
| TOO LONG       |     0 | TOO LONG       |
+----------------+-------+----------------+
14 rows in set (0.00 sec)

発行されたSequel Proから発行されたクエリ文増えました。スロークエリはないですね(あたりまえ)。

気軽に試せて良いですね。
以上、「Docker公式イメージで開発用RDBをゲットだぜ」でした。

Facebooktwitterlinkedintumblrmail

タグ: , , , ,

名前
E-mail
URL
コメント

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)