Heroku에서 Docker 배포

Heroku에서 Docker 배포

개발을 진행했으나 배포하지 않았던 토이 프로젝트를 Heroku를 통해 배포하고자 하였다. Heroku를 선택한 이유는 docker-compose 와 유사한 형태로 도커 컨테이너의 배포가 가능하다는 점이 매력적이었다. 무료 플랜을 제공하고 있으나 서비스 용도로는 부적합해 보이며 데모 사이트 정도로 쓰기에 괜찮을 듯 하다.



Heroku CLI 설치

우선 Heroku CLI 설치가 필요하다. 필자와 같이 데비안 계열의 리눅스를 사용한다면 아래와 같이 설치할 수 있다. 그 외 운영체제는 https://devcenter.heroku.com/articles/heroku-cli 를 참고하여 설치하자.

curl https://cli-assets.heroku.com/install-ubuntu.sh | sh

사전 설정

CLI를 통해 로그인을 진행하자.

heroku login

Heroku에 만들어 둔 앱이 없다면 아래와 같이 create 명령어를 통해서 즉시 생성할 수 있다. create 뒤에 <APP_NAME>은 생략이 가능하며 생략시 무작위로 이름이 만들어진다.

heroku create <APP_NAME>

Heroku에 이미 만들어둔 프로젝트가 있다면 다음과 같이 연결할 수 있다.

heroku git:remote <APP_NAME>

Docker 컨테이너 형태로 배포하고자 한다면 아래 명령어를 입력하여 스택 유형을 바꿔주어야 한다. 아래 명령어를 실행하지 않을 경우 오류가 발생한다.

heroku stack:set container

heroku.yml

프로젝트 경로에 heroku.yml을 생성하자.

build:
  docker:
    web: server/Dockerfile

대략 위와 같다. 위의 경우는 Dockerfile이 heroku.yml과 같은 디렉터리에 있지 않으므로 서브 디렉터리를 명시해 주었다. 같은 경로에 있다면

build:
  docker:
    web: Dockerfile

위와같이 작성할 수 있다.

build:
  docker:
    web: Dockerfile
run:
  web: bundle exec puma -C config/puma.rb

run 속성에서 컨테이너 이름에 명령어를 명시하면 명시된 명령어로 컨테이너가 실행되고 run 속성이 존재하지 않는 경우 기본적으로 Dockerfile에 작성된 명령으로 실행한다.

git add heroku.yml
git commit -m "Add heroku.yml"
git push
git push heroku master

GitHeroku에 각각 푸시를 해주었다. 배포 끝!

Port 설정

우선 필자가 배포하는 동안 문제를 겪었던 부분은 포트와 관련된 부분이었다. Heroku의 환경변수로 지정해준 포트에서 장시간 서비스가 실행되지 않을 경우 Crash로 처리된다. 따라서 우리의 서비스를 환경변수에서 제공해주는 포트로 실행해야 한다.

in Python
import os

from flask import Flask

application = Flask(__name__)

if __name__ == '__main__':
    application.run(host='0.0.0.0', port=int(os.environ.get("PORT", 5000)))
in Node
import express from 'express'

const port = process.env.PORT || 3000

const app = express()
    .listen(port, () => console.log(`listen on :${port}`))

이 글이 도움이 되었나요?

신고하기
0분 전
작성된 댓글이 없습니다. 첫 댓글을 달아보세요!
    댓글을 작성하려면 로그인이 필요합니다.