로컬 redis에 docker 컨테이너 연결하기

213kky·2024년 12월 2일

개요

프로젝트 진행 중 Redis를 활용할 필요성이 생겼고, AWS EC2에 Redis를 설치한 후 Spring 애플리케이션을 Docker 컨테이너에 배포하여 Redis와 연결하려 했다.

하지만 Docker에서 실행 중인 Spring 애플리케이션과 EC2에 설치된 Redis를 연결하는 과정에서 여러 가지 문제가 발생했고 생각보다 과정이 험난했기 때문에 다시 설정할 일이 있을 때 찾아보기 위해, 그리고 복습도 할 겸 이에 대한 해결 과정을 정리하려한다...

Redis는 Spring과는 달리 지속적으로 바뀌는 부분이 없다고 생각해서 컨테이너에서 실행할 필요성을 크게 느끼지 못했다. Docker를 사용하기 보다 EC2에 로컬로 설치하여 운영하는 것이 더 효율적이라고 생각하여 로컬에 설치하였다.

redis 설치

sudo apt-get update
sudo apt-get install redis-server

Redis 설정 변경

아래의 명령어로 redis 설정파일에서 IP 접근을 수정할 수 있다

sudo vi /etc/redis/redis.conf


IP 접근 허용


bind 부분에서
bind 0.0.0.0 ::1 (전체 접근 가능)로 변경하거나
bind 172.17.0.1 를 추가하여 컨테이너에 올라간 spring이 redis에 접근 할 수 있도록 한다.
나는 172.17.0.1를 뒤에 추가하였다.


Redis 접속 비밀번호 변경


requiredpass 부분 변경하면된다.

위 설정들을 마치고 sudo systemctl restart redis-server.service로 redis를 재실행해 변경된 설정을 적용한다.


문제

연결을 시도 하던 도중 아래와 같은 오류가 발생하였다.

Failed to instantiate [io.lettuce.core.api.StatefulRedisConnection]: Factory method 'connection' threw exception with message: Unable to connect to 172.17.0.1/<unresolved>:6379

redis에서 IP 허용 설정을 안해서 아래와 같은 오류가 발생한것인데 host.docker.internal, 172.17.0.1 즉 host 설정(IP)에 문제가 있다고 생각했었다.

unresolved -> 여러 원인으로 인해 발생하지만 IP를 열어두지 않아도 Unable to connect to 172.17.0.1/<unresolved>:6379 해당 문제가 발생할 수 있다.


결론

  1. localhost 대신 host.docker.internal을 이용해 도커 외부의 로컬에 접근할 수 있다.(Mac, Window 가능)
    도커 컨테이너 올릴 때 --add-host host.docker.internal:host-gateway 추가하면 linux 도 가능
    ++ (레디스에서 172.17.0.1 포트열어야 함)

  2. localhost 대신 172.17.0.1 사용 ++ (레디스에서 172.17.0.1 포트열어야 함)


추가

.env 파일을 사용하여 도커에 주입하고 있는데

파일 내용 중
REDIS_HOST=host.docker.internal #172.17.0.1
이런식으로 작성해 놓은 곳이 있었는데 #을 주석으로 인식 하는 줄 알았는데 주석으로 인식하지 못한다.

Docker 컨테이너에서 localhost와 통신하기

profile
since 2022

0개의 댓글