Data Volume Containerを使ってバックアップ/リストアしたい

http://docs.docker.com/engine/userguide/dockervolumes/
ここの通りにやるだけだが，いくつかハマったので手順をメモ

```shell-session
# 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が復活している!!
```