Docker化Java应用连接Elasticsearch被拒绝请求助
问题描述
我有一个向Elasticsearch发送日志的Java应用,部署时遇到如下错误:
08:20:39.498 [main] INFO c.e.E.ElasticsearchExampleApplication - Starting ElasticsearchExampleApplication v0.0.1-SNAPSHOT using Java 1.8.0_362 on 1291d5986694 with PID 8 (/app/ElasticsearchExample-0.0.1-SNAPSHOT.jar started by root in /app) 08:20:39.501 [main] INFO c.e.E.ElasticsearchExampleApplication - No active profile set, falling back to 1 default profile: "default" 08:20:39,751 |-WARN in ch.qos.logback.core.rolling.RollingFileAppender[null] - Attempted to append to non started appender [null]. 08:20:39,751 |-WARN in ch.qos.logback.core.rolling.RollingFileAppender[null] - Attempted to append to non started appender [null]. 08:20:39,751 |-WARN in ch.qos.logback.core.rolling.RollingFileAppender[null] - Attempted to append to non started appender [null]. 08:20:39.762 [es-writer-1] WARN es-error-logger - Failed to send events to Elasticsearch: Connection refused (Connection refused) 08:20:39,762 |-WARN in com.internetitem.logback.elasticsearch.util.ErrorReporter@37e20cce - Failed to send events to Elasticsearch: Connection refused (Connection refused) 08:20:40.013 [es-writer-1] WARN es-error-logger - Failed to send events to Elasticsearch: Connection refused (Connection refused) 08:20:40,013 |-WARN in com.internetitem.logback.elasticsearch.util.ErrorReporter@37e20cce - Failed to send events to Elasticsearch: Connection refused (Connection refused) 08:20:40.013 [main] INFO c.e.E.ElasticsearchExampleApplication - Started ElasticsearchExampleApplication in 0.899 seconds (JVM running for 1.393) Strating 08:20:40.016 [main] INFO c.e.E.ElasticsearchExampleApplication - exiting the application 08:20:40.264 [es-writer-1] WARN es-error-logger - Failed to send events to Elasticsearch: Connection refused (Connection refused) 08:20:40,264 |-WARN in com.internetitem.logback.elasticsearch.util.ErrorReporter@37e20cce - Failed to send events to Elasticsearch: Connection refused (Connection refused) 08:20:40.515 [es-writer-1] WARN es-error-logger - Failed to send events to Elasticsearch: Connection refused (Connection refused) 08:20:40,516 |-WARN in com.internetitem.logback.elasticsearch.util.ErrorReporter@37e20cce - Failed to send events to Elasticsearch: Connection refused (Connection refused) 08:20:40.767 [es-writer-1] WARN es-error-logger - Failed to send events to Elasticsearch: Connection refused (Connection refused) 08:20:40,767 |-WARN in com.internetitem.logback.elasticsearch.util.ErrorReporter@37e20cce - Failed to send events to Elasticsearch: Connection refused (Connection refused)
Elasticsearch、Kibana和Java应用均以Docker容器化方式运行,相关配置文件如下:
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.11</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>ElasticsearchExample</artifactId> <version>0.0.1-SNAPSHOT</version> <name>ElasticsearchExample</name> <description>Demo project for Spring Boot</description> <properties> <java.version>8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.internetitem</groupId> <artifactId>logback-elasticsearch-appender</artifactId> <version>1.6</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="true" scan="true"> <!-- when the profile is not local, below appender will be applied --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</pattern> </encoder> </appender> <appender name="ELASTIC" class="com.internetitem.logback.elasticsearch.ElasticsearchAppender"> <url>localhost:9200/_bulk</url> <index>demo-%date{yyyy-MM-dd}</index> <type>tester</type> <loggerName>es-logger</loggerName> <!-- optional --> <errorLoggerName>es-error-logger</errorLoggerName> <!-- optional --> <connectTimeout>30000</connectTimeout> <!-- optional (in ms, default 30000) --> <errorsToStderr>false</errorsToStderr> <!-- optional (default false) --> <includeCallerData>false</includeCallerData> <!-- optional (default false) --> <logsToStderr>false</logsToStderr> <!-- optional (default false) --> <maxQueueSize>104857600</maxQueueSize> <!-- optional (default 104857600) --> <maxRetries>3</maxRetries> <!-- optional (default 3) --> <readTimeout>30000</readTimeout> <!-- optional (in ms, default 30000) --> <sleepTime>250</sleepTime> <!-- optional (in ms, default 250) --> <rawJsonMessage>false</rawJsonMessage> <!-- optional (default false) --> <includeMdc>false</includeMdc> <!-- optional (default false) --> <maxMessageSize>100</maxMessageSize> <!-- optional (default -1 --> <authentication class="com.internetitem.logback.elasticsearch.config.BasicAuthentication" /> <!-- optional --> <properties> <property> <name>host</name> <value>${HOSTNAME}</value> <allowEmpty>false</allowEmpty> </property> <property> <name>severity</name> <value>%level</value> </property> <property> <name>thread</name> <value>%thread</value> </property> <property> <name>stacktrace</name> <value>%ex</value> </property> <property> <name>logger</name> <value>%logger</value> </property> </properties> <headers> <header> <name>Content-Type</name> <value>application/json</value> </header> </headers> </appender> <!-- We don't want to see a never ending cascade of connection failed ERRORS --> <!-- <logger name="my-error-logger" level="OFF" /> --> <logger name="es-logger" level="INFO" additivity="false"> <appender name="ES_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <encoder> <pattern>%msg</pattern> <!-- This pattern is important, otherwise it won't be the raw Elasticsearch format anymore --> </encoder> </appender> </logger> <root level="info"> <appender-ref ref="CONSOLE" /> <appender-ref ref="ELASTIC" /> </root> </configuration>
docker-compose.yaml
version: '3' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1 #image: docker.elastic.co/elasticsearch/elasticsearch:5.6.16 #image: docker.elastic.co/elasticsearch/elasticsearch:5.6.0 container_name: my-elasticsearch environment: - discovery.type=single-node ports: - "9200:9200" - "9300:9300" networks: core: kibana: image: docker.elastic.co/kibana/kibana:7.12.1 #image: docker.elastic.co/kibana/kibana:5.6.16 #image: yuzu/docker-kibana:v5.0 container_name: my-kibana depends_on: - elasticsearch ports: - "5601:5601" networks: core: my-java-app: image: my-java-app:latest container_name: my-java-app ports: - "8080:8080" volumes: - ./logs:/app/logs environment: - JAVA_OPTS=-Xmx512m -Dspring.profiles.active=prod networks: core: networks: core:
解决方案
针对你遇到的两个核心问题,分别给出修复步骤:
1. 解决Elasticsearch连接拒绝问题
在Docker Compose的同一网络中,容器的localhost指向自身,无法通过它访问其他服务。需要修改logback.xml中的Elasticsearch地址:
- 将
<url>localhost:9200/_bulk</url>改为<url>http://elasticsearch:9200/_bulk</url>
这里的elasticsearch是docker-compose.yaml中Elasticsearch服务的名称,Docker会自动解析这个名称到对应容器的IP。
2. 解决RollingFileAppender未启动警告
logback.xml中定义的ES_FILE appender缺少文件路径和滚动策略配置,导致无法初始化。修改如下:
<logger name="es-logger" level="INFO" additivity="false"> <appender name="ES_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/app/logs/es-logs.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>/app/logs/es-logs.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>%msg</pattern> </encoder> </appender> </logger>
配置的文件路径和docker-compose中挂载的日志目录对应,同时添加了基于大小和时间的滚动策略,确保appender能正常启动。
额外优化建议
- 确保Elasticsearch服务就绪后再启动Java应用:给docker-compose.yaml的Elasticsearch服务添加健康检查
elasticsearch: # ... 原有配置 healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:9200/_cluster/health || exit 1"] interval: 10s timeout: 10s retries: 5
- 修改Java应用的启动依赖,等待Elasticsearch健康检查通过
my-java-app: # ... 原有配置 depends_on: elasticsearch: condition: service_healthy
内容的提问来源于stack exchange,提问作者cokachi
相关产品推荐
相关产品推荐

