Dockerized Spring Boot App无法连接到默认地址和端口本地运行的Elastic Search服务器。抛出以下异常:
2049
Docker文件:
2018-01-20 07:10:38.529 INFO 1 --- [ main] org.elasticsearch.client.transport : [Gemini] failed to connect to node [{#transport#-1}{localhost}{127.0.0.1:9300}], removed from nodes list
org.elasticsearch.transport.ConnectTransportException: [][127.0.0.1:9300] connect_timeout[30s]
at org.elasticsearch.transport.netty.NettyTransport.connectToChannelsLight(NettyTransport.java:967) ~[elasticsearch-2.4.6.jar!/:2.4.6]
at org.elasticsearch.transport.netty.NettyTransport.connectToNode(NettyTransport.java:933) ~[elasticsearch-2.4.6.jar!/:2.4.6]
at org.elasticsearch.transport.netty.NettyTransport.connectToNodeLight(NettyTransport.java:906) ~[elasticsearch-2.4.6.jar!/:2.4.6]
at org.elasticsearch.transport.TransportService.connectToNodeLight(TransportService.java:267) ~[elasticsearch-2.4.6.jar!/:2.4.6]
at org.elasticsearch.client.transport.TransportClientNodesService$SimpleNodeSampler.doSample(TransportClientNodesService.java:390) ~[elasticsearch-2.4.6.jar!/:2.4.6]
运行图像的Docker命令:
FROM openjdk:8
ADD target/CryptoAPI-1.0.0.jar CryptoAPI.jar
EXPOSE 80
ENTRYPOINT ["java", "-jar", "CryptoAPI.jar"]
答案 0 :(得分:1)
如果您在docker容器中访问127.0.0.1
- 它会尝试连接到自身(在您的情况下容器中,spring boot尝试访问其9300端口)。容器不知道也不应该了解周围环境 - 这是码头工人的核心原则。
有一些解决方法,请参阅此thread on docker forum。但一般的想法是你不应该尝试从容器内访问主机。
正确的方法是在容器内开始弹性搜索,建立docker网络,并通过名称(docker网络中的域名)在两个容器之间进行通信。