pm2를 이용하여 터미널을 끄더라도 node.js프로젝트를 계속 운영해보도록 하자. docker container를 사용하면 pm2, forever와 같은 서비스를 이용 안해도 되는줄 알았지만.. 알아보니(제로초님께 질문해보니) kubernetes를 썼을 때 비로소 pm2를 안써도 된다고 하셨다.
docker에서 pm2사용법 (pm2공식문서)
https://pm2.keymetrics.io/docs/usage/docker-pm2-nodejs/
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"]
이미지 경량화를 위해 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"]
$ sudo docker exec -it {컨테이너이름} pm2 list
$ sudo docker exec -it {컨테이너이름} pm2 log nest-app