I am trying to connect to Redis from docker running app but some how getting a connection refuse problem. But when I run the same app on the host(without docker) and Redis server still running in the docker, connection works.
Here is my docker-compose File:
services:
spond-weather-app:
build: ../
container_name: weather-app
depends_on:
- redis-server
volumes:
- /Users/ss/Documents/docker-logs:/usr/local/tomcat/logs
environment:
- SPRING_PROFILES_ACTIVE=dev
- JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000
- SPRING_REDIS_HOST=redis-server
- SPRING_REDIS_PORT=6379
ports:
- "8080:8080"
restart: always
networks:
- redis_app_net
redis-server:
container_name: redis-server
image: redis:6.2-alpine
restart: always
ports:
- '6379:6379'
command: redis-server --save 60 1 --loglevel warning
volumes:
- ./data:/data
networks:
- redis_app_net
networks:
redis_app_net:
driver: bridge
Springboot application.propertiese:
server.port=8080
spring.data.redis.host=redis-server
spring.data.redis.port=6379
spring.cache.type=redis
spring.redis.connection-timeout=5000
spring.redis.timeout=5000
redis.cache.ttl.in.hours=2
Redis connection java class:
@Configuration
@EnableCaching
public class cacheConfig {
private static final Logger logger = LoggerFactory.getLogger(WeatherCacheConfig.class);
/*
@Value("${spring.data.redis.host}")
private String redisHost;
@Value("${spring.data.redis.port}")
private int redisPort;
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.disableCachingNullValues()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));
return RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(cacheConfiguration)
.transactionAware()
.build();
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
.commandTimeout(Duration.ofSeconds(2))
.shutdownTimeout(Duration.ZERO)
.build();
// logger.info("Redis Host:***{}, Redis Port:{} ", redisHost, redisPort);
// RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration(redisHost, redisPort);
return new LettuceConnectionFactory(new RedisStandaloneConfiguration(), clientConfig);
}
}
Here is the error which I can see on the docker log console:
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 localhost/<unresolved>:6379] with root cause
2024-08-17 11:28:38
2024-08-17 11:28:38 java.net.ConnectException: Connection refused