黒縁眼鏡は海を飛ぶ

IT中心にそこはかとなく

Dockerでのデータ永続化 -その2-

昨日の続き。
今回はちゃんとDocker 1.10.3を使ってやる。


docker volumeコマンド

Docker 1.9.0からデータボリュームコンテナを管理できるvolumeコマンドが追加されている。

# docker volume --help
Usage:  docker volume [OPTIONS] [COMMAND]

Manage Docker volumes

Commands:
    create                   Create a volume
    inspect                  Return low-level information on a volume
    ls                       List volumes
    rm                       Remove a volume

何もしていない状態でのホスト側ディレクトリを見てみる。

# ls /var/lib/docker/volumes

当然何もない。

では、早速追加してみる。

# docker volume create --name test_volume
test_volume

確認用のコマンドもせっかくだから叩く。

# docker volume ls
DRIVER              VOLUME NAME
local               test_volume

# docker volume inspect test_volume
[
    {
        "Name": "test_volume",
        "Driver": "local",
        "Mountpoint": "/var/lib/docker/volumes/test_volume/_data"
    }
]

/var/lib/docker/volumes配下にtest_volumeができている。
今のところ、volume driverが何なのかいまいちわからない。
Volume Pluginってのがあるらしい。。。

# ls /var/lib/docker/volumes
test_volumes

コンテナにマウントして、inspectでみてみよう!

# docker run -d -h centos7 -v test_volume:/volume centos /bin/bash
# echo "tricotいいですよ" > /volume/test.txt ->あとで使う
(Ctrl+p Ctrl+qでコンテナからデタッチ)
# docker inspect <id> | grep -i volume
VolumesFrom": null,
    "Name": "test_volume",
    "Source": "/var/lib/docker/volumes/test_volume/_data",
    "Destination": "/volume",

前回と同様、ファイルを作成すればホスト側から確認することができる。
volumeコマンドができて変わったことって、データボリュームコンテナを別途管理できるようになったことなのかな?


バックアップ/リストア

データボリューム内のデータをバックアップする場合は、バックアップ実行用のコンテナを別途用意する必要がある。。。らしい。

# mkdir bkp && cd bkp
# docker run --rm -v test_volume:/volume -v $(pwd):/bkp centos tar cvf /bkp/test.tar /volume
tar: Removing leading `/' from member names
/volume/
/volume/test.txt
# ls
test.tar

確かにtarボールができているので、展開する。

# tar xvf test.tar
volume/
volume/test.txt
# ls
test.tar volume
# cat volume/test.txt
tricotいいですよ

リストアするときは逆のことをするだけ

# docker run --rm -v test_volume:/volume -v $(pwd):/bkp centos bash -c "cd /volume && tar xvf /bkp/test.tar --strip 1"

消えたら不味いデータをDockerで扱ってても、これで安心です!!


一通り試した後

  • データボリュームとデータボリュームコンテナの違いってなんだろう
    • データボリュームというひとつのファイルシステムをコンテナとして扱うか否かの違いかと思う
  • ボリュームコンテナって結局コンテナじゃないの?いらなくなったらポイできるのがコンテナのメリットだと思ってたけど。。
    • コンテナはコンテナだけど、「データの永続化を目的としたもの」としてポイっとしない
  • データを保持したいならホストのディレクトリにマップしたほうが管理もしやすいのでは?
    • ホストのディレクトリでも別に構わないけど、ホストが汚れるし管理しにくそう。docker volumeコマンドでコンテナとして一覧管理できるところがよさげだし、/var/lib/docker/volumes配下に隔離できるのもメリットかもしれない。

開発段階でホスト-コンテナ間のファイルのやり取りを頻繁に実施するならディレクトリに、定期的にバックアップしたりするデータの保存域が欲しいかつホストを汚したくない場合はデータボリュームコンテナで、という感じでしょうか。。。

個人的にはどっちでもいい気がしたのであった。