Self Project(ICN-APP) 일기 #5

최우혁·2021년 1월 29일
0

ICN_APP

목록 보기
5/7
post-thumbnail

Docker 컨테이너

(이미지 출처: https://subicura.com/2017/02/10/docker-guide-for-beginners-create-image-and-deploy.html)

일단 지금까지 만든 서비스 중

  • 스케쥴을 받아오는 서비스 (main-server)
  • API gateway 역할을 하는 서비스 (api-gateway)
  • Service Registry 역할을 하는 Eureka Server (service-registry)

이 세가지 서비스를 도커로 띄워놓기로 했다.

마침 난 Azure Cloud VM을 사용하고 있어서, api-gateway 서비스를 로컬에서 docker화 하고, 나머지 두 서비스를 클라우드에 docker화 하기로 했다.

docker image build

먼저 내가 docker image를 만든 방식은 서비스를 maven install하여 jar 파일을 생성한 뒤, Dockerfile을 작성하여 해당 jar파일을 docker image로 만드는 것이었다.

먼저 Dockerfile의 내용은 이렇다.

FROM openjdk:8-jdk-alpine
ADD discovery-0.0.1-SNAPSHOT.jar app.jar
ENV JAVA_OPTS=""
ENTRYPOINT ["java","-jar","/app.jar"]

docker image로 만들 jar 파일 명은 'discovery-0.0.1-SNAPSHOT.jar' 였고, 이제 아래의 명령어를 통해 docker image를 만들어냈다.

docker build -f Dockerfile -t {repository명}:{tag명} .

그렇게 만들어낸 docker image를 docker desktop을 이용해서 확인을 했다.

그럼 이 docker image를 어떻게 내 cloud VM에 보낼 것인가.

docker hub

docker hub 라는 사이트에 가입을 해서 로그인을 한 뒤, github처럼 내 docker image들을 관리할 repository를 만들었다.

나는 teacherapp 이라는 private repository를 만들었고 docker desktop에서 로그인을 한 뒤, 올리고자 하는 docker image를 repository에 push 하였다.

그리고 remote repositories를 확인해보면 내가 올린 docker image들이 올라와있음을 확인할 수 있다.

Cloud VM

그럼 이제 docker image를 띄울 VM으로 가서 저장소로부터 image를 pull하자.

docker pull {repository명}:{tag명}

성공적으로 image를 받아왔다.
그럼 이 image를 원하는 port에 맞게 띄워봤다.

docker run -d -p 8080:8080 {repository명}:{tag명}

그럼 이제 {Cloud VM의 ip}:8080 으로 들어오는 요청이 docker container의 8080 port로 들어가게 된다.
이렇게 main-server, service-registry 두 image를 각각 두 개의 container에 띄웠다.
api-gateway는 로컬에서 띄우고 테스트를 해봤다.
api-gateway를 거쳐 main-server에 요청을 보내 값을 받아오는 것이었다.

문제

근데 api-gateway가 Eureka Server에 등록된 main-server 값을 제대로 받아오지 못한다!

분명히 로컬에서 서비스들을 띄웠을 때는 제대로 동작했었는데...???

Eureka Server에서 보니 MAIN-APP 의 Status에 있는 '5d6851f3cae5' 를 api-gateway가 main-server의 ip주소로 받아오고 있었다.
즉 api-gateway는 사용자의 요청을 받아서 Eureka Server에 등록되어있는 main-server의 주소를 '5d6851f3cae5:8080' 로 받아오고 있던 것이다.

이걸 어떻게 해결해야하나 싶어서 꽤 오랜 시간 동안 검색을 했다.

docker container별로 ip가 달라서 생긴 문제다, docker swarm으로 묶어줘야 한다, eureka.instance.prefer-ip-address=true 를 추가하면 된다 등등 다양한 해결법이 나왔는데 내 머리론 제대로 이해를 하지 못해서 적용도 못해보고 끙끙대기만 했다..😭

그러다 eureka.instance.ip-address 라는 항목을 발견했고, 그냥 임시방편으로 이 항목에 Cloud VM의 주소를 넣어볼까 해서 넣고 Cloud VM에서 띄워봤다.

그런데 웬걸!!?? 제대로 동작을 하더라!!!!

허허 물론 Cloud VM IP가 유동적으로 변하면 말짱 도루묵이되지만, 이렇게 해서 일단 위기는 넘겼다...ip야 뭐 VM을 중지하지만 않으면 변하지 않으니...넘어가기로 했다.

이렇게 이 문제로 하루 웬종일 씨름하며 docker network 설정을 건드리고 변경해야할 생각에 아찔했지만 임시로나마 간단하게 해결이 되어 맘 놓고 쉴 수 있게 되었다😊😊

profile
백엔드 주니어입니다🙌

0개의 댓글