DockerコンテナでElasticSearchを起動する（docker-compose）

# 目的

* DockerコンテナでElasticSearchを起動する
* AWSのLambda + ElasticSearchServiceを作る前段階のお勉強のためにやった

# やらないこと

* ElasticSearchの基礎的な説明（公式なり他記事を参照してください）
* Docker、docker-composeの環境構築について

# 環境

* OS: macOS Catalina 10.15.4
* Docker: 2.2.0.5
* docker-compose: 1.25.4
* ElasticSearch: 7.4.2

# やったこと
## フォルダ構成

今回試したフォルダ構成は以下の通り
将来的にPythonから操作したいため、Pythonのコンテナも用意する

``` sh
/sample
  ├ /elasticsearch
      └ Dockerfile
  ├ /python3
      └ Dockerfile
  └ docker-compose.yaml
```

## Dockerfileの作成

ElasticSearch用のDockerfileを作成

``` Dockerfile:Dockerfile
# Version 7.4.2 を選択してイメージを取得する
FROM docker.elastic.co/elasticsearch/elasticsearch:7.4.2
# 日本語を扱う場合はplugin「analysis-kuromoji」をインストールする
RUN elasticsearch-plugin install analysis-kuromoji
```

Python3用のDockerfileを作成

``` Dockerfile:Dockerfile
FROM python:3.8
USER root
SHELL ["/bin/bash", "-c"]
ENV DEBCONF_NOWARNINGS yes
RUN apt-get update && apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm
RUN apt-get install -y vim less
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
# clientである「elasticsearch」をインストール
RUN pip install  numpy \
                 matplotlib \
                 pandas \
                 elasticsearch \
```



## docker-compose.yamlの作成

ElasticSearchとpythonのコンテナを立ち上げるためにdocker-compose.yamlを作成

``` yaml:docker-compose.yaml
version: '3'

services:
  elasticsearch:
    build: ./elasticsearch
    container_name: elasticsearch
    environment:
      - discovery.type=single-node # 1台構成で十分なため「single-node」を設定
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
    volumes:
      - ./elasticsearch:/usr/share/elasticsearch/data
    networks:
      - esnet

  python3:
    build: ./python3
    container_name: python3
    working_dir: '/root/dev/'
    tty: true
    volumes: 
      - ./python3/:/root/dev/
    networks:
      - esnet

# Elasticsearchとpython3のコンテナを同じdocker network上に起動させるため、networksを作成
networks:
  esnet:
```

## docker-composeコマンドを実行

docker-composeコマンドでコンテナを起動する

``` sh
$ docker-compose build
$ docker-compose up -d
```

コンテナが起動していることを確認する
ElasticSearchとpython3の両コンテナが起動していればOK

``` sh
$ docker ps
CONTAINER ID        IMAGE                                COMMAND                  CREATED              STATUS              PORTS                              NAMES
d33d23acd0c6        sample_python3         "python3"                About a minute ago   Up About a minute                                      python3
e3b929c0f521        sample_elasticsearch   "/usr/local/bin/dock…"   About a minute ago   Up About a minute   0.0.0.0:9200->9200/tcp, 9300/tcp   elasticsearch
```

## ElastisSearchの起動確認

curlコマンドを使用してElasticsearchに接続する
cluster-nameなどが返却されればOK

``` sh
$ curl -X GET http://localhost:9200
{
  "name" : "37a5326e5c64",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "RX8UaCNpSmmCiyX2p2ra0w",
  "version" : {
    "number" : "7.4.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96",
    "build_date" : "2019-10-28T20:40:44.881551Z",
    "build_snapshot" : false,
    "lucene_version" : "8.2.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
```

# 次回のお話

pythonコンテナからElasticserviceに接続してindexの操作をしてみた
[pythonでElasticsearchを操作する（登録・検索）](https://qiita.com/hiroky_814/items/b8b07f9980e930436fbf)