Dockerの公式MySQLイメージの使い方を徹底的に解説するよ

DockerHubでは公式のMySQLイメージが無料で公開されています。 これを使えば簡単にDockerでMySQLサーバを起動することができます。データの永続化もできます。

https://hub.docker.com/_/mysql/

2015年10月現在では下記3種類のバージョンが用意されています。 タグを指定することで任意のバージョンのイメージを取得できます。

  • 5.5
  • 5.6
  • 5.7 (latest)

イメージの取得方法

docker pull mysql

これで最新の安定版を取得できます。

バージョンを明示的に取得したい場合はタグを使います。

docker pull mysql:5.7

(2015/10/25現在だと、mysql, mysql:latest, mysql:5.7, mysql:5.7.9はどれも同じイメージを指します。)

これのDockerfileを見たい場合はこちら。

https://github.com/docker-library/mysql/blob/5836bc9af9deb67b68c32bebad09a0f7513da36e/5.7/Dockerfile

MySQLサーバコンテナを起動する方法

コンテナを起動するにはこのようにします。

docker run --name mysqld -e MYSQL_ROOT_PASSWORD=secret -d mysql

mysqldがコンテナの名前、secretがrootユーザのパスワードになります。

CREATE DATABASEするには

起動時に任意のアカウントを作ったり、CREATE DATABASEすることもできます。

例えば下記のようにすると、起動後にmydbというデータベース、userfooというユーザが作成されます。

docker run --name mysqld -e MYSQL_DATABASE=mydb -e MYSQL_USER=userfoo -e MYSQL_PASSWORD=secret  -e MYSQL_ROOT_PASSWORD=verysecret -d mysql

MySQLクライアントからサーバコンテナに接続する

サーバコンテナの起動に成功したら、クライアントコンテナを起動してつないでみましょう。

docker run --link  mysqld:mysql -it --rm mysql bash

起動したクライアントコンテナの中で、envと打つと環境変数の一欄が見れます。

root@f127a75c3cf2:/# env
HOSTNAME=f127a75c3cf2
MYSQL_ENV_MYSQL_DATABASE=mydb
MYSQL_ENV_MYSQL_ROOT_PASSWORD=verysecret
TERM=xterm
MYSQL_VERSION=5.7.8-rc
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_PORT_3306_TCP=tcp://172.17.0.55:3306
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MYSQL_ENV_MYSQL_USER=userfoo
PWD=/
MYSQL_ENV_MYSQL_PASSWORD=secret
MYSQL_ENV_MYSQL_VERSION=5.7.8-rc
HOME=/root
SHLVL=1
MYSQL_PORT_3306_TCP_PROTO=tcp
MYSQL_NAME=/mysqlclient/mysql
MYSQL_MAJOR=5.7
MYSQL_PORT_3306_TCP_ADDR=172.17.0.55
MYSQL_ENV_MYSQL_MAJOR=5.7
MYSQL_PORT=tcp://172.17.0.55:3306
_=/usr/bin/env

これらの環境変数を使えばMySQLサーバコンテナに接続することができます。

root@f127a75c3cf2:/# mysql -u userfoo -psecret -h $MYSQL_PORT_3306_TCP_ADDR mydb
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 2
Server version: 5.7.8-rc MySQL Community Server (GPL)

Copyright (c) 2000, 2015, 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>

接続できました!

あとはCREATE TABLEするなり、煮るなり焼くなり、好きにするといいでしょう。

mysql> CREATE TABLE users (id int , name varchar(255));
Query OK, 0 rows affected (0.03 sec)

mysql> show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| users          |
+----------------+
1 row in set (0.00 sec)

上記手順を踏むのが面倒な場合は、下記のようにクライアントコンテナを起動すると同時にMySQLログインするテクニックがあります。

さくっとDBの中身をみたいときには便利です。

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

my.cnfをカスタマイズしたい

上記方法でサーバを起動すると、charactersetがlatin1になってたりして使い勝手がよくありません。 サーバ設定を変更するにはどうすればいいでしょうか。

実はやり方が用意されています。 公式MySQLイメージは、「/etc/mysql/conf.d/ ディレクトリ以下に *.cnfが存在すればそれを読み込む」という仕様になっています。

自分で書いた設定ファイルをこの場所にマウントしてあげればOKです。

例えばこういう設定ファイルをホスト側に/tmp/custom.cnfで保存して、

[mysqld]
character-set-server=utf8

docker run の-vオプションを使ってこれをコンテナ内の/etc/mysql/conf.dにマウントします。

docker run  -v /tmp/:/etc/mysql/conf.d -d --name mysqld -e MYSQL_ROOT_PASSWORD=secret  mysql

そうすると、起動時に上記設定ファイルを読んでくれます。

初回起動時にDBデータを投入したい

これもやり方が用意されています。

/docker-entrypoint-initdb.d/というディレクトリの下に、.sqlまたは.shファイルを置いておくとそれが実行される仕様になっています。

例えば下記のようなSQLファイルを作ってホスト側に/tmp/create_table.sqlで保存して、

CREATE TABLE users (id INT, name VARCHAR(255));

docker runするときにこれをマウントすると、

docker run  -v /tmp/:/docker-entrypoint-initdb.d  -d --name mysqld -e MYSQL_ROOT_PASSWORD=secret  mysql

サーバの初回起動時にCREATE TABLEが実行されます。この仕組を使えば、初期データ投入などを行うことができます。

データを永続化する方法

実はデフォルトで永続化されるように設定されていいます。(Dockerfile内でVOLUMEコマンドがつかわれている) ただこのデータ領域はホスト側からは見えにくい場所にあります。docker inspectで場所を確認できます。

明示的にデータ保存場所を指定したい場合は、ボリュームマウント機能を使ってホスト側のディレクトリをマウントしてあげるとよいでしょう。

https://docs.docker.com/userguide/dockervolumes/#mount-a-host-directory-as-a-data-volume

まとめ

Docker公式のMySQLコンテナの使い方を紹介しました。

  • アカウントやDBの作成
  • 設定ファイルのカスタマイズ
  • 初期データ投入

などの仕組みがサポートされており、大変便利な仕組みになっています。 カジュアルにMySQLを使いたいひとは是非使ってみてください。

「こういう使い方もあるよ」「こうしたほうがいいよ」などご意見があれば、Twitterやはてブで教えていただけると幸いです。

カテゴリ: