无法通过弹性search与“已configuration的节点不可用”

我有弹簧启动应用程序与ElasticSearch 5.0.0 alpha 2沟通。我的应用程序成功地与弹性沟通和预制几个查询。

当我尝试dockerize我的应用程序时,它无法与ElasticSearch通信,我得到以下错误:

没有configuration的节点可用:[{#transport#-1} {127.0.0.1} {127.0.0.1:9300}]

我在互联网上花了很多时间,但是在ElasticSearch被docker化的时候,我发现了一些问题,但是在我的情况下,客户端被docker化了,没有Docker的情况下它工作的很好。

我用来创builddocker镜像的命令是: docker build -t my-service。

DockerFile是:

FROM java:8 VOLUME /tmp ADD ./build/libs/myjarfile-2.0.0.jar app.jar EXPOSE 8090 RUN sh -c 'touch /app.jar' ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] 

执行我使用的镜像: docker run –name myname -d -p 8090:8090 -t my-service

有人可以分享他/她的这个问题的经验吗?

谢谢Guy Hudara

问题是您的dockerized主机上没有弹性search。 当你把一些东西放在docker集装箱中时,它也被隔离在一个networking层,localhost是docker集装箱的本地主机,但不是主机本身。 因此,如果您还在Docker容器中使用弹性search,请使用容器链接和环境variables注入,或者将主要networking接口的主机地址( 环回)引用到您的应用程序。

选项1

假设elasticsearch公开了9200尝试运行以下内容

 $ docker run -d --name=elasticsearch elasticsearch $ docker run -d --name=my-app --link elasticsearch:elasticsearch -p 8090:8090 my-app 

然后,您可以使用envvariables${ELASTICSEARCH_PORT_9200_TCP_ADDR}在您的应用程序中定义elasticsearch地址。

选项2

假设您的主机在192.168.1.10上运行,您还可以执行以下操作:

 $ docker run -d -p 9200:9200 elasticsearch $ docker run -d -p 8090:8090 my-app 

请注意,这里的easticsearch容器的名称是可选的,但是必须暴露elasticsearch端口。 在这种情况下,您将不得不在您的应用程序中configuration您的elasticsearch主机,地址为192.168.1.10