DamienKarrus’s blog

プログラミングとクライミングの足跡

ボリュームのバックアップ docker入門-6

コンテナがマウントしたボリュームに格納されたデータをバックアップする。バックアップ方法はバックアップ用コンテナからtarを発行して、マウントされたホスト側ディレクトリにtarファイルを生成する。リストアはリストア用コンテナからtarコマンドを発行して、該当するディレクトリにバックアップデータを復元する。またここではバックアップやリストアで使用するコンテナは、非常に軽いlinuxコンテナであるbusyboxを使用する。

動作検証の為、DBにあらかじめデータをインサートしておく

$ docker volume create vol01
$ docker container run -dit --name db01 --mount type=volume,src=vol01,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mypassword mysql:5.7
$ docker container exec -it db01 /bin/bash
# mysql -p
mysql> create databse exampledb;
mysql> create table exampletable(id int,note char(4));
mysql> insert into exampletable(id,note)values(1,'kaki');
mysql> insert into exampletable(id,note)values(2,'taka');
\q
exit

バックアップ方法

ボリュームをバックアップするにはバックアップ作業を担当するコンテナを作り、このコンテナから該当するボリュームをバックアップする。
バックアップ対象のコンテナがどのボリュームを利用しているか分からない場合もあるので volumes-from オプションを使用して、自動的に紐付けするように指定する。

(1)必要に応じてコンテナを停止

$ docker container stop db01

(2)軽いlinuxシステム(イメージ名:busybox)を利用してtarコマンド発行

$ docker container run --rm --volumes-from db01 --mount type=bind,src="$PWD",dst=/dest busybox tar czf /dest/backup.tar.gz -C /var/lib/mysql .
・--rm : プロセス終了後コンテナ自動削除
・--volumes-from db01 : db01コンテナが利用しているボリューム(複数)を全てマウント
・--mount type=bind src="$PWD",dst=/dest : bind形式でdockerホストのカレントディレクトリをコンテナの/destにマウント
busybox : このコンテナのイメージ名はbusybox
・tar czf /dest/backup.tar.gz -C /var/lib/mysql . : /var/lib/mysqlにcd してからこのディレクトリ以下を全てtarする。バックアップファイルは/dest/backup.tr.gz
これによって、dockerホストのカレントディレクトリにbackup.tar.gzが出来る

リストア方法

(1)旧ボリュームの削除

docker volume rm vol01

(2)リストア用ボリュームの作成

docker volume create vol01

(3)tarファイル解凍

$ docker run --rm --mount type=volume,src=vol01,dst=/var/lib/mysql --mount type=bind,src="$PWD",dst=/dest busybox tar xzf /dest/backup.tar.gz -C /var/lib/mysql

(4)確認

$ docker container run -dit --name db01 --mount type=volume,src=vol01,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mypassword mysql:5.7
$ docker container exec -it db01 /bin/bash
# mysql -p
mysql> use exampledb;
mysql> select * from exampletable;

これで最初に作成したレコードが2つ表示されるはずである。

 

次の記事

コンテナのネットワーク docker入門-7 - DamienKarrus’s blog (hatenablog.com)