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
'Nest.js를 배워보자 > 13. NestJS + Docker 배포하기' 카테고리의 다른 글
| CI/CD 구성 예시 (Continuous Integration/Continuous Deployment) (0) | 2025.12.03 |
|---|---|
| Docker Compose + MySQL (Local Development Environment) (0) | 2025.12.03 |
| 환경변수 관리 (0) | 2025.12.03 |