Go
golang
Elasticsearch
docker
olivere

Goのelasticパッケージを利用してDocker上のElasticsearchに接続する

More than 1 year has passed since last update.

ハマった点

goでelasticsearchに接続する際にolivere/elastic プラグインを利用したけれど、ローカルのDockerで起動したelasticsearchに接続できなかったので調べると、SniffingをOFFにしなければいけないことがわかった。ソースはここにあるので気になる方はご覧ください。
簡単に言うと、docker containerにアクセスする時は、 127.0.0.1:9200 => 172.0.0.2:9200(例) みたいにIPがnatされているので、dockerからreturnされるIPは172.0.0.2:9200 になってて外からアクセスできない。SniffingをOFFにしないと172.0.0.2:9200 に接続しに行こうとして接続できないのでエラーとなる。

環境準備

実行環境

  • Mac OS
  • go1.9
  • docker 17.06.1-ce

elasticsearch (Dockerコンテナー)

$ docker pull docker.elastic.co/elasticsearch/elasticsearch:5.5.2
$ docker run -it --rm -p 9200:9200 -p 9300:9300 \
    -e "http.host=0.0.0.0" -e "transport.host=127.0.0.1" \
    -e "xpack.security.enabled=false" --name news_search \
    -d docker.elastic.co/elasticsearch/elasticsearch:5.5.2

elasticパッケージダウンロード

go get gopkg.in/olivere/elastic.v5

デフォルトのコード実行

コード内容

main.go
//client, err := elastic.NewClient()
_, err :=elastic.NewClient()
if err != nil {
    panic(err)
}

エラー内容

2017/09/02 19:07:17 http: panic serving [::1]:55010: no active connection found: no Elasticsearch node available

SniffingをOFFにする

コード内容

main.go
//client, err := elastic.NewClient(elastic.SetSniff(false))
_, err :=elastic.NewClient(elastic.SetSniff(false))
    if err != nil {
        // Handle error
        panic(err)
    }
fmt.Println("connection OK!!")

これだとエラーにならず、接続ができる。
このエラーにハマった人がこの記事をみて5分で解決できたら嬉しい。