java - Connection 拒绝从 docker 连接到 Elasticsearch docker 容器
问题描述
我正在尝试从容器内的 Java 应用程序访问容器内的 Elasticsearch 数据库。
它们都在以下 docker-compose.yml 中:
version: "3.7"
services:
es:
image: docker.elastic.co/elasticsearch/elasticsearch:7.6.1
ports:
- "9200:9200"
- "9300:9300"
networks:
- elastic
java-app:
image: neileen/dockerhub_app:java-latest
ports:
- "8080:8080"
depends_on:
- es
networks:
- elastic
networks:
elastic:
driver: bridge
如您所见,我使用桥接网络使容器彼此可见和可访问。
在我的 Java 应用程序中,我使用 RestHighLevelClient:
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("es", 9200, "http")));
我还尝试使用“localhost”和“0.0.0.0”作为主机名而不是“es”,但没有结果。
我不断得到的例外是:
java-app_1 | The cluster is unhealthy: Connection refused
java-app_1 | java.net.ConnectException: Connection refused
java-app_1 | at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:804)
java-app_1 | at org.elasticsearch.client.RestClient.performRequest(RestClient.java:225)
java-app_1 | at org.elasticsearch.client.RestClient.performRequest(RestClient.java:212)
我知道这是与端口 9200 在 java-app 容器中不可见有关的问题,但我不知道问题出在哪里,因为我已经提供了自定义网络并将容器名称用作主机名。
笔记
ES 可以通过“ http://localhost:9200 ”访问
先感谢您。
解决方案
Elasticsearch 在启动时会进行一些引导检查。如果你想在 Docker 中作为单个节点启动它,你需要禁用这些,否则它不会打开 TCP/IP 端口。
这可以通过指定环境参数来完成:discovery.type=single-node。
services:
es:
image: docker.elastic.co/elasticsearch/elasticsearch:7.6.1
ports:
- "9200:9200"
- "9300:9300"
environment:
- discovery.type=single-node
推荐阅读
- google-apps-script - 可以将 Google Sheet 数据插入到 Google Doc 脚本中吗?
- ios - ScrollView 中的内容视图未正确呈现
- javascript - 用于 Observable 的 GroupBy RxJs
- javascript - 每次刷新页面时,我可以将json数据存储在数组中吗
- java - 为什么内部循环范围会在解决此问题的方式上有所不同?
- git - 使用换行间距格式化 git diff
- oracle - 如何从存储过程返回的游标将数据插入临时表
- c++ - 从 std::string 的两端删除子字符串?
- asp.net-mvc - 已发布应用程序出错但不是本地编译器错误消息:CS0012:
- r - 结合 R 中 geom_dotplot() 创建的三个不同的图?