概要
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 件のコメント:
コメントを投稿