본문 바로가기
Development Tools/Heroku

heroku 에 node app 배포하기. git 방식과 docker 방식

by jjerryhan 2017. 12. 31.
반응형

heroku 에 node app 배포하기

heroku 를 아시나요? 
의외로 많은 영상강의, 블로그에 자주 등장하는 heroku 이지만 국내에서 사용하는 개발자는 아직 많지 않은 듯 하네요. 
heroku 는  PaaS 입니다.  간단히 말해 내 앱을 클라우드에 얹어 주는 서비스 이지요. 

AWS 니 GCP 니 Azur 니 이미 클라우드에 있는데 무슨 필요가 있냐구요?
사실 heroku 는 AWS 엔진을 사용합니다.  하지만 heroku 는 정말 많은 사랑을 받고 있는데요 왜 그럴까요? 

저도 도전해 보았지만 사실 AWS 나 GCP 나 Azur 나 이제는 선택이 아닌 필수가 되었지요. 하지만 저와 같은 독립개발자 또는 소규모 회사의 경우에는 직접 Cloud 에 환경을 구축하기가 매우 어렵습니다. 간단히 말하면 돈이 너무 많이 듭니다. 

비싼 사용료, 높은 설정 비용, 높은 기술지원 비용, 초기 진입을 위한 수많은 학습 요구 등.  (무엇보다 생각보다 비용이 ...)

이에 비해 heroku 는 아래와 같이 명령어 4줄로 간단히 cloud 에 앱을 배포할 수 있습니다. 그리고 free tier 는 심지어 공짜죠. 
제가 heroku 를 사용하게 된 이유입니다. 

heroku login
// 로그인 합니다.
heroku git:remote -a myapp
// 원격 레파지토리를 연결합니다.
git push heroku master
// 앱을 올립니다.   자동으로 앱을 적재 되고 Cloud 에 기동됩니다.
heroku open
// 적재된 앱을 엽니다.   (브라우저를 열어서 해당 앱에 접속해 줍니다. )


Remote Git Repository 방식으로 app 배포하기

heroku 에 git remote 를 추가하는 방식이 가장 간편합니다.  

1) heroku 에 계정을 만드시고 app 을 생성하세요. 

사실 이미지 첨부하는 걸 별로 안 좋아하는데(너무 자주 바뀌기 때문에 이미지가 금새 outdated 됨), 검색엔진들이 이미지가 없으면 무가치한 컨텐츠로 인식이 되니 할 수 없습니다.  


현재는 미국과 유럽밖에 지원되지 않습니다.  향후에도 아마 계속... 


2) app 을 준비합니다.  (알아서... node 샘플 앱을 어딘가에서 구하셔도 되구요. )

3) app 을 배포합니다. 

heroku login
// 내 heroku 계정에 로그인 하구요.

heroku git:remote -a dreamholic
// 현재 내 앱의 git 에 heroku 에 생성한 내 앱의 원격 레파지토리를 연결합니다. 
// 당연히 이 작업 전에 내 앱은 git 레파지토리가 구성되어 있어야 합니다. 
// git 관련해서는 별도 post 를 참조. 

git push heroku master
// 현재 소스를 연결한 원격 heroku 레파지토리에 제출합니다.  git 제출이 완료되면 자동으로 heroku 가 제출된 앱의 형식을 인식하여 자동으로 앱을 Cloud 상에 기동해 줍니다. (관련 로그를 잘 살펴보시고 오류가 있다면 대응이 필요).
// 자동으로 앱의 형식(java, python, ruby, node 등등) 을 인지하지 못한다면 Procfile 을 정의하여 heroku 에 힌트를 줄 수 있으니 참조하세요)

heroku open
// 적재된 앱을 엽니다.   (브라우저가 열리면서 해당 사이트에 접속합니다.)

간단한가요?  



Docker Image 방식으로 app 배포하기

향후 확장성 (저는 Kubenetes Cluster 를 고민하고 있어서요.. ) 을 위해 Docker 이미지 방식을 통한 app 배포를 알아보겠습니다. 

그리고 추가적으로 git remote 방식의 한계는 root 에 프로젝트 형상이 구성되어 있어야 heroku 가 정상적으로 앱의 형식을 인식한다는 문제가 있습니다. 물론 Procfile 을 구성하거나, git subtree 방식으로 현재 프로젝트 형상과 달리 원격 레파지토리를 구성하여도 되지만, 여러가지 설정과 관리상의 이슈가 복합적으로 관계되어 저는 그냥 현재 제 소스 형상을 유지하되 heroku 에 부분 단위로 적재가 가능하도록 Docker Image 를 구성하여 적재하였습니다. 


Docker Image 를 만듧니다. 

Dockerfile 만들고 docker build. 


Docker Image 구동 테스트

잘 만들어 졌고 실행에도 문제가 없네요. 


Docker Image 를 heroku 에 배포


heroku login
// 내 heroku 계정에 로그인 하구요.

heroku git:remote -a dreamholic
// git remote 방식으로 배포하지는 않을 거지만, 이렇게 원격 레파지토리를 연결해 주어야 현재 내가 배포하려하는 이미지가 heroku 상의 어떤 앱인지를 인식합니다.  

heroku container:login
// heroku 의 container registry  에 로그인 합니다. Docker Image 를 관리하는 registry 죠.

heroku container:push web
// 현재 경로에 있는 Dockerfile 정의를 이용해 원격 Registry 에 Docker Image 등록하고 web worker 로 배정합니다.
// 배정된  web worker 는 생성된 이미지를 통해 컨테이너를 구동한 후 Dockerfile 에 정의된 CMD (heroku 는 반드시 CMD 로 정의해 주셔야 합니다.) 를 실행하여 앱을 실행합니다. 

heroku open
// 적재된 앱을 엽니다.   (브라우저가 열리면서 해당 사이트에 접속합니다.)

설명되지 않은 container registry, git, heroku worker, Dockerfile 형식 등은 별도 포스트를 참조해 주시기 바랍니다. 

gcp 의 AppEngine 에 적재하였다가 생각보다는 비싼 비용으로 heroku 로 옮겼습니다.  

gcp appengine 에 node 앱 배포하기는 차후에 시간이 허락한다면 추가 포스트 하도록 하겠습니다. 


이번 포스트는 여기까지네요. 감사합니다.