MongoDB のストレージに Docker Managed な Volumes を利用してみた

普段ローカルでデータを取り扱うとき極力環境を汚したくはないので DB サーバ立てる時もなるべく Docker コンテナ利用するのですが、MongoDB データの永続化に初めて Docker Volumes を利用してみました。

Docker コンテナ内のデータ永続化にはこれまで公式で言うところのいわゆる Bind Mounts しか利用したことがなく、Docker Managed なやり方が出てきていたことを知らなかったのでちょっと試しに利用してみたぐらいの温度感です。

一応 201801 現在のところの Best Practice はこの Docker Volumes らしいですが、まぁユースケース次第だと思うのでちゃんと考えて選択したほうが良いでしょう。

今回は Web サイトからクローリングしてきたデータが JSONLines 形式のファイルに収められている際に、そのファイルを mongoimport して Docker Volume に格納し、MongoDB サーバコンテナを削除した場合でも永続化されていることを確認するフローを行ったのでそのメモになります。

環境

Ubuntu 16.04
Docker version 17.12.0-ce, build c97c6d6

Docker Volume 作成

肝心のボリュームを mongodb_volume という名前で作成してみます。

$ docker create volume mongodb_volume

DB サーバコンテナ作成

公式の MongoDB イメージを利用します。
/data/dbdbpath が設定されているので、上記で作成した Docker Volume をこのディレクトリにマウントしてあげることになります。

$ docker run -d --rm --name mongodb --mount source=mongodb_volume,target=/data/db -p 27017:27017 mongo:latest

データインポート

データインポートも公式 MongoDB イメージを利用します。
再度 mongo コンテナを立ち上げますが、その際に上記サーバコンテナの名前である mongodb をリンク指定してあげましょう。
そしてコマンドラインでホスト側のホームディレクトリに配置されている data.jsonl ファイルを DB 名 my_db、コレクション名 my_col にリンク経由で mongoimport します。

$ docker run --rm --link mongodb:mongodb -v $HOME:/workspace mongo:latest mongoimport -h mongodb -d my_db -c my_col --file /workspace/data.jsonl

正常にインポートが終わったらコンテナも終了するはず。

DB サーバコンテナ終了&再起動

試しにサーバコンテナを削除してからもう一度起動してみます。

$ docker stop mongodb
$ docker run -d --rm --name mongodb --mount source=mongodb_volume,target=/data/db -p 27017:27017 mongo:latest

データ確認

$ docker run -it --rm --link mongodb:mongodb mongo:latest mongo mongodb://mongodb
> use my_db
> db.my_col.find()

最後に mongo シェル用にコンテナを起動して実際にクエリを叩いてみてちゃんと結果が返ってくればOK。
バックアップをとったりリストアしたりする際には /var/lib/docker/volumes/<volume-name> を対象に行ってあげればいいらしい。
正直今回みたいな用途だと Bind Mounts でも全然問題ないんだけどまぁ知っておいて損はなさそう・・・かな。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.