Docker ボリュームマウントしたときのバックアップ方法
前回はボリュームマウントを試してみたので、今回はそのマウントしたボリュームをバックアップする方法についてやってみます。
ボリュームのバックアップ方法
バインドマウントと違ってボリュームの場合は、対象のパスをそのまま tar などで固めてもバックアップファイルとしては有効ではないようです。
というのも、Docker Engine からバックアップを実行しているので、Docker Engineとしてのシステム領域をバックアップするということになり、対象のコンテナにリストアできないかもしれないのです。
バックアップ方法ですが、適当なLinux系のコンテナを起動して、そこに対して対象コンテナをマウントしてバックアップする形となります。
まずは対象コンテナが停止していることを確認します。
[ec2-user@~]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a6a1c6b8eb7a mysql:5.7 "docker-entrypoint.s…" 7 minutes ago Exited (0) 20 seconds ago mysqldb [ec2-user@~]$
Linux のコンテナをここで起動します。バックアップとしてしか使用しないので、 busybox という軽量 Linux を使用します。
[ec2-user@~]$ docker run --rm -v samplevol:/src -v "$PWD":/dest busybox tar czvf /dest/backup.tar.gz -C /src . ~ [ec2-user@~]$ ll total 7036 -rw-r--r-- 1 root root 7202585 Jan 13 21:46 backup.tar.gz drwxr-xr-x 2 root root 24 Jan 9 21:49 bindData [ec2-user@~]$
backup.tar.gz がカレントディレクトリに作成されているのが確認できました。
ちなみにそれぞれのオプションの意味ですが、
- rm :コマンド実行後、コンテナを削除します
- samplevol:/src :samplevol ボリュームを /src にマウントする
- "$PWD":/dest busybox : Docker ホストのカレントディレクトリを /dest にバインドマウントする
- tar czvf /dest/backup.tar.gz -C /src . : /src 以下を /dest/backup.tar.gz にバックアップする(/dest はカレントディレクトリにマウントしてる)
リストアしてみる
まずはボリュームを使用しているコンテナとボリュームを削除してみます。
[ec2-user@~]$ docker rm mysqldb mysqldb [ec2-user@~]$ docker volume rm samplevol samplevol [ec2-user@~]$
次にボリュームを作成します。
[ec2-user@~]$ docker volume create samplevol samplevol
ここで、先ほどバックアップしたファイルを使ってリストアしてみます。
[ec2-user@~]$ docker run --rm -v samplevol:/dest -v "$PWD":/src busybox tar xzf /src/backup.tar.gz -C /dest [ec2-user@~]$
/dest にボリュームマウント、/src にバインドマウントとし、カレントディレクトリにある backup.tar.gz が /src/backup.tar.gz として扱うことができます。
/dest はリストア先のボリュームにマウントしているので、/dest に展開されていきます。
これでボリュームをリストアしたので、MySQLコンテナを起動してみます。
[ec2-user@~]$ docker run --name mysqldb -dit -p 3306:3306 -v samplevol:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pwsswd mysql:5.7 9aa13f0f109e531714cd22c241dbffbdcf2d23e349b20d316df3a152aa4069c6 [ec2-user@~]$
MySQL WorkBench で接続してみると、前に作成したテーブルが新しいコンテナでも見れるようになっていることを確認できました。