Docker Compose部署后Spring Boot无法连接Elasticsearch容器求助
Spring Boot Docker化后无法连接Elasticsearch容器
本地运行Spring Boot后端时,通过http://localhost:9200可正常连接Elasticsearch容器,但项目Docker化后,后端无法连接该容器,Elasticsearch容器运行状态正常。以下是我的docker-compose.yml配置及报错信息:
docker-compose.yml配置
version: '1' services: db: image: mysql:latest container_name: db environment: - MYSQL_DATABASE=hiretalent - MYSQL_ROOT_PASSWORD=root - MYSQL_USER=admin - MYSQL_PASSWORD=root - MYSQL_PORT=3306 volumes: - /hiretalent-data:/var/lib/mysql networks: - mynet elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.17.12 container_name: elasticsearch ports: - 9200:9200 - 9300:9300 environment: - discovery.type=single-node - xpack.security.enabled=false - bootstrap.memory_lock=true networks: - mynet backend: container_name: hiretalent-backend build: context: ./backend/hiretalent dockerfile: Dockerfile restart: on-failure depends_on: - db - selenium - elasticsearch environment: - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/hiretalent?createDatabaseIfNotExist=true&autoReconnect=true - SPRING_DATASOURCE_USERNAME=admin - SPRING_DATASOURCE_PASSWORD=root - SPRING_DATA_ELASTICSEARCH_CLUSTER_NODES=elasticsearch:9200 networks: - mynet ports: - 8080:8080 networks: mynet: driver: bridge
报错堆栈信息
backend | Caused by: org.springframework.dao.DataAccessResourceFailureException: Connection refused backend | at org.springframework.data.elasticsearch.client.elc.ElasticsearchExceptionTranslator.translateExceptionIfPossible(ElasticsearchExceptionTranslator.java:107) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1] backend | at org.springframework.data.elasticsearch.client.elc.ElasticsearchExceptionTranslator.translateException(ElasticsearchExceptionTranslator.java:63) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1] backend | at org.springframework.data.elasticsearch.client.elc.ChildTemplate.execute(ChildTemplate.java:73) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1] backend | at org.springframework.data.elasticsearch.client.elc.IndicesTemplate.doExists(IndicesTemplate.java:177) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1] backend | at org.springframework.data.elasticsearch.client.elc.IndicesTemplate.exists(IndicesTemplate.java:169) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1] backend | at org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository.<init>(SimpleElasticsearchRepository.java:83) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1] backend | at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na] backend | at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[na:na] backend | at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na] backend | at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[na:na] backend | at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[na:na] backend | at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:211) ~[spring-beans-6.0.10.jar!/:6.0.10] backend | ... 128 common frames omitted backend | Caused by: java.lang.RuntimeException: Connection refused backend | at org.springframework.data.elasticsearch.client.elc.ElasticsearchExceptionTranslator.translateException(ElasticsearchExceptionTranslator.java:62) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1] backend | ... 138 common frames omitted backend | Caused by: java.net.ConnectException: Connection refused backend | at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:930) ~[elasticsearch-rest-client-8.7.1.jar!/:8.7.1] backend | at org.elasticsearch.client.RestClient.performRequest(RestClient.java:300) ~[elasticsearch-rest-client-8.7.1.jar!/:8.7.1] backend | at org.elasticsearch.client.RestClient.performRequest(RestClient.java:288) ~[elasticsearch-rest-client-8.7.1.jar!/:8.7.1] backend | at co.elastic.clients.transport.rest_client.RestClientTransport.performRequest(RestClientTransport.java:153) ~[elasticsearch-java-8.7.1.jar!/:na] backend | at co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient.exists(ElasticsearchIndicesClient.java:620) ~[elasticsearch-java-8.7.1.jar!/:na] backend | at org.springframework.data.elasticsearch.client.elc.IndicesTemplate.lambda$doExists$2(IndicesTemplate.java:177) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1] backend | at org.springframework.data.elasticsearch.client.elc.ChildTemplate.execute(ChildTemplate.java:71) ~[spring-data-elasticsearch-5.1.1.jar!/:5.1.1] backend | ... 137 common frames omitted backend | Caused by: java.net.ConnectException: Connection refused backend | at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na] backend | at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[na:na] backend | at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:946) ~[na:na] backend | at org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor.processEvent(DefaultConnectingIOReactor.java:174) ~[httpcore-nio-4.4.16.jar!/:4.4.16] backend | at org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor.processEvents(DefaultConnectingIOReactor.java:148) ~[httpcore-nio-4.4.16.jar!/:4.4.16] backend | at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor.execute(AbstractMultiworkerIOReactor.java:351) ~[httpcore-nio-4.4.16.jar!/:4.4.16] backend | at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.execute(PoolingNHttpClientConnectionManager.java:221) ~[httpasyncclient-4.1.5.jar!/:4.1.5] backend | at org.apache.http.impl.nio.client.CloseableHttpAsyncClientBase$1.run(CloseableHttpAsyncClientBase.java:64) ~[httpasyncclient-4.1.5.jar!/:4.1.5] backend | at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
问题排查与解决方案
1. 版本兼容性问题
你的Spring Data Elasticsearch版本是5.1.1(对应Elasticsearch客户端8.7.1),但使用的Elasticsearch容器版本是7.17.12,跨大版本存在兼容性问题,这是核心原因之一。
- 解决:将Elasticsearch容器版本升级到8.7.x,或者将Spring Data Elasticsearch降级到对应7.17.x的版本(Spring Data Elasticsearch 4.4.x对应ES 7.17)。
2. depends_on仅保证启动顺序,不保证服务就绪
depends_on只是让backend在elasticsearch之后启动,但Elasticsearch启动需要时间加载数据和初始化,此时backend尝试连接会失败。
- 解决:
- 添加健康检查到elasticsearch服务,让docker-compose确认ES就绪后再启动backend:
elasticsearch: # 其他配置不变 healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:9200/_cluster/health || exit 1"] interval: 30s timeout: 10s retries: 3 - 在backend的
depends_on中依赖elasticsearch的健康状态:backend: # 其他配置不变 depends_on: elasticsearch: condition: service_healthy
- 添加健康检查到elasticsearch服务,让docker-compose确认ES就绪后再启动backend:
3. 确认Spring配置项有效性
原配置SPRING_DATA_ELASTICSEARCH_CLUSTER_NODES是旧版本配置项,Spring Data Elasticsearch 5.x已改用新配置项:
- 在docker-compose的backend环境变量中替换为:
- SPRING_DATA_ELASTICSEARCH_CLIENT_REST_ENDPOINTS=elasticsearch:9200
4. 网络连通性验证
进入backend容器,执行以下命令确认网络连通:
ping elasticsearch:验证域名解析是否正常curl http://elasticsearch:9200:验证ES服务是否可访问
内容的提问来源于stack exchange,提问作者coderoffuture
相关产品推荐
相关产品推荐

