개발자
안녕하세요 현재 개인프로젝트를 진행하고있습니다. 문제가 있는데, docker에서 app(springboot) + mysql + redis container를 만들어서 docker-compose.yml로 띄운후 localhost:8080 접속시 <오류 내용> Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/127.0.0.1:6379 Caused by: java.net.ConnectException: Connection refused 이렇게 오류가 발생하는데 자꾸 redis가 localhost로 뜨는데 docker-compose 설정에는 문제가 없어보이는데 한번 봐주시면 감사하겠습니다 1. docker-compose.yml - db 접속정보와 redis 비밀번호는 지우고 코드를 올렸습니다 - redis 비밀번호는 서버에서 확인했습니다. - redis-cli 명령어로 ping-pong 확인했습니다. - app안에 redis와 db(mysql) 같은 네트워크 보고있음 확인했습니다. - 외부 접속 허용하기 위해 redis,.conf 에 bind 0.0.0.0수정 확인했습니다. - 맥 방화벽도 껐습니다. 2. application.properties -redis 설정정보에 ${SPRING_REDIS_PORT:6379} 이렇게 바인딩도 해봤습니다 -db접속 되는지 확인해봤습니다 아래의 코드를 첨부했습니다. 구글 검색과 gpt검색으로 해결방안 전부 시도해봤지만 자꾸 localhost로 뜨니까 진척도 없고 답답합니다... docker를 처음 사용해보는거라 부족한점이 많은데 어떤 부분에 이해도가 필요한지 봐주시면 정말 감사하겠습니다.
11. docker-compose.yml
2
3#컨테이너 관련정보/ Springboot 프로젝트내의 application.yml보다 docker-compose가 우선순위로 배치된다.
4services:
5 db:
6 image: mysql:8.0
7 container_name: db
8 environment:
9 MYSQL_ROOT_PASSWORD:
10 MYSQL_DATABASE: mm
11 MYSQL_USER:
12 MYSQL_PASSWORD:
13 ports:
14 - "3307:3306"
15 volumes:
16 - db-data:/var/lib/mysql
17 networks:
18 - my-network
19
20 app:
21 build:
22 context: .
23 dockerfile: Dockerfile
24 ports:
25 - "8080:8080"
26 environment:
27 SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mm?serverTimezone=Asia/Seoul
28 SPRING_DATASOURCE_USERNAME:
29 SPRING_DATASOURCE_PASSWORD:
30 SPRING_REDIS_HOST: redis
31 SPRING_REDIS_PORT: 6379
32 SPRING_REDIS_PASSWORD: 0000
33 depends_on:
34 - redis
35 - db
36 networks:
37 - my-network
38 platform: linux/amd64
39 container_name: app
40
41 redis:
42 image: redis
43 command: redis-server --port 6379 --requirepass 0000
44 container_name: redis
45 ports:
46 - "6379:6379"
47 networks:
48 - my-network
49
50networks:
51 my-network:
52 name: my-network
53 driver: bridge
54
55volumes:
56 db-data:
57 redis_data:
58
59
60-----------
61
622. application.properties
63
64#application.properties
65spring.application.name=test
66
67#server
68server.port=8080
69server.servlet.context-path=/
70server.servlet.encoding.charset=UTF-8
71server.servlet.encoding.enabled=true
72server.servlet.encoding.force=true
73server.servlet.session.cookie.name=JSEESIONID
74server.servlet.session.cookie.path=/
75server.servlet.session.cookie.timeout=3600
76
77#DB
78spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
79spring.datasource.url=jdbc:mysql://host.docker.internal:3306/mm?serverTimezone=Asia/Seoul
80spring.datasource.username=
81spring.datasource.password=
82
83#Thymeleaf
84spring.thymeleaf.prefix=classpath:/templates/
85spring.thymeleaf.suffix=.html
86spring.thymeleaf.enabled=true
87spring.thymeleaf.cache=false
88spring.devtools.remote.restart.enabled=true
89spring.devtools.livereload.enabled=true
90
91#Mybatis
92mybatis.mapper-locations=classpath:/mapper/**/*.xml
93mybatis.type-aliases-package=com.toyproject.test.domain.model
94
95#redis
96spring.data.redis.host=redis
97spring.data.redis.port=6379
98spring.data.redis.password=
99
100spring.web.resources.cache.cachecontrol.no-store=true
101
102
103----------
104
1053. redis 설정정보
106설정정보에서 docker 실행후 @value("${spring.data.redis.host}") 값이 들어오는것 확인했습니다.
107
108- package com.toyproject.test.web.config;
109
110import lombok.extern.slf4j.Slf4j;
111import org.springframework.beans.factory.annotation.Value;
112import org.springframework.context.annotation.Bean;
113import org.springframework.data.redis.connection.RedisConnectionFactory;
114import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
115import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
116import org.springframework.stereotype.Component;
117
118
119@Component
120@Slf4j
121public class RedisConfiguration {
122
123 @Value("${spring.data.redis.host}")
124 private String host;
125
126 @Value("${spring.data.redis.port}")
127 private int port;
128
129 @Bean
130 public RedisConnectionFactory redisConnectionFactory() {
131 RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(host,port);
132 return new LettuceConnectionFactory(redisStandaloneConfiguration);
133 }
134}
답변 0
첫 답변을 기다리고 있어요.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 10월 11일
주어진 상황을 보면 Docker 에서 Redis 연결접속이 잘못된것 같습니다. Docker를 사용하시면서 발생하는 문제점 중 하나는 컨테이너 내부에서 'localhost' 라는 호스트명을 사용하게 될 때입니다. 도커 환경에서 'localhost' 라는 주소는 컨테이너 자체를 가리킨다는 것입니다. 따라서 현재 spring application이 redis에 연결하려고 localhost를 접속하려 시도하기 때문에 문제가 발생하는 것으로 보여집니다. 해결책은 docker-compose 파일에서 설정한 redis 서비스의 이름을 사용해야 합니다. docker-compose 네트워크 내에서 각 서비스들은 서로의 이름으로 통신할 수 있습니다. 따라서 application.properties 파일 내의 redis host 주소를 다음과 같이 변경해보세요: ```java spring.data.redis.host=redis ``` 기본적으로 Docker Compose는 서비스 이름을 DNS로 사용하여 다른 컨테이너와 통신할 수 있습니다. 여기서 `redis`라고 지정한 것은 실제로 Docker Compose의 서비스 이름입니다. 이를 통해 Spring Boot 애플리케이션은 Redis에 정상적으로 연결할 수 있게됩니다. 추가로 docker-compose와 spring boot 어플리케이션 모두 재시작 해보십시오. 변경사항이 제대로 적용되었는지 확인하려면 도커 컨테이너 모두 재시작 해야할 수 있습니다. 특히 처음 Docker를 사용하실 때에는 이러한 네트워크 연결 문제가 종종 발생할 수 있어서, 서비스간의 연결 설정을 철저히 확인하는 것이 중요합니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!