http://docs.docker.com/engine/userguide/dockervolumes/
ここの通りにやるだけだが,いくつかハマったので手順をメモ
# Data Volume Containerを作成
# mysqlイメージは `VOLUME /var/lib/mysql` されているので,最初からマウントポイントがある
uraura@rosemary$ docker create --name dbdata mysql
d7e4a8577eeb94bc89d13dae68c4c71e719f58fa58b6f10dc87311a17d3ff098
# コンテナが作成されることを確認.起動していないので,`-a`付けないと出てこない
uraura@rosemary$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d7e4a8577eeb mysql "/entrypoint.sh mysql" 26 hours ago Created dbdata
# 作成したData Volume Containerを使ってMySQLを起動
# ここではまだDBが初期化されていないため,`-e MYSQL_ROOT_PASSWORD=s3cr3t`を渡す
uraura@rosemary$ docker run --volumes-from dbdata -e MYSQL_ROOT_PASSWORD=s3cr3t -d mysql
e7d7193563ec8f0f421fe854dfa59b82fc2736ee9c69fbec2c6df9bd83e186d3
# 起動したことを確認
uraura@rosemary$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7d7193563ec mysql "/entrypoint.sh mysql" 2 seconds ago Up 1 seconds 3306/tcp berserk_heisenberg
# DBに変更を加える
uraura@rosemary$ docker exec -i -t e7d /bin/bash
root@e7d7193563ec:/# mysql -uroot -ps3cr3t
## 以下,MySQLのコンソール
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> create database dev;
Query OK, 1 row affected (0.00 sec)
mysql> create table accounts(id int auto_increment, name varchar(16), index(id));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into accounts(name) values ('foo'),('bar'),('baz');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from accounts;
+----+------+
| id | name |
+----+------+
| 1 | foo |
| 2 | bar |
| 3 | baz |
+----+------+
3 rows in set (0.00 sec)
mysql> exit
Bye
## MySQLのコンソール終了
# バックアップを取る
# ホスト現在のディレクトリを`/backup`としてマウントして起動
# 注意:Macでdocker-machineなどを使っている場合,`pwd`はMac上ではなく,docker daemonが動いているVM上のパスになります.
# なので,Mac上にrestored.bz2が生成されるわけではなく,VM上に生成されています.
# docker-machineを使うとdocker daemonがVM上で動いていることを意識しないため,バックアップファイルができてない!とかちょっと混乱します.
# `pwd`をマウントしてるのに...とか思ってたら,VM上に`/Users/uraura/work`とかいうディレクトリが生成されてた.紛らわしいので,Macでやる場合は`pwd`にしないほうが良いと思う.
#
# gzip/bzip2どちらも試しましたが,今回はbzip2のほうが圧縮率がよかったのでbzip2を採用
uraura@rosemary$ docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvjf /backup/restored.bz2 /var/lib/mysql
tar: Removing leading `/' from member names
/var/lib/mysql/
/var/lib/mysql/auto.cnf
/var/lib/mysql/ib_logfile0
/var/lib/mysql/ib_logfile1
...
/var/lib/mysql/performance_schema/events_transactions_summary_by_host_by_event_name.frm
/var/lib/mysql/performance_schema/events_statements_summary_by_account_by_event_name.frm
/var/lib/mysql/performance_schema/events_waits_summary_by_thread_by_event_name.frm
# バックアップを取ったので,さらにDBに変更を加える
uraura@rosemary$ docker exec -i -t e7d /bin/bash
root@e7d7193563ec:/# mysql -uroot -ps3cr3t dev
## 以下,MySQLのコンソール
mysql> delete from accounts where id=2;
Query OK, 1 row affected (0.01 sec)
mysql> select * from accounts;
+----+------+
| id | name |
+----+------+
| 1 | foo |
| 3 | baz |
+----+------+
2 rows in set (0.00 sec)
mysql> exit
Bye
## MySQLのコンソール終了
# 変更を入れてしまったDBはもう不要なので捨てる
uraura@rosemary$ docker stop e7d
# バックアップからリストアする
uraura@rosemary$ docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar xvjf /backup/restored.bz2 var/lib/mysql/
var/lib/mysql/auto.cnf
var/lib/mysql/ib_logfile0
var/lib/mysql/ib_logfile1
...
var/lib/mysql/performance_schema/events_transactions_summary_by_host_by_event_name.frm
var/lib/mysql/performance_schema/events_statements_summary_by_account_by_event_name.frm
var/lib/mysql/performance_schema/events_waits_summary_by_thread_by_event_name.frm
# リストアしたデータを使い,再度コンテナを立ち上げる
# 今度は`/var/lib/mysql`にDBのデータがある(初期化済み)ため,`-e MYSQL_ROOT_PASSWORD=s3cr3t`は不要
uraura@rosemary$ docker run -d --volumes-from dbdata mysql
ddd513fdb248a147553f01fca8f5ff1e2b77a202dcc64bd01fef5a5a11413730
# 別のコンテナが起動していることを確認
uraura@rosemary$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ddd513fdb248 mysql "/entrypoint.sh mysql" 2 seconds ago Up 1 seconds 3306/tcp cranky_hopper
# DBを確認する
uraura@rosemary$ docker exec -i -t ddd /bin/bash
root@ddd513fdb248:/# mysql -uroot -ps3cr3t
## 以下,MySQLのコンソール
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| dev |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use dev
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
mysql> show tables;
+---------------+
| Tables_in_dev |
+---------------+
| accounts |
+---------------+
1 row in set (0.00 sec)
mysql> select * from accounts;
+----+------+
| id | name |
+----+------+
| 1 | foo |
| 2 | bar |
| 3 | baz |
+----+------+
3 rows in set (0.00 sec)
-- 消したid=2が復活している!!