Docker上でElasticsearchのデータをNamed Data Volumeに保存しFessで利用する

この記事は[Fess Advent Calendar 2016](http://qiita.com/advent-calendar/2016/fess)の24日目の記事になります。
[←前の記事](http://qiita.com/cookienote/items/fd390a941ee102cdf451) [次の記事→](http://qiita.com/kw_udon/items/06d385b88dafed4bd609)

今回は、Dockerを使ってデータを永続化させるひとつの手段である[Named Data Volume](https://docs.docker.com/engine/tutorials/dockervolumes/)機能を用いて、ElasticsearchのデータをNamed Data Volumeに保存してみたいと思います。

# Named Data Volumeとは
[コンテナでデータを管理する — Docker-docs-ja 1.9.0b ドキュメント](http://docs.docker.jp/engine/userguide/dockervolumes.html)
こちらに書かれているように、データ保持のため Named Volume と呼ばれる領域をホストOSに作成し、それに名前をつけて管理しています。
ここでは詳しくは述べませんが、以下のリンクがわかりやすかったです。
[Docker の Data Volume まわりを整理する](http://qiita.com/lciel/items/e21a4ede3bac7fb3ec5a)

それでは、ElasticsearchのデータをNamed Data Volumeに保存してみましょう。

# 環境
Ubuntu 16.10
java version "1.8.0_111"
Fess 10.2.3
Elasticsearch 2.3.5
Docker version 1.12.3, build 6b644ec

# Docker Composeの設定

```docker-compose.yml
version: '2'
services:
  fess:
    build: ./fess
    ports:
      - "8080:8080"
    depends_on:
      - elasticsearch
    environment:
      - ES_HTTP_URL=http://compose_elasticsearch_1:9200
      - ES_TRANSPORT_URL=compose_elasticsearch_1:9300
      - FESS_DICTIONARY_PATH=/usr/share/elasticsearch/config/
  elasticsearch:
    build: ./elasticsearch
    volumes:
      - esdata:/usr/share/elasticsearch/data
      - esconfig:/usr/share/elasticsearch/config
volumes:
  esdata:
    driver: local
  esconfig:
    driver: local
```

# ElasticsearchのDocker file

```Dockerfile
FROM elasticsearch:2.3.5

RUN /usr/share/elasticsearch/bin/plugin install org.codelibs/elasticsearch-analysis-fess/2.3.0 && \
    /usr/share/elasticsearch/bin/plugin install org.codelibs/elasticsearch-analysis-ja/2.3.0 && \
    /usr/share/elasticsearch/bin/plugin install org.codelibs/elasticsearch-analysis-synonym/2.3.0 && \
    /usr/share/elasticsearch/bin/plugin install org.codelibs/elasticsearch-configsync/2.3.1 && \
    /usr/share/elasticsearch/bin/plugin install org.codelibs/elasticsearch-dataformat/2.3.0 && \
    /usr/share/elasticsearch/bin/plugin install org.codelibs/elasticsearch-langfield/2.3.0 && \
    /usr/share/elasticsearch/bin/plugin install http://maven.codelibs.org/archive/elasticsearch/plugin/kopf/elasticsearch-kopf-2.0.1.0.zip && \
    /usr/share/elasticsearch/bin/plugin install org.codelibs/elasticsearch-analysis-kuromoji-neologd/2.3.1

RUN (echo "configsync.config_path: /usr/share/elasticsearch/config"; \
    echo "script.engine.groovy.inline.update: on") | \
    tee -a /usr/share/elasticsearch/config/elasticsearch.yml 

EXPOSE 9200 9300

ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["elasticsearch"]
```

他はそのままでOKです。

# 結果
ここで`$ docker-compose up -d --build`して起動した後、[ウェブのクロール設定](http://localhost:8080/admin/webconfig/)などから適当にクローラ設定を追加してみます。
そして

```
$ docker-compose stop
$ docker rm `docker ps -a -q`
$ docker-compose up -d --build
```

で再起動してやると、Elasticsearchのコンテナは削除されたのにクローラの設定が復元されています！
つまり、コンテナ削除＆作成しても消去されないデータの作成に成功しました。便利ですね。
今まで作成した実際のVolumeを確認するには`$ docker volume ls`で確認できます。
Dockerを使用していると、どんどん不要なVolumeが作成されていることがあるので、定期的に
`$ docker volume ls -f "dangling=true" -q | xargs docker volume rm`で削除してあげましょう(参考:[Dockerの不要なボリュームを削除する - 座敷牢日誌](http://zashikiro.hateblo.jp/entry/2016/08/16/201633))。

他にも、データの永続化にはホストOSのディレクトリを直接マウントさせることや、Data Volume Containerと呼ばれるデータ保持用のコンテナを作成することもできますが、Named Data Volumeが一番とっつきやすかったです。
お試しあれ。