ElasticsearchとKibanaをDockerでサクッとインストールする(シングルノード・マルチノード)

# できたもの
[https://github.com/romiogaku/docker-es](https://github.com/romiogaku/docker-es)

# 利用方法
## シングルノード
### 起動
```bash
$ docker-compose -f docker-compose.yml up -d
```
### 停止
```bash
$ docker-compose -f docker-compose.yml down
```

Elasticssearch: [localhost:9200](http://localhost:9200)
Kibana: [localhost:5601](http://localhost:5601)
で起動します。

## 3ノード

### 起動
```bash
$ docker-compose -f docker-compose-cluster.yml up -d
```
### 停止
```bash
$ docker-compose -f docker-compose-cluster.yml down
```

Elasticssearch node1: [localhost:9200](http://localhost:9200)
Elasticssearch node2: [localhost:9201](http://localhost:9201)
Elasticssearch node3: [localhost:9202](http://localhost:9202)
Kibana: [localhost:5601](http://localhost:5601)
で起動します。

# docker-compose.yml
シングルノード用のものです。

```yml
version: '3'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
    ports:
      - 9200:9200
    volumes:
      - ./docker/elasticsearch/data:/usr/share/elasticsearch/data
      - ./docker/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    networks: [elastic]
    environment:
      - discovery.type=single-node
  kibana:
    image: docker.elastic.co/kibana/kibana-oss:6.3.2
    ports:
      - 5601:5601
    networks: [elastic]
networks:
  elastic:
```

KibanaはX-Packを利用しない前提で　oss imageを指定しています。
Elasticsearchのデータ永続化のためにホストの`./docker/elasticsearch/data`とゲストの`/usr/share/elasticsearch/data`をマウントしています。
configファイルも柔軟に変えられるよう`elasticsearch.yml`もマウントしています。

# elasticsearch.yml
シングルノード用のものです。

```yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
discovery.zen.minimum_master_nodes: 1
```

# docker-compose-cluster.yml
3ノード構成のものです。

```yml
version: '3'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
    container_name: elasticsearch
    environment:
      - node.name=node1
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms256m -Xmx256m"
      - "discovery.zen.ping.unicast.hosts=elasticsearch,elasticsearch2,elasticsearch3"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./docker/elasticsearch/config/elasticsearch-cluster.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ports:
      - 9200:9200
    networks: [elastic]
  elasticsearch2:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
    container_name: elasticsearch2
    environment:
      - node.name=node2
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms256m -Xmx256m"
      - "discovery.zen.ping.unicast.hosts=elasticsearch,elasticsearch2,elasticsearch3"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./docker/elasticsearch/config/elasticsearch-cluster.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ports:
      - 9201:9200
    networks: [elastic]
  elasticsearch3:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
    container_name: elasticsearch3
    environment:
      - node.name=node3
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms256m -Xmx256m"
      - "discovery.zen.ping.unicast.hosts=elasticsearch,elasticsearch2,elasticsearch3"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./docker/elasticsearch/config/elasticsearch-cluster.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ports:
      - 9202:9200
    networks: [elastic]
  kibana:
    image: docker.elastic.co/kibana/kibana-oss:6.3.2
    ports:
      - 5601:5601
    networks: [elastic]
networks:
  elastic:
```

基本は[公式](https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html)に書いてある2ノード構成のdocker-compose.ymlを参考にしています。
自分の環境だと `ES_JAVA_OPTS=-Xms256m -Xmx256m"`に下げないと起動失敗しました。

# elasticsearch-cluster.yml
3ノード構成のものです。

```yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
discovery.zen.minimum_master_nodes: 2
```
クラスタ構成の最小マスタノード数を2にしています。
これはクラスタ内のmaster-eligibleノード（マスターノードになりうる役割を持つノード。デフォルトで全ノードがmaster-eligible）の数の過半数値を指定する必要があります。
過半数を指定しないとスプリットブレインが起きてしまう可能性があります。