使用Go语言的elastic包来连接位于Docker上的Elasticsearch

迷住了一点

我在使用go连接elasticsearch时,使用了olivere/elastic插件。但当我尝试连接到本地的Docker上运行的elasticsearch时,发现无法连接。经过调查,我了解到必须将Sniffing设置为OFF。如果您感兴趣,源代码在这里可以查看。

简单来说,当访问docker容器时,IP地址会被NAT为127.0.0.1:9200 => 172.0.0.2:9200(例如)。所以从docker返回的IP是172.0.0.2:9200,从外部无法访问。如果不关闭Sniffing,连接将尝试去连接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

弹性软件包下载

go get gopkg.in/olivere/elastic.v5

默认的代码执行方式

代码内容 (codede neirong)

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

错误内容 (Error content)

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

关闭嗅探功能

代码内容

//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分钟内解决问题,我会很开心。

bannerAds