今回はdockerコンテナで動くmysqlデータをホストOS上にセーブすることで、
commitしなくてもデータを維持する!ということをしてみます。
今まではコンテナ落とす度にちゃんとcommitしないと、次に起動するときにデータが無くなり
Immutable Infrastructureとは程遠い感じになっていたので
サーバーは機能だけを提供して、データは別にするという疎結合な感じにするっていうのがモチベーション。
本日の参考サイトはこちら↓
http://www.zabbix.jp/documents/installation/install-rpm
http://cpw.hatenadiary.jp/entry/2013/08/20/220306
考え方としては、ホストOSにmysqlデータを格納してそれをコンテナがマウントして使うって感じ。
docker+zabbixの回で既にmysql-serverがインストールされているので、そのデータ移行もやってみます。
1. ホストOSに任意のディレクトリを作成。
コンテナにマウントさせる共有ディレクトリを作成します。$ mkdir /home/tzm/docker/share
$ mkdir /home/tzm/docker/mysql
前者はダンプファイル共有用、後者はmysqlデータ格納用になります。
2. docker run でコンテナ作成。
1で作成した共有ディレクトリの内、ダンプファイル共有用のディレクトリをマウントしてコンテナを作成します。$ docker run -v /home/tzm/docker/share:/share -i -t tzm/zabbix /bin/bash
これでホストOSの/home/tzm/docker/shareディレクトリがコンテナの/shareでアクセス出来るようになります。
3. mysqlのダンプを取ってマウントしたディレクトリ内に格納してコンテナを落とす。
$ cd /share
$ mysqldump -u root -p zabbix > dump.sql
$ exit
4. mysqlデータ共有ディレクトリをマウントして再度コンテナ起動。
$ docker run -v /home/tzm/docker/mysql:/var/lib/mysql \
-v /home/tzm/docker/share:/share -p 443:443 -p 10051:10051 -i -t tzm/zabbix /bin/bash
今回はzabbix使うのでポート転送は443と10051を指定。
1で作成した共有ディレクトリも全てマウント。
5. コンテナ内でmysqlの初期化及び設定を行う。
mysqlの初期化$ mysql_install_db
mysql起動
$ mysqld_safe &
ダンプファイルのディレクトリに移動してmysqlにログイン。パスワードも設定。
$ cd /share
$ mysql -u root
mysql> SET PASSWORD FOR root@localhost = PASSWORD('newpass');
zabbixデータベース、zabbixユーザを作成してdumpデータをzabbixデータベースにインポート
mysql> create database zabbix
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'password';
mysql> flush privileges;
mysql> use zabbix;
mysql> source dump.sql
これでマウントしたコンテナ内で作成されるmysqlデータは
ホストOSの/home/tzm/docker/mysqlに格納されてcommitせずともデータが永続化します。