내가 Docker를 쓴 이유

chloe·2022년 12월 5일
1
post-thumbnail
post-custom-banner

Summary

  • 상황
    • 개발 시점에는 nCloud 크레딧을 사용할 수 있어 nCloud에 배포하면 되지만, 크레딧 사용이 종료되면 Server를 다른 곳으로 옮겨야할 수 있다.
    • 개발 서버를 급하게 임의로 수정하는 경우, 버전 관리가 되지 않았다.
  • 논의 대상
    • docker를 왜 써야할까?
    • PM2와는 어떤 차이가 있을까?
  • 결론
    • 물리 서버 한 대에 여러 개의 서버를 띄울 수 있다.
    • docker image를 통해 공유, 재구축 및 배포가 쉬워졌다.
    • docker compose를 통해 여러 docker image를 받아와 구성할 수 있다.

발단

학부 시절 프로젝트를 하면서 누군가 docker를 사용해야한다고 말 한적이 있어 docker의 존재를 처음 알게 된 적이 있다.

그 당시 짧게나마 공부 했을 땐 이정도만 학습했고, 중요도가 떨어진다고 생각해 넘어 갔었다.

docker는 가상의 컴퓨터로 VM과 비슷하지만 동일 OS에서 사용한다는 점이 다르고 어디서나 같은 환경으로 사용할 수 있구나!

뭔가 좋은 것 같은데.. Virtual Machine 처럼 화면이 눈에 보이는게 아니라서 어려워보여 못쓰겠어

그리고 시간이 지나 네이버 부스트캠프 웹 모바일 과정에 참여하게 되었고, 다시 docker를 접하게 되었다.

전개

그룹 프로젝트 1주차 설계 공유 시간, 많은 팀에서 docker를 쓸 예정이라고 기술 스택에 표기 하였다.

Docker를 왜 쓰는 걸까 궁금해서 물어봤을 때 대부분 이렇게 답한다.

프로젝트 팀원들과 언어나 프레임워크의 버전의 불일치로 발생하는 문제들을 없앨 수 있고,
다른 가상 환경보다 빠르고 가벼워요!

우리는 JavaScript로 개발하고 버전 관리는 NVM이 해주는데 간혹가다 의존성이 꼬이는 경우가 있어도, 우리는 대부분 전역보다는 dev로 설치를 하고 프로젝트 인원 4명이서 그런 문제가 발생할 일이 별로 없을 것 같은데 꼭 써야하는지 아직 잘 모르겠으니, 프로젝트를 진행하면서 불편함을 감지해보기로 했다.

1차 불편함 감지

학습 스프린트 때 NAVER Cloud에서 무료로 지원하는 micro Server를 사용했으나, 속도가 너무 느렸고 서버가 다운되는 경우가 정말 많았다. 7~8주차 쯤에는 프레임워크 하나만 설치해도 CPU 100% 사용률을 띄우며 죽어서 정상적으로 사용하기엔 어려웠기에, 그룹 프로젝트를 하면서 크레딧으로 유료 서버를 이용하려고 했다.

여기서 서버를 돌리기위해 필요한 것들을 다시 찾아서 일일이 설치를 해주어야하는 상황이 발생했다.

다시 열심히 검색을 했고, 설치를 차례대로 하였으나 NodeJS 설치를 이전과 다르게 했는지 계속 JavaScript 실행에 문제를 겪었고, 이 때 처음 docker의 필요성을 조금이나마 알아챘다.

지금은 부스트캠프에서 지원해준 크래딧으로 유료 서버를 구매했지만, 지원이 끝나면 지금 사용 중인 서버를 유지하기 어려워 서버를 옮길 예정이었다. 이때 또 설치가 필요하기 때문에 docker 이미지화의 중요성을 체감했다.

2차 불편함 감지

Frontend와 Code merge 작업 전, Backend에서 구현 완료한 API를 제공하기 위해 DEV-BE branch의 내용을 개발 서버로 자동 배포하는 Github Action을 돌려두었다.

동작은 ssh로 서버에 접속 → git pull → 패키지 설치 → pm2 실행 순으로 작성하였다.

이때 임시로 Server에서 Code 수정한 부분이 있거나, 패키지 설치가 꼬일 경우 내가 직접 다시 서버를 확인하고 구동해야하는 경우가 발생했다.

git stash 명령을 추가 했으나, 이렇게 하니 서버의 버전관리도 잘 되지 않고 자동화를 해두었지만 자동화가 잘 되었는지를 내가 직접 확인하고 다시 받아오는 상황이 발생했다.

수동으로 하는게 싫음 → 자동화 → 자동화가 되는지를 수동으로 확인함

또한 내가 어디를 임시로 수정했었는지, 지금이 언제 Github에 올라온 버전인지 확인하는데 번거로움이 있었다.

이 때 Github 원격 repository에 올라온 내용만 딱 받아서 빌드 파일을 만들어두는 것과 버전 관리의 필요성을 느꼈다.

결론

Docker를 사용한 Scale out?

scale-out 관점에서 의문이 들었던 것은 지금까지 사용해온 PM2 (Node.js process manger)로 Port만 다르게하여 여러 개 돌리면 하나의 컴퓨터에서 여러 서버를 구동하는 것과 동일하다고 생각하였으나, 공부를 하다보니 단순히 여러 서버를 실행시키는 관점에서 나아가 load balancing 관점에서 차이가 있었다.

  • PM2는 여러 프로세스를 생성하고 cluster module이 각 프로세스에 들어오는 트래픽을 분산시킨다.
    • cluster module은 단일 시스템에서만 트래픽 분산이 가능하다.
  • docker는 트래픽 분산을 load balancer가 처리한다.
    • load balancer는 트래픽을 다른 서버로 분산할 수 있다.

docker 를 꼭 WAS 만 이미지화 하는 것이 아니고, Nginx 이미지를 받아와 웹서버를 구성할 수 있었기 때문에 언제든지 웹서버를 변경할 경우의 유연함을 생각하면 docker가 효과적이라고 생각했다.

지금까지 몇 가지 불편함을 느꼈으니 Docker 한 번 시도해볼만 하다!

지금 당장 Server scale-out이 필요한 것은 아니지만, Stateless하도록 구축해 두었기 때문에 언제든 scale-out이 가능한 상황이며, 앞서 감지한 불편한 점들을 개선해보고자 Docker를 사용해보기로 했다.

우리가 현재 빌드하는 docker image는 API server와 Socket server이며 이후 하나씩 더 확장해보려한다.


2022.12.16 수정 버전

참고

what is the point of using pm2 and docker together?

왜 굳이 도커(컨테이너)를 써야 하나요? - 컨테이너를 사용해야 하는 이유

From PM2 to Docker: Cluster Mode

profile
삽질전문 아티스트
post-custom-banner

0개의 댓글