[Dimelo Project] nest.js docker에 pm2 사용하기

Suyeon Pi·2022년 3월 5일
0

Dimelo

목록 보기
18/22

pm2를 이용하여 터미널을 끄더라도 node.js프로젝트를 계속 운영해보도록 하자. docker container를 사용하면 pm2, forever와 같은 서비스를 이용 안해도 되는줄 알았지만.. 알아보니(제로초님께 질문해보니) kubernetes를 썼을 때 비로소 pm2를 안써도 된다고 하셨다.

docker에서 pm2사용법 (pm2공식문서)
https://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/

docker에 pm2설치

RUN npm install --global pm2

pm2 fork모드로 실행

CMD ["pm2-runtime", "dist/main.js"]

docker에서는 pm2-runtime으로 실행해야한다.

cluster모드로 실행 하기 위해서 ecosystem.config.js 파일을 만들어준다. nest-app이라는 이름으로 2개의 cluster가 돌아가도록 설정하였다.

module.exports = [
  {
    script: 'dist/main.js',
    name: 'nest-app',
    exec_mode: 'cluster',
    instances: 2,
  },
];

ecosystem.config.js파일로 pm2실행

CMD ["pm2-runtime", "start", "ecosystem.config.js", "--env", "production"]

완성된 Dockerfile

이미지 경량화를 위해 Muilti-stage build를 하였습니다.

https://blog.logrocket.com/containerized-development-nestjs-docker/

FROM node:12-alpine3.11 As development

WORKDIR /usr/src/app

COPY package*.json ./

# pm2설치
RUN npm install --global pm2

# bcrypt사용을 위한 python 설치
RUN apk add --no-cache --virtual .gyp python make g++ pkgconfig pixman-dev cairo-dev pango-dev
RUN npm install

COPY . .

RUN npm run build

FROM node:12-alpine3.11 as production

ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}

WORKDIR /usr/src/app

COPY package*.json ./

# pm2설치
RUN npm install --global pm2

# bcrypt사용을 위한 python 설치
RUN apk add --no-cache --virtual .gyp python make g++ pkgconfig pixman-dev cairo-dev pango-dev
RUN npm install --only=production

COPY . .

COPY --from=development /usr/src/app/dist ./dist

EXPOSE 3000

# pm2-runtime으로 실행
CMD ["pm2-runtime", "start", "ecosystem.config.js", "--env", "production"]

실행중인 pm2 프로세스 보기

$ sudo docker exec -it {컨테이너이름} pm2 list

실행중인 pm2 로그 보기

$ sudo docker exec -it {컨테이너이름} pm2 log nest-app
profile
Stay hungry, Stay foolish!

0개의 댓글