やりたいこと
- Docker上にMySQL Serverを構築する
- データは永続化したいためMySQL Serverのコンテナとは別コンテナにする
- データ保持用のコンテナからバックアップおよびリストアする
データ保持用コンテナの作成
参考:Manageing data in containers
Dockerの公式サイトのドキュメントには、永続的なデータをコンテナ間で共有したい場合や非永続コンテナから使用したい場合、Data Volume Containerと呼ばれるコンテナを作成し、そこからデータをマウントするのが最善であると記述されています。
このベストプラクティスに従い、MySQL Serverコンテナ用のデータボリュームコンテナを以下の様に作成します。
条件
- 最低限のOS機能のみ必要なため、ベースとするdockerイメージは __busybox__にする
- MySQL ServerコンテナはMySQL公式のdockerイメージを使用するためデータ格納ディレクトリは
/var/lib/mysql
となり、このディレクトリをデータボリュームコンテナから可能にする
dockerイメージの作成
上記の条件からMySQL Serverコンテナ用のデータボリュームコンテナのdockerイメージを作成します。
FROM busybox
MAINTAINER xxx <xxx@gmail.com>
VOLUME /var/lib/mysql
CMD ["/bin/true"]
$ docker build -t xxx/mysql-storage .
xxx/mysql-storage
は作成するdockerイメージの名前で、
.
はDockerfileのあるディレクトリになります。
コンテナの作成
作成したdockerイメージを元にデータボリュームコンテナを作成します。
$ docker create --name mysql-storage xxx/mysql-storage
MySQL Serverコンテナの作成
Mysql公式のdockerイメージからコンテナを作成します。
コンテナ作成時に作成したデータボリュームコンテナをマウントさせます。
docker run --volumes-from mysql-storage --name mysql-server -p 13306:3306 -e MYSQL_ROOT_PASSWORD=xxx -e MYSQL_USER=xxx -e MYSQL_PASSWORD=xxx -e MYSQL_DATABASE=xxx -d mysql
--volumes-from mysql-storage
がデータボリュームコンテナのマウントを指定している部分になります。
-e MYSQL_ROOT_PASSWORD=xxx
以外は必須ではありません。
データのバックアップ・リストア・マイグレーション
データボリュームコンテナにある永続データの操作は以下の様に行います。
バックアップ
docker run --rm --volumes-from mysql-storage -v $(pwd):/backup xxx/mysql-storage tar cvf /backup/backup.tar /var/lib/mysql
--volumes-from mysql-storage
にバックアップ元のコンテナを指定します。
リストア・マイグレーション
注)リストアはバックアップを作成したコンテナに対して行い、マイグレーションは異なるコンテナに対して行います。
docker run --rm --volumes-from mysql-storage -v $(pwd):/backup xxx/mysql-storage tar xvf /backup/backup.tar
--volumes-from mysql-storage
にリストア・マイグレーション先のコンテナを指定します。
その他
mysqlの設定のカスタマイズ
Mysql公式のDockerイメージでは、character setが latin1 となっておりマルチバイト文字列の処理には適しませんので、mysqlのcharacter setに utf8 を使用するように設定を変更します。
通常であればmy.cnf
というファイルに設定を記述しmysqldを再起動すればいいのですが、dockerで使用する場合にはコンテナ作成時に設定を読みこませる必要があります。
Mysql公式のDockerイメージでは/etc/mysql/conf.d
配下にある*.cnf
を全て読み込むようになっています。
したがって、設定変更を行う場合はホスト側に設定ファイルを*.cnf
で用意し、そのファイルがあるディレクトリをコンテナ作成時にマウントさせればいいのです。
以下がcharacter setを変更する設定と、ディレクトリをマウントさせてコンテナ作成するときのコマンドです。(ディレクトリをマウントさせるには-v <host_path>:<container_path>
を指定してやります。)
※以下のコマンドでは、カレントディレクトリをマウントさせています。
[mysqld]
character-set-server=utf8
docker run -v $(pwd):/etc/mysql/conf.d --volumes-from mysql-storage --name mysql-server -p 13306:3306 -e MYSQL_ROOT_PASSWORD=xxx -e MYSQL_USER=xxx -e MYSQL_PASSWORD=xxx -e MYSQL_DATABASE=xxx -d mysql