Docker Compose中Spring Boot容器无法连接Redis容器问题求助
Spring Boot容器化后无法连接Redis的问题排查
问题描述
所有容器处于同一网络,可通过redis-cli连接redisContainer;本地IDE启动Spring Boot应用能正常连接Redis,但容器化启动时仅收到连接拒绝错误。已确认Spring Boot应用能正确获取Compose文件中的环境变量,尝试过移除Redis容器的hosts配置、将后端容器的REDIS_HOST设为localhost,均无效。
相关配置
Docker Compose配置
version: '3.8' services: db: image: postgres:latest container_name: postgresql_container environment: POSTGRES_DB: insight POSTGRES_USER: admin POSTGRES_PASSWORD: admin ports: - "15432:5432" volumes: - postgres_data:/var/lib/postgresql/data restart: always redis: image: redis:latest container_name: redisContainer ports: - "6379:6379" backend: build: . container_name: backendContainer ports: - "8081:8082" environment: REDIS_PORT: 6379 REDIS_HOST: redis SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/insight SPRING_DATASOURCE_USERNAME: admin SPRING_DATASOURCE_PASSWORD: admin depends_on: - db restart: always volumes: postgres_data:
application.yaml配置
spring: datasource: driver-class-name: org.postgresql.Driver url: ${SPRING_DATASOURCE_URL} username: ${SPRING_DATASOURCE_USERNAME} password: ${SPRING_DATASOURCE_PASSWORD} jpa: show-sql: true hibernate: ddl-auto: update database-platform: org.hibernate.dialect.PostgreSQLDialect redis: host: ${REDIS_HOST} port: ${REDIS_PORT} server: port: 8082 logging: level: org.springframework.data.redis: DEBUG
错误日志
2024-12-23 18:36:48 2024-12-23T15:36:48.226Z ERROR 1 --- [nio-8082-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis] with root cause 2024-12-23 18:36:48 2024-12-23 18:36:48 java.net.ConnectException: Connection refused 2024-12-23 18:36:48 at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na] 2024-12-23 18:36:48 at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[na:na] 2024-12-23 18:36:48 at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:946) ~[na:na] 2024-12-23 18:36:48 at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:336) ~[netty-transport-4.1.114.Final.jar!/:4.1.114.Final] 2024-12-23 18:36:48 at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:339) ~[netty-transport-4.1.114.Final.jar!/:4.1.114.Final] 2024-12-23 18:36:48 at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:776) ~[netty-transport-4.1.114.Final.jar!/:4.1.114.Final] 2024-12-23 18:36:48 at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) ~[netty-transport-4.1.114.Final.jar!/:4.1.114.Final] 2024-12-23 18:36:48 at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) ~[netty-transport-4.1.114.Final.jar!/:4.1.114.Final] 2024-12-23 18:36:48 at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) ~[netty-transport-4.1.114.Final.jar!/:4.1.114.Final] 2024-12-23 18:36:48 at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.114.Final.jar!/:4.1.114.Final] 2024-12-23 18:36:48 at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.114.Final.jar!/:4.1.114.Final] 2024-12-23 18:36:48 at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.114.Final.jar!/:4.1.114.Final] 2024-12-23 18:36:48 at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na] 2024-12-23 18:36:48
Redis相关依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
排查与解决建议
- 确保Redis服务完全就绪:
depends_on仅保证容器启动顺序,不确保服务可用。可以给redis服务添加健康检查,或者在backend启动脚本中加入等待逻辑(如使用wait-for-it.sh redis:6379 -- java -jar app.jar) - 修改Redis绑定地址:默认Redis可能仅绑定
127.0.0.1,导致容器间无法访问。在docker-compose的redis服务中添加command: redis-server --bind 0.0.0.0 - 测试容器间连通性:进入backend容器,执行
ping redis确认DNS解析正常,执行telnet redis 6379或nc -zv redis 6379确认端口开放 - 验证环境变量:在backend容器内执行
echo $REDIS_HOST和echo $REDIS_PORT,确认变量值正确注入 - 检查配置优先级:确认没有系统属性、命令行参数等覆盖application.yaml中的Redis配置
- 查看Redis日志:执行
docker logs redisContainer,确认Redis启动日志中没有绑定地址错误或其他异常信息
内容的提问来源于stack exchange,提问作者Sergey Lagutin
相关产品推荐
相关产品推荐

