I'm a cloud engineer at foot of the small mountain

クラウド・ETL/ELT・Nocode・BigQuery などを中心に書ければね。最近触ったサービス・フレームワークなどのメモ

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 で接続してみると、前に作成したテーブルが新しいコンテナでも見れるようになっていることを確認できました。
f:id:sennanvolar44:20210120063039p:plain