【问题标题】:docker-compose with springboot and redisdocker-compose 与 springboot 和 redis
【发布时间】:2021-03-02 12:55:20
【问题描述】:

我正在尝试使用docker compose 将一个简单的springboot 应用程序与redis 连接起来。但是,我不断收到以下错误。

    java-service_1  | 2020-11-20 10:30:54.053 ERROR 1 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool] with root cause
java-service_1  | 
java-service_1  | java.net.ConnectException: Connection refused (Connection refused)
java-service_1  |       at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_252]
java-service_1  |       at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_252]
java-service_1  |       at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_252]
java-service_1  |       at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_252]
java-service_1  |       at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_252]
java-service_1  |       at java.net.Socket.connect(Socket.java:607) ~[na:1.8.0_252]
java-service_1  |       at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:53) ~[jedis-3.3.0.jar!/:na]
java-service_1  |       at redis.clients.jedis.Connection.connect(Connection.java:158) ~[jedis-3.3.0.jar!/:na]
java-service_1  |       at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:109) ~[jedis-3.3.0.jar!/:na]

配置

@Bean
public RedisStandaloneConfiguration redisStandaloneConfiguration() {
    System.out.println("connecting with redis");
    RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration("redis", 6379);
    return redisStandaloneConfiguration;
}

@Bean
public ClientOptions clientOptions() {
    return ClientOptions.builder()
            .disconnectedBehavior(ClientOptions.DisconnectedBehavior.REJECT_COMMANDS)
            .autoReconnect(true)
            .build();
}

@Bean
public RedisConnectionFactory connectionFactory(RedisStandaloneConfiguration redisStandaloneConfiguration) {

    LettuceClientConfiguration configuration = LettuceClientConfiguration.builder()
            .clientOptions(clientOptions()).build();

    return new LettuceConnectionFactory(redisStandaloneConfiguration, configuration);
}

@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
@Primary
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    StringRedisTemplate template = new StringRedisTemplate();
    template.setConnectionFactory(redisConnectionFactory);
    return template;
}

docker-compose.yml

版本:'3' 服务: redis服务器: 容器名称:redis 图片:'redis' 端口: - “6379:6379” java服务: 建造: 。 链接: - redis 服务器 端口: - “8080:8080”

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    我认为出现问题是因为您的应用程序无法连接到数据库,因为

    RedisStandaloneConfiguration redisStandaloneConfiguration 
                                        = new RedisStandaloneConfiguration("redis", 6379);
    

    现在,您使用redis 作为主机名,这是不正确的。您应该使用容器名称作为主机,并确保两个容器位于同一网络上。

    为了让它工作,你可以这样做:

    docker-compose.yml

    version: '3'
    services:
      redis-server:
        container_name: redis
        image: 'redis'
        ports:
          - "6379:6379"
      java-service:
        build: .
        links:
          - redis-server
        ports:
          - "8080:8080"
    

    现在同一网络上的其他容器将能够使用 redis 作为主机名与 redis 通信。

    如果您不想设置修复容器名称,请使用主机名属性,例如:

    docker-compose.yml

    version: '3'
    services:
      redis-server:
        hostname: redis
        image: 'redis'
        ports:
          - "6379:6379"
      java-service:
        build: .
        links:
          - redis-server
        ports:
          - "8080:8080"
    

    【讨论】:

    • 我仍然得到相同的响应。用完整的错误和修改的配置编辑了问题。
    • @user3310115 你能检查一下 redis 是否正常运行,即你能把 redis-client 连接到你的 redis-server 吗?
    • 是的,我可以访问 redis-cli。
    • @user3310115 好的。尝试单独启动服务,但在附加模式下,然后检查日志是否有故障或错误。找到后在此处发布。
    • 其实这是一个愚蠢的错误。我没有重建我的springboot jar。我的初始配置本身有效。一旦我做了一个 mvn clean install,docker 用正确的服务器名称复制了新的 jar,它工作正常。