見出し画像

【13】【Docker】ボリューム名を意識せずにバックアップする方法

ボリューム名を意識せずにバックアップする方法。

この記事の方法でボリュームをバックアップ、リストアすることができました。
しかし、バックアップする際に、ボリューム名を指定する必要がありますよね。
ボリュームが多くなると管理が大変になります。
この問題点を解決するために、
ボリューム名を意識せずにバックアップする方法があります。


--volumes-fromオプションでバックアップ

--volumes-fromオプションでバックアップする方法です。
実例:--volumes-fromオプションでバックアップする

コンテナを起動
docker run --name db01  \
-dit -v mysqlvolume:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=mypassword mysql:5.7

コンテナを停止する
docker stop db01

バックアップする
docker run --rm --volumes-from db01 \
-v "$PWD":/dest busybox \
tar czf /dest/backup.tar.gz \
-C /var/lib/mysql

参考:ボリュームを指定する下記コマンドと比べてください
docker run --rm -v mysqlvolume:/src \
-v "$PWD":/dest busybox \
tar czvf /dest/backup.tar.gz \
-C /src .

これで、ボリューム名を指定せずバックアップすることができました。
コマンドを解説していきます。
コマンドの解説
ボリュームmysqlvolumeを作ります。
このボリュームを/var/lib/mysqlにボリュームマウントしたMySQLのコンテナdb01を作ります。
このdb01をデータボリュームコンテナといいます。
--volumes-fromオプションでdb01とマウントしたbusyboxが起動します。
db01とマウントしているので、このbusyboxには/var/lib/mysqlがあります。
/var/lib/mysqlはmysqlvolumeボリュームとマウントされてましたよね。
busyboxの/var/lib/mysqlを/destにbackup.tar.gzとしてアーカイブファイルを作成します。
ローカルのカレントディレクトリとbusyboxの/destをバインドマウントします。
バインドマウントされてたことによって、カレントディレクトリにbackup.tar.gzが作成されます。
そして、rmオプションでコンテナが自動的に破棄されます。

公式のドキュメント

データボリュームコンテナについて、なかなか理解することが大変だったので、公式のドキュメントを掲載します。

docker create -v /dbdata --name dbdata training/postgres /bin/true

(注意!!
/dbdataというボリュームが作られる訳ではない。名前を指定しないと、e1835e684c9939...という名前のボリュームが作られる。e1835e684c9939..を/dbdataにマウントするという意味)

docker run -d --volumes-from dbdata --name db1 training/postgres
docker run -d --volumes-from dbdata --name db2 training/postgres
db1やdb2から利用することもできる。
docker run -d --name db3 --volumes-from db1 training/postgres

公式の解説(かえって分かりにくい?)

この例では、postgres イメージには /dbdata と呼ばれるディレクトリが含まれています。そのため dbdata コンテナからボリュームをマウントする(volumes from)とは、元の postgres イメージから /dbdata が隠された状態です。この結果、dbdata コンテナからファイルを表示しているように見えます。

データボリュームコンテナ

データボリュームコンテナとは自身は何もせず、必要なディレクトリだけをマウントしたコンテナです。
コンテナはボリュームに直接マウントするのではなく、データボリュームコンテナを経由してボリュームにマウントします。
この方法は3つの利点があります。
3つの利点
実際のボリューム先を意識しなくて済む
どのボリュームを使ってるか分かりやすく、バックアップが取りやすい。
docker volume pruneで削除されにくくなる。
docker volume pruneはマウントされていないボリュームを削除するコマンドです。データボリュームコンテナとマウントしているので削除されにくくなる。
つまり、--volumes-fromオプションの用いると、
複数のコンテナを起動しても、どのコンテナもバックアップ対象が同じになる。この例だと、var/lib/mysql。
複数のボリュームをマウントしている場合は、一括してマウントできる。

参考文献

さわって学ぶクラウドインフラ docker基礎からのコンテナ構築

 最後に
私がブログを書く目的は、素晴らしい本や、素晴らしい方々の技術記事を知って頂きたいからです。ぜひ、上記の参考文献を見て下さい。(noteなので広告とかは一切ありません。)

現在、株式会社grabssに行くために最後の悪あがきをしています!!
現在の進行状況
この記事は13件目の投稿。目標まで後37件。

よろしければ、スキボタン及びサポートお願いします。勉強の励みになります。


いいなと思ったら応援しよう!