Nest.js를 배워보자/13. NestJS + Docker 배포하기

Dockerfile 구성

_Blue_Sky_ 2025. 12. 3. 12:44
728x90


🐳 1. Dockerfile 구성 (Production 최적화)

NestJS 애플리케이션의 Dockerfile은 일반적으로 빌드 시간 단축과 최종 이미지 크기 최소화를 위해 멀티 스테이지 빌드(Multi-Stage Build) 패턴을 사용합니다. 이는 개발 환경(빌드 환경)과 실행 환경(런타임 환경)을 분리하는 핵심 전략입니다.

A. 빌드 스테이지 (Build Stage)

이 단계에서는 NestJS 프로젝트를 실행 가능한 JavaScript 코드로 컴파일하고 의존성을 설치합니다.

# Stage 1: 빌드 환경 (Node.js 20 사용, alias를 'builder'로 지정)
FROM node:20-alpine AS builder

# 1. 작업 디렉토리 설정
WORKDIR /app

# 2. 의존성 설치를 위해 패키지 파일만 복사
# 캐싱 활용: package.json/package-lock.json이 변경되지 않으면 다음 단계는 재사용됨
COPY package.json package-lock.json ./
RUN npm install

# 3. 모든 소스 코드 복사
COPY . .

# 4. TypeScript 코드를 JavaScript로 컴파일 (빌드)
# 'dist' 폴더에 최종 결과물이 생성됨
RUN npm run build
728x90

B. 프로덕션 스테이지 (Production Stage)

이 단계에서는 실행에 필요한 최소한의 파일만 복사하여 최종 이미지 크기를 극적으로 줄입니다.

# Stage 2: 런타임 환경 (경량 Node.js 20 환경 사용)
# alpine은 매우 가벼운 리눅스 배포판으로 이미지 크기를 줄여줌
FROM node:20-alpine AS production

# 1. 작업 디렉토리 설정
WORKDIR /usr/src/app

# 2. 개발 환경 의존성 제외, 프로덕션 의존성만 설치
# 'builder' 스테이지의 node_modules 중 production 의존성만 복사
COPY --from=builder /app/node_modules ./node_modules

# 3. 컴파일된 JS 파일과 패키지 파일 복사
# 빌드 스테이지에서 생성된 최종 결과물(dist)만 복사
COPY --from=builder /app/dist ./dist
# package.json만 복사 (npm start 명령어 실행에 필요)
COPY --from=builder /app/package.json ./package.json

# 4. 컨테이너 외부에 노출할 포트 설정 (NestJS 기본 포트 3000)
EXPOSE 3000

# 5. 컨테이너 실행 명령어 정의
# npm run start:prod를 실행하여 컴파일된 JS 코드를 Node로 구동
CMD [ "npm", "run", "start:prod" ]
728x90

C. .dockerignore 파일 작성 (필수)

Docker 빌드 과정에 불필요한 파일들(로컬 환경 설정 파일, 빌드 결과물, Git 정보 등)을 제외하여 빌드 속도를 높이고 보안을 강화합니다.

# .dockerignore
/node_modules
/dist
/logs
.git
.env
Dockerfile
docker-compose.yml
npm-debug.log

 

728x90