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