Spring boot 无法连接到Redis;嵌套异常为io.莴苣.core.RedisConnectionException:

Spring boot 无法连接到Redis;嵌套异常为io.莴苣.core.RedisConnectionException:,spring-boot,docker,redis,docker-compose,dockerfile,Spring Boot,Docker,Redis,Docker Compose,Dockerfile,我是docker的新手,我正在尝试在容器上运行redis服务器和springboot应用程序 当我在本地启动springboot应用程序时,我可以点击redis(存在于docker容器中),但当我将这个springboot应用程序也放在docker容器中时,我无法连接到redis并获取数据 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request proc

我是docker的新手,我正在尝试在容器上运行redis服务器和springboot应用程序

当我在本地启动springboot应用程序时,我可以点击redis(存在于docker容器中),但当我将这个springboot应用程序也放在docker容器中时,我无法连接到redis并获取数据

 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 0.0.0.0:6397] with root cause
urlshortner |
urlshortner | java.net.ConnectException: Connection refused
urlshortner |   at java.base/sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[na:na]
urlshortner |   at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:779) ~[na:na]
urlshortner |   at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:330) ~[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:334) ~[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:702) ~[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650) ~[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576) ~[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) ~[netty-transport-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-common-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.45.Final.jar!/:4.1.45.Final]
urlshortner |   at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
我尝试过以下方法:

  • 使用docker compose将它们连接到同一网络
  • 我的码头工人

    dockerfile启动springboot应用程序

    用于运行redis的dockerfile

  • 注释掉bind127.0.0.1,并在redis.conf中添加了bind0.0.0
  • 但仍然得到相同的错误

    java应用程序中的我的redis配置

    我还尝试将spring.redis.host从localhost更改为0.0.0.0和127.0.0.1

    所以当我从邮递员那里找到它时,我得到了错误


    如何解决此问题,非常感谢您的帮助,谢谢

    我更改了以下内容,使其工作正常

    spring.redis.host=localhost
    

    在application.properties中 及


    在docker compose for redis中,docker中的localhost通常表示“此容器”(0.0.0.0表示“无处不在”;将其用于出站连接没有意义)。您可以在Docker文档中查看哪些主机名可用于在容器之间建立连接。@DavidMaze我同意,我尝试过这样做,因为我们在redis.conf中绑定了0.0.0.0,我会检查这个,谢谢
    FROM adoptopenjdk/openjdk11
    VOLUME /urlshortner
    ARG JAR_FILE=target/Urlshortning-0.0.1-SNAPSHOT.jar
    ADD ${JAR_FILE} urlshortning.jar
    EXPOSE 10095
    ENTRYPOINT ["java", "-jar", "/urlshortning.jar"]
    
    FROM redis
    COPY redis.conf /redis/redis.conf
    CMD [ "redis-server", "/redis/redis.conf" ]
    
    @Configuration
    public class RedisConfig {
    
        private final String url;
        private final int port;
        private final String password;
    
        @Autowired
        private ObjectMapper objectMapper;
    
        public RedisConfig(@Value("${spring.redis.host}") String url, @Value("${spring.redis.port}") int port,
                @Value("${spring.redis.password}") String password) {
            this.url = url;
            this.port = port;
            this.password = password;
        }
    
        /**
         * Redis configuration
         *
         * @return redisStandaloneConfiguration
         */
        @Bean
        public RedisStandaloneConfiguration redisStandaloneConfiguration() {
            RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(url, port);
            redisStandaloneConfiguration.setPassword(password);
            return redisStandaloneConfiguration;
        }
    
        /**
         * Client Options Reject requests when redis is in disconnected state and Redis
         * will retry to connect automatically when redis server is down
         *
         * @return client options
         */
        @Bean
        public ClientOptions clientOptions() {
            return ClientOptions.builder().disconnectedBehavior(ClientOptions.DisconnectedBehavior.REJECT_COMMANDS)
                    .autoReconnect(true).build();
        }
    
        /**
         * Create a LettuceConnection with redis configurations and client options
         *
         * @param redisStandaloneConfiguration redisStandaloneConfiguration
         * @return RedisConnectionFactory
         */
        @Bean
        public RedisConnectionFactory connectionFactory(RedisStandaloneConfiguration redisStandaloneConfiguration) {
    
            LettuceClientConfiguration configuration = LettuceClientConfiguration.builder().clientOptions(clientOptions())
                    .build();
    
            return new LettuceConnectionFactory(redisStandaloneConfiguration, configuration);
        }
    
        // Setting up the redis template object.
        @SuppressWarnings({ "rawtypes", "unchecked" })
        @Bean
        @ConditionalOnMissingBean(name = "redisTemplate")
        @Primary
        public RedisTemplate<String, Url> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Url.class);
            jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
    
            RedisTemplate<String, Url> redisTemplate = new RedisTemplate<>();
            redisTemplate.setConnectionFactory(redisConnectionFactory);
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
            return redisTemplate;
        }
    }
    
    server.port=10095
    redis.ttl=86400
    
    spring.redis.host=localhost
    spring.redis.port=6379
    spring.redis.password=redisdb
    
    
    spring.redis.host=localhost
    
    spring.redis.host=redis
    
    hostname: localhost
    
    hostname: redis