개발자
안녕하세요 백엔드 개발자를 준비중인 대학생입니다. 현재 자바, 스프링부트로, 인텔리제이로 백엔드 개발을 하고 있습니다.(jdk 17) 이번에 프로젝트 중 도커에 대해서 필요성을 느껴 도커를 연결 중에 있습니다. 현재 상황이 db, redis, boot를 docker-compose에 올려서 실행했는데 3개 모두 다 실행은 된 상태입니다.!!!!! db와 boot는 연결이 가능하지만 boot와 redis 연결 중 오류가 뜹니다. 보이는 주 오류는 아래의 2개와 같습니다. org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/127.0.0.1:6379 redis를 직접 실행해보니 localhost로는 정상적으로 실행이 되어 돌아가는데!!!!!!!!!!!!!!! host에 docker-compose에 적은 컨테이너 설정 이름인 redis를 입력하니 위와 같은 오류가 나타납니다.!!!!!!!!! 왜 2번째 오류 문구처럼 Connection refused: localhost/127.0.0.1:6379 라고 뜨는지도 이해가 안가고 구글링을 통해서 계속 찾아봐도 미칠지경까지 와버렸습니다.. 며칠째 이것때매 다른 것을 못하는 상황입니다 ㅜ 아래에 전체적인 코드를 남기겠습니다. 도와주세요!!!!! 제발요... 코드는 redis연결만 문제가 있어 다른 그 부분만 올렸습니다.
1// docker-compose.yml
2version: "3.8"
3
4services:
5 redis:
6 image: redis:latest
7 container_name: redis
8 hostname: redis
9 ports:
10 - 6379:6379
11 volumes:
12 - ./redis/data:/data
13 - ./redis/conf/redis.conf:/usr/local/conf/redis.conf
14 labels:
15 - "name=redis"
16 - "mode=standalone"
17 restart: always
18 command: redis-server /usr/local/conf/redis.conf
19 networks:
20 - network
21
22 backend:
23 build:
24 context: .
25 dockerfile: /build/libs/Dockerfile
26 ports:
27 - 8080:8080
28 environment:
29 - REDIS_HOST=redis
30 - REDIS_PORT=6379
31 links:
32 - redis
33 restart: always
34 networks:
35 - network
36
37networks:
38 network:
39
40------------------------------------------------------
41// application.yml
42
43spring:
44 data:
45 host: ${REDIS_HOST}
46 port: ${REDIS_PORT}
47
48------------------------------------------------------
49//RedisConfig.java
50
51@Configuration
52public class RedisConfig {
53
54 @Value("${spring.redis.host}")
55 private String host;
56
57 @Value("${spring.redis.port}")
58 private int port;
59
60 @Bean
61 public RedisConnectionFactory redisConnectionFactory() {
62 return new LettuceConnectionFactory(host, port);
63 }
64
65-----------------------------------------------
66
67//Dockerfile
68
69FROM openjdk:17
70
71ARG JAR_FILE=/build/libs/*.jar
72
73COPY ${JAR_FILE} app.jar
74
75ENTRYPOINT ["java","-jar","/app.jar"]
76
77-----------------------------------------------
78
79// redis.conf (docker-compose.yml에서 volumes 부분에서 가리키는 /redis/conf/redis.conf:/usr/local/conf/redis.conf 부분)
80
81port 6379
82bind 0.0.0.0
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 03월 27일
현재의 설정을 보면, 스프링 애플리케이션은 redis 서버를 localhost에서 찾고 있습니다. docker-compose에서 Redis 서비스와 스프링 부트 애플리케이션 서비스가 동일한 네트워크를 공유하고 있다는 점을 감안하면, 이 경우 'localhost' 대신 Redis 서비스의 hostname인 'redis'를 사용해야 합니다. 문제가 되는 부분은 application.yml 파일 내용입니다. 여기서 컨테이너 이름인 'redis'를 사용해야 하는데 현재는 환경 변수 REDIS_HOST 값을 가져오지 못하고 있어 생긴 문제로 보입니다. application.yml 파일 내용을 아래와 같이 수정해보세요. ``` spring: redis: host: ${REDIS_HOST:localhost} port: ${REDIS_PORT:6379} ``` 여기서 `:${REDIS_HOST:localhost}`는 만약 REDIS_HOST 환경 변수 값이 없으면 기본값으로 localhost를 사용하겠다는 의미입니다. 비슷하게, `:${REDIS_PORT:6379}`은 REDIS_PORT 환경 변수 값이 없으면 기본값으로 6379를 사용하겠다는 의미입니다. 도커 컨테이너에서 실행되는 경우, 이 값들은 docker-compose 파일에 정의된 것처럼 'redis'과 '6379'가 될 것입니다. 로컬에서 앱을 직접 실행하는 경우(즉, 도커를 사용하지 않는 경우) 이 값들은 'localhost'와 '6379'가 될 것입니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!