无法通过弹性搜索与 dockerized 进程进行通信,并显示“所有已配置的节点都不可用”

Posted

技术标签:

【中文标题】无法通过弹性搜索与 dockerized 进程进行通信,并显示“所有已配置的节点都不可用”【英文标题】:Failed to communicate a dockerized process with elastic search with "None of the configured nodes are available" 【发布时间】:2016-10-23 05:22:36 【问题描述】:

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

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

配置的节点均不可用:[#transport#-1127.0.0.1127.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

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

谢谢 盖伊·胡达拉

【问题讨论】:

您能否提供更多信息,例如您使用的是什么操作系统、如何在应用中配置 ES 等? 【参考方案1】:

问题是您的弹性搜索在您的 dockerized 主机上不可用。当您将某些东西放入 docker 容器中时,它也会在网络层上被隔离,并且 localhost 是 docker 容器的本地主机,但 不是 主机本身。因此,如果您在 docker 容器中也有弹性搜索,请使用容器链接和环境变量注入或将您的主机地址引用到您的主网络接口 - 不是环回 - 到您的应用程序。

选项 1

假设 elasticsearch 暴露 9200 尝试运行以下

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

然后您可以使用环境变量$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 容器的名称在这里是可选的,但必须公开弹性搜索端口。在这种情况下,您必须在给定地址192.168.1.10 的应用程序中配置您的弹性搜索主机。

【讨论】:

以上是关于无法通过弹性搜索与 dockerized 进程进行通信,并显示“所有已配置的节点都不可用”的主要内容,如果未能解决你的问题,请参考以下文章

弹性搜索无法启动 - 使用 Ansible 进行设置

无法打开到 localhost:9200 的 TCP 连接 - Rails on Docker compose

如何将 fluentd 连接到 opendistro 以进行弹性搜索

如何使弹性搜索多匹配模糊搜索始终返回最小数量的结果

docker 日志管理

Docker容器的安全