Elasticsearchのローカル環境をDocker Composeで用意する


[Dockerアドベントカレンダーの18日目](http://qiita.com/advent-calendar/2016/docker)の記事です。

参考：http://qiita.com/tukiyo3/items/2fe940455c06323063a1

「Elasticsearchの開発環境をローカルに用意したいな」というのと、「kibana5のDev Tools使いたいな」というと、「Dockerアドベントカレンダー書かねば・・・」というのでやってみました。

## 環境
Docker for macです。

```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12
BuildVersion:	16A323

$ docker -v
Docker version 1.12.5, build 7392c3b

$ docker-compose -v
docker-compose version 1.9.0, build 2585387
```

## Docker Compose

要件としては

- Elasticsearchに投入したデータをkibanaでみたい
- kibanaのDev ToolsでElasticsearchにデータ投入したい
- インデックスデータを消失させたくない

あたりなので最低限の記述にしています。

```docker-compose.yml
  elasticsearch:
    image: elasticsearch:5
    ports:
      - "9200:9200"
      - "9300:9300"
    volumes:
      - ./es_data/:/usr/share/elasticsearch/data/
  kibana:
    image: kibana:5
    ports:
      - "5601:5601"
    links:
      - elasticsearch
    environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200
```

## 起動する
`docker-compose up`で起動すればOKです。

```
$ docker-compose up
Recreating elasticv5_elasticsearch_1
Recreating elasticv5_kibana_1
```

### Elasticsearchの接続確認

```
$ curl localhost:9200 
{
  "name" : "JU1uhbk",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "r6__oQDpTc2fUKkNKPohEA",
  "version" : {
    "number" : "5.1.1",
    "build_hash" : "5395e21",
    "build_date" : "2016-12-06T12:36:15.409Z",
    "build_snapshot" : false,
    "lucene_version" : "6.3.0"
  },
  "tagline" : "You Know, for Search"
}

```

### kibanaにアクセスする
http://localhost:5601/app/kibana#/dev_tools/console?_g=()
にアクセスすると、Elasticsearchのコンソール画面が表示されます。

以下のようなクエリを書いてデータ投入します。

```
PUT dev_tools/test/1
{
  "Name": "John Doe",
  "date": "2016-12-25",
  "message": "This is first content"
}
```
![スクリーンショット 2016-12-26 0.18.19.png](https://qiita-image-store.s3.amazonaws.com/0/23936/fa0fcc92-da67-0221-2114-c302db6f8ca2.png "スクリーンショット 2016-12-26 0.18.19.png")
右側にPUTの結果が表示されます。

`GET _search`のようなクエリを書くとそのままデータの検索もできます。

![スクリーンショット 2016-12-26 0.20.05.png](https://qiita-image-store.s3.amazonaws.com/0/23936/16a008c5-3ef3-ab56-dcc8-f5a2ccbae74d.png "スクリーンショット 2016-12-26 0.20.05.png")

## インデックスデータの場所について
`docker-compose.yml`に`./es_data/`へインデックス情報を保存するように指定していますので、以下のようになります。

```
$ tree -L 5
.
├── docker-compose.yml
└── es_data
    └── nodes
        └── 0
            ├── _state
            │   ├── global-6.st
            │   └── node-6.st
            ├── indices
            │   ├── 8KtEjxzpS3qFdYpqinKpJg
            │   ├── 8YEVLUglQNS7t7C1w5yy-w
            │   └── n424EH2uReu9S4GOqUsGzg
            └── node.lock
```
テストデータを使いまわしたい時って結構あると思うので、弊害を感じるまではマウントさせておくつもりです。
もし不要になった場合はes_dateディレクトリごと消せばよさそうかなと思います。（間違ってたらすみません）

## [ハマったメモ]docker-composer.ymlをタブインデントする
タブインデントでymlを書くと、起動時に事故ります。

```
$ docker-compose up
ERROR: yaml.scanner.ScannerError: while scanning for the next token
found character '\t' that cannot start any token
  in "./docker-compose.yml", line 2, column 1
```

## おまけ：公式Docker Imageリスト

|Name|URL|Version|
|:--|:--|:--|
|Logstash|https://hub.docker.com/_/logstash/|5.1.1, 5.1, 5, latest (5/Dockerfile) <br/>5.1.1-alpine, 5.1-alpine, 5-alpine, alpine (5/alpine/Dockerfile) <br/>2.4.1, 2.4, 2 (2.4/Dockerfile) <br/>2.4.1-alpine, 2.4-alpine, 2-alpine (2.4/alpine/Dockerfile) <br/>1.5.6, 1.5, 1 (1.5/Dockerfile) <br/>1.5.6-alpine, 1.5-alpine, 1-alpine (1.5/alpine/Dockerfile)|
|Elasticsearch|https://hub.docker.com/_/elasticsearch/|5.1.1, 5.1, 5, latest (5/Dockerfile)<br/>5.1.1-alpine, 5.1-alpine, 5-alpine, alpine (5/alpine/Dockerfile)<br/>2.4.3, 2.4, 2 (2.4/Dockerfile)<br/>2.4.3-alpine, 2.4-alpine, 2-alpine (2.4/alpine/Dockerfile)<br/>1.7.6, 1.7, 1 (1.7/Dockerfile)<br/>1.7.6-alpine, 1.7-alpine, 1-alpine (1.7/alpine/Dockerfile)<br/>|
|kibana|https://hub.docker.com/_/kibana/|5.1.1, 5.1, 5, latest (5/Dockerfile)<br/>4.6.3, 4.6, 4 (4.6/Dockerfile)<br/>4.1.11, 4.1 (4.1/Dockerfile)|