Spring Boot Redis 使用 Redis 时出现连接被拒绝异常

Posted

技术标签:

【中文标题】Spring Boot Redis 使用 Redis 时出现连接被拒绝异常【英文标题】:Spring Boot Redis getting connection refused exception when using Redis 【发布时间】:2019-01-20 12:06:19 【问题描述】:

我有一个小型应用程序,我使用 redis 进行缓存和 Spring Boot。应用程序在本地成功运行,但是当我尝试对其进行 dockerize 时,我收到连接拒绝异常。

这是我的 docker-compose.yml 文件:

version: '3.5'

services:
  my-application:
    image: my-application:latest
    container_name: my-application
    ports:
      - 8080:8080
    hostname: my-application

  redis:
    image: redis
    command: [ "redis-server", "--protected-mode", "no" ]
    volumes:
      - ./data:/data
    ports:
      - 6379:6379   

Dockerfile:

FROM openjdk:7

VOLUME /tmp

ADD my-application-0.0.1.jar my-application-0.0.1.jar

EXPOSE 8080

ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "my-application-0.0.1.jar"]

当我查看 docker 控制台时,我看到 redis 以独立模式启动

我错过了什么?

谢谢

【问题讨论】:

【参考方案1】:

你必须设置:

server.address=0.0.0.0

在您的application.properties 中。如果您的应用程序正在侦听容器中的 127.0.0.1,您将无法从主机访问它。

【讨论】:

【参考方案2】:

需要将redis主机改成docker compose文件中redis配置的名称,本例为-redis

可以通过两种方式配置:

更改属性文件spring.redis.host=redis 在手动配置中设置主机(redis 或 jedis)redisStandaloneConfiguration.setHostName("redis");

另外,就我而言,我没有在我的 docker 文件中使用卷,所以要使用新的 jar 文件,您需要执行启动 docker compose 的所有 3 个步骤(除了在 gradle 中进行干净构建或干净安装在 Maven 中):

docker-compose down docker-compose 构建 码头工人组成

我希望这对某人有用! :)

【讨论】:

【参考方案3】:

我遇到了同样的问题并用 (docker-compose.yml) 修复了

 cache:
    image: redis
    ...
    ports:
      - 6379:6379  

然后在 application.properties spring.redis.host=cache

最终

@Value("$spring.redis.host")
String redisHost
...
redisStandaloneConfiguration.setHostName(redisHost);

我认为,在 docker 网络中,具有相同图像名称的服务名称会导致问题并以 docker 无法创建与 redis 主机的连接而告终。

【讨论】:

以上是关于Spring Boot Redis 使用 Redis 时出现连接被拒绝异常的主要内容,如果未能解决你的问题,请参考以下文章

聊聊spring-boot-starter-data-redis的配置变更

如何基于 Spring Boot 框架配置 JedisConnectionFactory 的超时时间

springboot高级特性-redis作为缓存

spring boot:Spring Boot中Redis的使用

Spring boot在Spring boot中Redis的使用

spring-boot-data-redis,使用redisson作为redis客户端