无法将具有弹性搜索的 dockerized 进程与 "None of the configured nodes are available" 进行通信



我有与ElasticSearch 5.0.0 alpha 2通信的spring启动应用程序。 我的应用程序成功地与弹性通信并预执行了多个查询。

当我尝试对我的应用程序进行 dockerization 时,它无法与 ElasticSearch 通信,并且出现以下错误:

配置的节点均不可用:[{#transport#-1}{127.0.0.1}{127.0.0.1:9300}]

我花了很多时间在互联网上,但是当 ElasticSearch 被 dockerized 时,我发现了问题,但就我而言,客户端是 dockerized 的,没有 docker 也能正常工作。

我用来创建 docker 镜像的命令是: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

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

谢谢 盖伊·胡达拉

问题是你的 elasticsearch 在你的 dockerized 主机上不可用。当你把东西放在 docker 容器中时,它也会被隔离在网络层上,localhost 是 docker 容器的本地主机,而不是主机本身。因此,如果您在 docker 容器中也有 elasticsearch,请使用容器链接和环境变量注入,或者将主网络接口的主机地址(而不是环回)引用到您的应用程序。

选项 1

假设 Elasticsearch 公开 9200 尝试运行以下命令

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

然后,您可以使用 env 变量${ELASTICSEARCH_PORT_9200_TCP_ADDR}在应用程序中定义弹性搜索地址。

选项 2

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

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

请注意,Easticsearch 容器的名称在这里是可选的,但必须公开 Elasticsearch 端口。在这种情况下,您必须在给定地址的情况下在应用程序中配置 elasticsearch 主机192.168.1.10

相关内容

最新更新