Help us understand the problem. What is going on with this article?

Docker × MySQL

More than 3 years have passed since last update.

やりたいこと

  • 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イメージを作成します。

Dockerfile
FROM busybox
MAINTAINER xxx <xxx@gmail.com>

VOLUME /var/lib/mysql
CMD ["/bin/true"]
dockerイメージの作成
$ docker build -t xxx/mysql-storage .

xxx/mysql-storageは作成するdockerイメージの名前で、
.はDockerfileのあるディレクトリになります。

コンテナの作成

作成したdockerイメージを元にデータボリュームコンテナを作成します。

コンテナの作成
$ docker create --name mysql-storage xxx/mysql-storage

MySQL Serverコンテナの作成

参考:MySQL docker doc

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>を指定してやります。)

※以下のコマンドでは、カレントディレクトリをマウントさせています。

custom.cnf
[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
baster
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした