개발자

docker-compose를 통해 redis와 boot연결 중 생기는 오류

2024년 03월 27일조회 513

안녕하세요 백엔드 개발자를 준비중인 대학생입니다. 현재 자바, 스프링부트로, 인텔리제이로 백엔드 개발을 하고 있습니다.(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
이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 3

profile picture

익명

작성자

2024년 03월 27일

화면 상에는 들여쓰기가 제대로 했으니 보이는 것은 이상하게 보이는데 들여쓰기 문제는 없습니다!!

profile picture

익명

작성자

2024년 03월 27일

아 그리고 지금 수정이 안되는데... yml 부분에 data가 아니라 redis입니다!

문석님의 프로필 사진

해결하셨나요?

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 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'가 될 것입니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!