Project/CaleFIT

TS | Docker Container에서 local의 Redis와 연결이 안될때

vanss 2022. 11. 15. 13:44

본 글은 사이드 프로젝트를 진행하다 Docker에 관해 학습한 내용을 정리하기 위한 내용입니다.
피드백은 언제나 적극 환영합니다. 🤩

 

 

 

상황

EC2안에서 Docker container로 프로젝트 WAS파일을 정상적으로 실행하였는데, OAuth 요청 시 RedisConnectionException 에러가 발생하였다.

 


 

1차 추측

바라보고 있는 application-deploy.yml 파일의 Redis Host 설정이 잘못되어서 찾지 못하는 거 같아서, Redis Host를 다시 설정해주기로 하였다.

 

 

 

1차시도

아래와 같이 deploy.yml 파일의 Redis Host 값을 수정해봤는데도, 계속 똑같은 에러가 발생하였다.

1. ${REDIS_HOST} = localhost

2. ${REDIS_HOST} = 127.0.0.1

3. ${REDIS_HOST} = EC2 IP

 

 

 

문제점

네트워크 구조에 대해 잘못 파악하고 있는 게 아닌가? 그림으로 구조를 만들어봤다.

 

가독성을 위해 다른 프로그램은 제외하였습니다.

현재 우리 사이드 프로젝트는 Test Server용으로 EC2 하나에 배포된 Applicaiton, MySQL, Redis 이렇게 간단하게 구성하려고 진행 중이다. 막상 그려놓고 보니 되게 이상했다. 한번 이 구조에서 WAS가 Redis에 접근하는 경로를 그려보자.

 

그려놓고 보니, 어느 부분을 잘못 생각하고 있는지 파악할 수 있었다. 되게 이상하지 않나? Docker Container로 WAS를 띄웠는데, Docker Container가 우리가 생각하는 구조에 없었다. 뚜시!! 그래서 다시 한번 찬찬히 EC2 내부 네트워크 구조에 대해 생각하며 그려봤다.

 

이게 맞을 거 같다. Docker Container로 WAS가 돌아가고 있는데, WAS의 yml에 localhost로 지정해주고 있으니, 아래와 같이 서로 다른 영역을 바라보고 있던 게 아닐까 싶다.

 

 

 

일단 그림으로 그려 봤을 때 확연하게 localhost 레벨이 서로 다르다는 걸 알았다. 팩트체크를 위해 WAS Container의 ip를 찍어보자!

 

 

 

하하.. 역시나 EC2 IP(52.79.XX.XXX)와 너무나도 다르다. 막상 이렇게 그림을 그려보면서 팩트체크를 해보니 너무 당연하게 느껴졌다. 이제 WAS와 Redis가 서로 바라보는 localhost가 다르다는 것을 알았다. 자.. 그럼 둘이 연결을 어떻게 해줘야 할까? 찾아보니

 

1. Docker Compose 활용하여 Container로 Redis 띄우기

2. WAS Container에서 외부(Redis의 localhost)로 통신할 수 있도록 설정하여 실행시키기

 

2가지 방법 정도가 있었다. 보통 1번처럼 세팅하여 사용한다는 것을 알 수 있었지만, 우리는 아직 Docker Compose에 대해 학습하지 못한 상태였고 현재 설계에서 최대한 해결을 해보고 1번을 시도해보고 싶었다. 그래서 2번을 택하여 해결을 시도하였다. 

 


 

2차시도

Container에서 외부(localhost)로 접속하기 위해서는 host를 host.docker.internal로 설정해주면 된다는 글을 봐서 deploy.yml에서 redis.host 항목에다 host.docker.internal을 넣어서 다시 배포하고 EC2에서 OAuth 로그인을 실행해봤다. 결과는 실패! 똑같은 에러 RedisConnectionException가 발생하였다.

 

 

 

문제점

Redis Host 항목에다 redis://host.docker.internal로도 해보고 여러 가지 바꿔서 넣어봐도 해결이 안 되어가지고, 구글 구글 거리며 구글링 해보니 이글에서 Linux 환경에서는 --add-host=host.docker.internal:host-gateway 설정해줘야 호스트 머신과 통신이 가능하다는 걸 알 수 있었다. 그래서 배포 스크립트에서 EC2의 Docker Container WAS를 run 하는 명령어를 수정해보기로 하였다.

 


 

3차시도

배포 스크립트 수정을 아래와 같이 하고 배포 후, OAuth 요청을 해봤다.

 

<수정전>

sudo docker run -d -p 80:8080 --name calefit-test ${{ secrets.DOCKER_USERNAME }}/calefit-test

<수정후>

sudo docker run --add-host=host.docker.internal:host-gateway -d -p 80:8080 --name calefit-test ${{ secrets.DOCKER_USERNAME }}/calefit-test

 

 


 

해결

하하.. 우선 테스트가 성공적으로 Redis까지 컨택이 완료되는지 확인하기 위해 Redirect url을 naver.com로 해봤다. 다행히 성공적으로 OAuth 요청이 완료되었다. ㅎㅎ 해결해보면서 Docker Demon과 Docker host 키워드에 대해서도 알게되었는데 이에 대해서는 이번주에 다시 학습하여 정리해봐야겠다. 그리고 본 서버를 구성할때에는 1번으로 해결할 수 있게 환경을 구성해봐야겠다. !! 가즈아 남은 API 하러~~!

 

 

 

ref.

https://docs.docker.com/desktop/networking/#i-cannot-ping-my-containers

https://medium.com/@TimvanBaarsen/how-to-connect-to-the-docker-host-from-inside-a-docker-container-112b4c71bc66

'Project > CaleFIT' 카테고리의 다른 글

프로젝트 일지 D+6  (0) 2022.07.22
프로젝트 일지 D+5  (0) 2022.07.20