2017年1月19日木曜日

Docker Data Volume を使ってみた

概要

docker を使ってデータを永続化する場合に Data Volume という機能があります
Data Volume には Data Volume Container というコンテナ自体をデータを永続化するためのコンテナとして使うための方法もあります
今回は Data Volume を使ってみたので紹介します

環境

  • CentOS 7.3.1611 64bit
  • docker 1.12.5

使い方

使い方は簡単で Data Volume を作成してコンテナを起動するときにその Data Volume を指定することでコンテナにマウントすることができます

  • docker volume create --name test_data

で Data Volume を作成することができます
ls を使うことで領域を確認することができます

  • docker volume ls
DRIVER              VOLUME NAME
local               test_data

またコンテナホスト上には以下のパスに保存されるようです

/var/lib/docker/volumes/test_data/_data/

作成したらこの領域をコンテナで指定して起動してみます
docker run をするときに -v オプションを指定することでマウントすることができます

  • docker run -d -p 8080:80 -v test_data:/tmp nginx

今回はとりあえず nginx のイメージを使っています
この指定の場合 test_data という Data Volume をコンテナに /tmp のパスでマウントして起動します
実際にコンテナが起動したら docker exec で動作確認してみましょう (happy_bose はコンテナの名前です)

  • docker exec -it happy_bose /bin/bash
root@b61967b81111:/# touch /tmp/hoge
root@b61967b81111:/# ls /tmp/
hoge

とりあえずファイルが無いのでファイルを作成しておきます
この状態で先程のホスト側のパスを確認するとファイルが作成されているのを確認できると思います

また同様に同じ Data Volume をマウントしたコンテナを作成してみましょう
コンテナに入って Data Volume のマウント先を確認すると先程作成した hoge が既に作成されていると思います

  • docker run -d -p 8080:80 -v test_data:/tmp2 nginx
  • docker exec -it boring_poitras /bin/bash
root@eac57dd0d84d:/# ls /tmp2/
hoge
root@eac57dd0d84d:/# touch /tmp2/hoge2

更に別のファイルを作成して前に起動しておいたコンテナを確認すると、別のコンテナで作成したファイルが存在しているのが確認できると思います

root@b61967b81111:/# ls /tmp/
hoge  hoge2

ホスト側のファイルも増えていることが確認できると思います

# find / -name "hoge*"
/var/lib/docker/volumes/test_data/_data/hoge
/var/lib/docker/volumes/test_data/_data/hoge2

バックアップとかリストア

docker の公式のページを見ると tar コマンドでホストマシンの Data Volume のパスを圧縮してバックアップし、それを別コンテナに移して解凍する方法が紹介されています
どうやら docker レベルで Data Volume をバックアップ、リストアするような専用の機能は特に用意されていなく、ミドルウェアや OS レベルでバックアップデータを取得する感じのようです

例えばオンラインバックアップはいきなり Data Volume の領域を保存するのではなく mysqldump でダウンプデータを取得してから tar コマンドで圧縮する感じになると思います

あとは Data Volume の領域を別のホストマシンでも共有する方法ですが、どうやらこれは docker 的にナンセンスな構成のようです
単純に同じデータ領域を別の複数のコンテナから書き込みを行うと不整合が発生するのでやめたほう良いと公式にもありました
確かに、write に上記のことは当てはまると思いますが read に関してはそんなことはないと思います
例えば MySQL のレプリケーションをして read 用の MySQL を作成したい場合などです
その場合は、単純に Data Volume の領域を rsync などで同期してリードレプリカ用のコンテナでマウントして使う感じだと思います

最後に

Docker Data Volume を使ってデータを永続化する方法を紹介しました
コンテナ間で同じ Data Volume 領域をマウントできるのでコンテナ上のアプリのログを一括で管理するのにも使えそうです (ログに関しては Fluentd logging driver があるので、そっちのほうが良いかもしれませんが)
あとは単純にホストマシン上とデータの共有ができるので、ビルドした成果物等を保存したい場合などにも使えると思います

参考サイト

0 件のコメント:

コメントを投稿