ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Docker] 호스트 머신의 DB와 Container 서버의 연결
    Docker 2024. 10. 26. 17:40
    728x90

    안녕하세요. 또 오랜만에 인사를 드리네요!

    거진 1년만입니다. 흑 ㅠㅠㅠㅠ

     

    너무 글이 뜸했네요... 이직을 하고나니 이리 휩쓸리고 저리 휩쓸리다보니 블로그에 신경을 못썼습니다. 

    그럼에도 요즘 공부에 너무 소홀해진 제 자신이 보이기에 다시 스스로를 다잡을 겸 블로그를 진행해 보려합니다.

    (사실... 이러고 또 얼마나 갈 지는 모르겠습니다. 헤헤)

     

    요즘 공부하고있는 건 Docker입니다. Docker에 대해서 생소했지만 여기와서 기회가 돼 공부하고있는데 아주 재밌네요!

    여기에 쿠버네티스까지 얹어보려는 당찬 미래를 갖고 있습니다.

     

    제 짧은 근황은 여기서 마무리하고 이제 오늘의 주제에대한 글을 기재하겠습니다.

     

    오늘의 주제는

    호스트 머신내 DB와 컨테이너 내 Server와 통신

    입니다.

     

    들어만 보시면 아마 "엥 얘는 이거를 모르나?"싶으실 수도 있지만 사실 이걸로 꽤나 고생을 했었답니다. 😥😥😥😥

    그렇기에 기록해 놓고 잊지 않으려 합니다.

     

    구조

    시작하기에 앞서 제가 구현하고자 하는 구조를 간단한 그림을 통해 보여드리겠습니다.

    그림에 대해 간단한 설명을 남겨드립니다.

    ① Host Machine(개인 PC)안에 Ubuntu를 설치

    ② Ubuntu 안에 MySQL을 설치

    ③ Ubuntu 안에 Container를 이용해 Node JS서버를 구동

    ④ 서버에서 DB연결 및 조회 확인

     

    어떤가요? 간단한가요? 그렇다면 자잘한건 생략하고 통신하는 방법에 대해 기재하겠습니다.

     

    Localhost는 통신불가!

    아마 해당글을 보신다면... Nodejs를 통해 MySQL접속시 주소를 Localhost, 127.0.0.1, ipconfig명령어를 통한 내 ubuntu ip를 사용하고 계시지는 않으신가요?!

    그리고 connection refuesed... 오류가 발생하고... 타고타고 저의 글을 보신다고생각되네요!

    (왜냐면 저도 그랬습니다. 😀)

     

    해당 방법은 사용이 불가능합니다. 왜냐면!

     - 컨테이너화 시키면 컨테이너 만의 네트워크가 생성

     - 따라서 localhost는 컨테이너 내부의 IP를 지정하지 컨테이너 외부의 MySQL에서는 사용불가!

    하기 때문입니다.

     

    host.docker.internal을 사용하자!

    그렇기에 Docker는 host.docker.internal이라는 주소를 제공합니다.

    기존의 IP대신 해당 내용을 기재하면 알아서 Host Machine(여기서는 Ubuntu에 해당)을 기준으로 Connecting을 시도한다고 합니다!

     

    테스트

    항상 저 스스로에게 하는 말입니다.

    백문이 불여일타! 바로 테스트 진행해보겠습니다.

     

    Case 1. localhost로 통신

    이렇게 에러가 발생하는걸 알 수 있습니다.

    애초에 연결조차 되지 않네요.

    Case 2. host.docker.internal로 통신

    정상적으로데이터를 Select하는걸 알 수 있습니다.

     

    다만 ubuntu를 통해 통신할때는 컨테이너 실행문에

    --add-host host.docker.internal:host-gateway

    를 붙여줘야 하는걸 잊지 마세요!

     

    네~ 오늘 제가 전달한 내용은 여기까지입니다.

    모두에게 도움이 되셨으면 좋겠습니다.

     

    가을이 오는줄 알았으나 낮에는 덥고 일교차가 심하네요.

    모두 감기조심하시고 오늘도 좋은하루 보내시길 바랍니다.

     

    감사합니다. 😀😀😀

    댓글

Designed by Tistory.