본문 바로가기
프로그래머스 데브코스

Docker + Redis localhost 연결 문제

by 7533ymh 2022. 8. 6.

Redis로 바꾸고 배포해보니….

토큰의 저장소를 Redis로 바꾸게 되면서 EC2 인스턴스에 Redis를 설정,설치하고 다음과 같이 dev 프로파일에 저장하고 머지를 시켰다.

spring:
    redis:
        host: localhost
        password: 
        port: 6379

로컬에서 dev 프로파일로 잘 동작하는 것을 확인했으니 아무 문제가 없겠지 하고 테스트해본 결과
_2022-08-01__8.09.27

500 에러가 떨어졌다. 😂

Untitled

황급하게 로그를 확인하니 Redis에 접속을 못하고 있었던 것…

왜일까 생각하다가 스프링을 도커로 띄운다는 사실을 알게되었다. 스프링이 띄워져있는 도커의 IP를 확인해보니 localhost(127.0.0.1)와 전혀다른 IP가 떨어진다는 것을 확인할 수 있다.

Untitled 1

이 문제로 미루어봤을 때 도커 컨테이너는 네트워크 IP를 하나 가지고 있는 독립적인 서버이며 해당 localhost는 스프링이 띄워져있는 도커 컨테이너의 IP를 가르키게 된다.

즉, EC2의 localhost와 도커 컨테이너의 localhost가 다르기 때문에 접속이 안되는 것이였다. ( 무작정 좋다고 쓰다가 이런 꼴 납니다…)

그럼 어떻게 해결해야할까?

해결방안

1. redis도 docker로 띄운다

redis도 docker로 띄운 뒤 redis:port와 같은 방법으로 바인딩해준다.

docker-compose를 사용하면 모든 컨테이너가 동일한 네트워크 영역대를 사용하기 때문에 컨테이너간의 통신이 가능하며 서비스 이름이 해당 컨테이너를 지칭하는 DNS가 된다!

하지만 현재 docker-compose를 사용할 때 완전히 꺼버리고 다시 띄우기 때문에 영향이 간다고 생각해 다른 방법을 찾아보았다.

2. docker 컨테이너안에서 호스트 localhost 접속하기

먼저 docker-compose 파일을 수정해줘야 한다.

extra_hosts:
      - "host.docker.internal:host-gateway"

다음과 같이 추가해줘서 host.docker.internal을 열어준다.

이후 스프링의 redis host 설정에 host.docker.internal를 입력해주게 되면 도커 컨테이너에서 외부 호스트에 접근할 수 있게 된다.

설정해준 뒤 실행하게 되면 다음과 같이 잘 동작하는 것을 볼 수 있다.

Untitled 2

결론

무슨 기술을 쓰던 기본이 중요하다는 것을 다시 한번 깨닭게 되었다.

컨테이너마다 독립적인 ip를 가진다는 것을 알지 못하여 생기게 된 트러블 슈팅이기 때문에 기본을 알았다면 헤매지 않았을 것이다.

그래도 지금이라도 알았으니 다행이라는 마음을 가지고 있다.

Reference

OKKY | 리눅스 도커 레디스, 스프링 연결 문제. 부탁드립니다.

docker container에서 localhost 접속하기 host.docker.internal

댓글