6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-11-08

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が復活している!!
6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?