自由気ままに書いちゃおう

好きなことをつらつらと・・・

【Docker】マウント元のバックアップについて(volumeマウントのバックアップ)

bindマウントとvolumeマウントのバックアップ方法についてです。

■bindマウントのバックアップ方法

bindマウントの場合、
Dockerホスト上からマウント元となるディレクトリやファイルの操作が可能なため、
コピーするなり、tarボール化するなり、やり方は通常のLinux上のファイルシステムのバックアップ方法が使えます。

■volumeマウントのバックアップ方法の前に・・・

volumeマウントの場合、bindマウントとは違いDockerホスト側からアクセスすることができません。
また、volumeの実体はdocker volume inspectコマンドのMountpointのパスとは異なるところにあります。
詳細は別の記事で記載しております。

f:id:guri2o1667:20210525103323p:plain

そのため、volumeマウントのバックアップを取得する場合には以下の通り、
volumeマウントの性質2つとbindマウントの性質1つを一緒に利用します。

volumeマウントの性質1)
Dockerホスト上に作成したvolumeは、複数コンテナからアクセスすることができます。

volumeマウントの性質2)
volumeマウントをコンテナ側で既にマウントしていた場合でも、
他コンテナからvolumeマウントをマウントすることができます。
ただし、整合性の観点では、マウントされていない状態で他コンテナからマウントするのが望ましいです。。。

bindマウントの性質1)
Dockerホスト側からもbindで指定したマウント元を操作することができます。

■volumeマウントのバックアップの流れ

前提として、以下の状態からスタートします。
・バックアップ対象のvolumeマウントは予め作成していたmysqlvolume1と言うものを使います。
・mysqlvolume1は既にmysql1コンテナで利用しており、mysqlvolume1にはデータベース情報が格納されているものとします。

流れ1)mysql1コンテナを停止

流れ2)軽量Linuxコンテナを起動

流れ3)軽量Linuxコンテナに2つのディレクトリを作成
    1つ目: Dockerホストのvolumeをマウントするためのディレクトリです。
          ※バックアップ元のディレクトリになります。
          ※volumeマウントを利用します。

    2つ目: 1つ目のディレクトリをtarコマンドで固めたものが格納されるディレクトリです。
          ※バックアップ先のディレクトリになります。
          ※bindマウントを利用します。

流れ4)軽量Linuxコンテナでバックアップ元をtarコマンドでバックアップ

流れ5)軽量Linuxコンテナを削除

■volumeマウントのバックアップをやってみる

ここではわかりやすさを重視するため、
バックアップしたデータ(=バックアップ先)はDockerホストのカレントディレクトリを利用します。

では、実際にやってみます。
とはいっても、実は上記の流れ2~5は1つのコマンドで完結します。
下記コマンドは全てDockerホスト上で実行します。

1.mysql1コンテナを停止します。

f:id:guri2o1667:20210525104212p:plain

2.バックアップ先となるディレクトリを作成します。
ここでは、/var/tmp/bk_mysqlvolume1というディレクトリを作成しています。

f:id:guri2o1667:20210525110101p:plain

3.上記2で作成したバックアップ先ディレクトリに移動します。

f:id:guri2o1667:20210525110136p:plain

4.以下コマンドを実行します。(バックアップを実行します。)

docker run --rm -v mysqlvolume1:/bk_src -v "$PWD":/bk_dst busybox tar czvf /bk_dst/mysqlvolume1_bk.tar.gz -C /bk_src .

f:id:guri2o1667:20210525112709p:plain


※末尾のドットを忘れないようにしてください。
※詳細は本記事の下部(補足3)で説明致します。

5.以下コマンドを実行します。(バックアップデータを確認します。)
mysqlvolume1_bk.tar.gzというファイルが存在していることが確認できます。

f:id:guri2o1667:20210525112826p:plain

■補足1:利用したbusyboxについて

軽量LinuxOSの一つです。
バックアップを取得するためにtarコマンドを実行できればよかったため、
CentOSとかではなく、軽量LinuxOSのbusyboxを利用しました。

■補足2:利用したbusyboxは消さないの?

バックアップで実行したコマンドで--rmオプションを付与している為、
tarコマンドの実行が完了すると、自動的にbusyboxが削除されます。
そのため、手動でのbusybox削除は不要です。

■補足3:手順4の詳細について

以下コマンドの詳細です。

docker run --rm -v mysqlvolume1:/bk_src -v "$PWD":/bk_dst busybox tar czvf /bk_dst/mysqlvolume1_bk.tar.gz -C /bk_src .

【--rmについて】
docker run 実行時、指定したコマンド完了後、コンテナを削除します。

【一つ目の-vについて】
ここでは、volumeマウントを行っています。
/bk_src は busybox内のディレクトリです。
Dockerホスト内のmysqlvolume1とbusyboxコンテナ内の/bk_srcをマウントしています。

尚、/bk_srcは任意の文字列で構いません。
※busybox内に存在しないディレクトリは自動的に作成されます。

【二つ目の-vについて】
ここでは、bindマウントを行っています。
/bk_dst は busybox内のディレクトリです。
Dockerホスト内のカレントディレクトリ(ここでは、/var/tmp/bk_mysqlvolume1)とbusyboxコンテナ内の/bk_dstをマウントしています。

【busybox tar ~について】
利用するコンテナイメージはbusyboxです。
tar~はbusyboxコンテナ内で実行するコマンドです。

■補足4:手順4の別コマンドについて

以下コマンドでもバックアップの取得が可能です。

docker run --rm -v mysqlvolume1:/bk_src -v "$PWD":/bk_dst busybox tar czvf /bk_dst/mysqlvolume2_bk.tar.gz /bk_src


ただ、当該コマンドで取得したtar.gzでリストアする際、
tar.gz内のデータにはディレクトリのパスまで含まれてしまうため、
リストアも考慮するようであれば、当該コマンドの実行よりかは手順4をそのまま実行したほうが良いです。

以上です。