본문 바로가기
backend/NestJS

[NestJS] NestJS Docker 이미지 빌드

by BK0625 2023. 12. 19.
반응형

기존 진행하던 프로젝트를 도커로 빌드하기 위한 시도. 간단하게 이미지를 만드는거라 어렵진 않다.

 

먼저 프로젝트 루트 디렉토리에 도커파일을 만들어준다.

 

Dockerfile 생성

 

D는 대문자여야 한다. 그리고 다음과 같이 입력

 

FROM node:20

WORKDIR /usr/src/app

COPY package.json ./

RUN npm install --legacy-peer-deps

COPY ./ ./

CMD ["npm","run","start:dev"]

 

 

라인 하나하나 설명하자면 

 

제일 첫번째 줄은 베이스 이름을 명시해준다. 도커 이미지를 만들 때는 아예 아무것도 없는 상태에서 만드는게 아니라 어느 정도 기본적인 구성 요소들이 갖추어진 상태의 이미지를 토대로 만들게 되며 이를 베이스 이미지라고 한다. FROM에서 베이스 이미지를 지정하면 registry에서 해당 이미지를 pull 하게 된다.

 

처음엔 필자 로컬에 있는 버전과 맞게 18 버전을 시도했는데 cannot find module 'webpack' 에러가 났고 찾아보니 버전 업을 해보라길래 20으로 설정했다.

 

두번째 줄은 디렉토리 경로 설정을 해주고

 

세번째 줄은 package.json 파일을 카피한다. 뒤에 설명하겠지만 .dockerignore 파일에서 용량 문제로 node_modules 디렉토리를 ignore 해놓은 상태이고 먼저 package.json을 카피한 뒤 네번째 줄로 필요한 파일들을 다운받는다.

 

그리고 다음 줄에서는 다른 코드들도 카피를 해주고

 

마지막 CMD는 컨테이너 시작시 실행 될 명령어를 명시해준다. 도커파일에서 딱 한 번만 쓸 수 있다.

 

그런 다음 .dockerignore 파일을 작성해준다.

 

node_modules/
Dockerfile
.dockerignorefile
dist

 

 

윈도우의 경우 node_modules를 제외해주지 않으면 운영체제 문제 때문에 이미지가 빌드 되지 않을 수 있으므로 꼭 node_modules 파일을 제외시키도록 하자.

 

이러면 준비가 끝났다. 다음 명령어로 이미지를 만들어보자.

 

docker build -t <도커 이미지 이름> <경로>

 

 

필자는 docker build -t bk0625/ebook 명령어를 실행했다. -t 는 해당 이미지에 이름을 주는 옵션으로 이 옵션을 주지 않으면 긴 아이디 값으로 실행해야 되기 때문에 편하게 이름을 명시 해주었다.

 

이제 컨테이너를 시작해보자.

 

docker run -d -p 80:5000 <도커 이미지 이름>

 

 

-p 옵션으로 포트를 매핑해줘야 외부에서 접근 할 수 있다. NestJS는 5000 포트에서 돌아가므로 5000포트를 80 포트에 매핑해주었다.

 

 

성공!!

 

 

이제 환경변수도 주고 배포도 다시 진행해봐야겠다.

 

 

공부하면서 정리한 내용입니다. 모든 지적 감사히 받겠습니다:)

반응형