Elasticsearch 5.0.0 で elasticsearch-head を Docker で利用する


## 追記(2017/01/12)

どうやらelasticsearch-headでDocker対応したようです。

```bash
docker pull mobz/elasticsearch-head
```

DockerHub: https://hub.docker.com/r/mobz/elasticsearch-head/
PullRequest: https://github.com/mobz/elasticsearch-head/pull/296

## はじめに

Elasticsearch をGUIで操作できる便利なプラグイン [elasticsearch-head](https://github.com/mobz/elasticsearch-head) ですが、Elasticsearch 5.0.0 からは利用できなくなりました。

> site plugin はElasticsearch 5.0では使えなくなります。

[Elasticsearch 5.0とともにsite pluginを動かす](https://www.elastic.co/jp/blog/running-site-plugins-with-elasticsearch-5-0)

elasticsearch-head が依存していた `site plugin` がElasticsearch5.0からは使えなくなるためのようです。

そのため、elasticsearch-head を利用する際は、独立したwebサーバーを立ち上げる必要があります。

サーバーの立ち上げ方は、[elasticsearch-headのREADME](https://github.com/mobz/elasticsearch-head#running-with-built-in-server) に記載してあります。

今回は、elasticsearch などを全てDockerの上で動かしたいのでその方法を説明します。

ソースコードは、[こちら](https://github.com/kawasin73/elasticsearch_head_docker)にアップロードしています。

## 環境

- OS: macOS
- Docker for Mac: 1.12.1
- docker-compose: 1.8.0

## 使い方

```bash:bash
git clone https://github.com/kawasin73/elasticsearch_head_docker.git
cd elasticsearch_head_docker
docker-compose up
```

また、

```bash:bash
docker-compose up head
```

でも起動します。

`http://localhost:9100` にブラウザからアクセスするとおなじみのあの画面が表示されます。

![elasticsearch-head.png](https://qiita-image-store.s3.amazonaws.com/0/65193/1cfd4cd4-d54a-cd9f-8ed0-6336bbc96c59.png "elasticsearch-head.png")


## フォルダ構成

```bash:bash
$ tree elasticsearch_head_docker
elasticsearch_head_docker
├── README.md
├── docker-compose.yml
├── es
│   ├── Dockerfile
│   └── elasticsearch.yml
└── head
    ├── Dockerfile
    └── Gruntfile.docker.js
```

## ファイルの解説

### `es/Dockerfile`

```bash:es/Dockerfile
FROM elasticsearch:5.0.0

RUN elasticsearch-plugin install analysis-kuromoji
RUN elasticsearch-plugin install analysis-icu

COPY elasticsearch.yml /usr/share/elasticsearch/config/elasticsearch.yml
```

`elasticsearch:5.0.0` を利用します。その他のプラグインはお好みで入れてください。
また、`elasticsearch.yml`を上書きしています。

### `es/elasticsearch.yml`

```es/elasticsearch.yml
network.host: 0.0.0.0

# this value is required because we set "network.host"
# be sure to modify it appropriately for a production cluster deployment
discovery.zen.minimum_master_nodes: 1

http.cors.enabled: true
http.cors.allow-origin: /https?:\/\/localhost(:[0-9]+)?/
```

最初の5行は、`elasticsearch:5.0.0`　イメージ内の`/usr/share/elasticsearch/config/elasticsearch.yml`のコピペです。

[ここ](https://github.com/mobz/elasticsearch-head#running-with-built-in-server)推奨されているように、cors (Cross-Origin Resource Sharing) を有効にして、ローカルホストからのアクセスのみを許可するようにします。

### `head/Dockerfile`

```bash:head/Dockerfile
FROM node:7.0.0

RUN npm install -g grunt-cli

WORKDIR /app

RUN git clone https://github.com/mobz/elasticsearch-head.git /app

RUN npm install

COPY Gruntfile.docker.js /app/Gruntfile.docker.js

EXPOSE 9100

CMD ["grunt", "server", "--gruntfile", "Gruntfile.docker.js"]
```

`node:7.0.0`イメージを利用しています。[elasticsearch-head](https://github.com/mobz/elasticsearch-head)の `Gruntfile` のままでは動かない（詳しくは後述）ので、独自の`Gruntfile.docker.js`を追加しています。 `Gruntfile.js` を上書きしても良いのですが、なんとなく嫌な感じがしたので、別名のファイルとして追加しています。

### `head/Gruntfile.docker.js`

```js:head/Gruntfile.docker.js
// 省略
		connect: {
			server: {
				options: {
					port: 9100,
					base: '.',
					keepalive: true,
					hostname: '0.0.0.0' // <- added
				}
			}
		}
// 省略
```

Dockerのコンテナ内で `grunt server` を動かすので、`hostname` を幅広く受け付けるように設定が必要です。
`hostname` 以外の部分については、[元々のGruntfile](https://github.com/mobz/elasticsearch-head/blob/master/Gruntfile.js)からコピペしています。

### `docker-compose.yml`

```docker-compose.yml
version: "2"
services:
  es:
    build:
      context: "es/."
    volumes:
      - "~/.data/es/data:/usr/share/elasticsearch/data"
    ports:
      - "9200:9200"
      - "9300:9300"
  head:
    build:
      context: "head/."
    depends_on:
      - es
    ports:
      - "9100:9100"
```

`Docker for Mac` はDockerVM上のボリュームの量を増やすことができません。[Docker for Mac でディスク容量が足りなくなった時の対処法](http://qiita.com/kawasin73/items/ed9b0ccdde4b65b87b35)

そのため、macOS上のディレクトリをマウントしています。
その分速度は遅くなってしまいますので、Elasticsearch内にそれほどたくさんのデータを挿入しないのであれば、

```
	volumes:
      - "es-data:/usr/share/elasticsearch/data"
```

のようにDockerVM上のボリュームをマウントすると高速化されると思います。

また、`ports` は`Dockerfile`上に記述しているので、`docker-compose.yml`に記述する必要はないのですが、わかりやすいように記述しています。

## 参考URL

- [elasticsearch-head](https://github.com/mobz/elasticsearch-head)
- [Elasticsearch 5.0とともにsite pluginを動かす](https://www.elastic.co/jp/blog/running-site-plugins-with-elasticsearch-5-0)
- [Docker for Mac でディスク容量が足りなくなった時の対処法](http://qiita.com/kawasin73/items/ed9b0ccdde4b65b87b35)