Next.js 14 Docker 컨테이너 패키징

김태훈 2024년 04월 10일 #NextJS #Docker

Next.js 웹 앱을 Docker 컨테이너 이미지로 패키징하는 방법을 정리했습니다. 이 글을 작성하는 시점에서 Next.js 최신 버전인 14.1.4 버전과 pnpm 패키지 관리자 기준으로 작성하였습니다. docker를 포함한 Next.js 개발 환경이 설정되어 있어야 합니다.

Next.js 14 샘플 앱 생성

예제로 사용할 Next.js 샘플 앱을 생성합니다.

npx create-next-app@latest nextjs-app --ts --use-pnpm

notion image

ESLint, Tailwind CSS, src/ 디렉토리, App Router, import alias는 모두 디폴트 설정 입니다.

생성된 nextjs-app 폴더로 이동합니다.

cd nextjs-app

Next.js standalone 설정

Next.js 웹 앱 빌드시 필요한 파일과 의존성만 포함하도록 standalone 빌드로 설정합니다. next.config.mjs 파일에 아래 내용을 추가합니다.

/** @type {import('next').NextConfig} */
const nextConfig = {
  output: "standalone",
};

export default nextConfig;

Dockerfile 작성

Docker 빌드시 불필요한 파일은 포함되지 않도록 .dockerignore 파일을 아래와 같이 작성합니다.

Dockerfile
.dockerignore
node_modules
npm-debug.log
README.md
.next
.git

Docker 이미지를 생성하기 위한 Dockerfile 을 아래와 같이 정의합니다. Docker 이미지 최적화를 위해 multi-stage 빌드를 사용하였습니다.

# Build Stage
FROM node:20-alpine AS builder
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN corepack enable
WORKDIR /app
COPY . .
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile
RUN pnpm run build

# Run Stage
FROM node:20-alpine AS runner
ENV NODE_ENV production

WORKDIR /app
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs

RUN mkdir -p /app/.next
RUN chown nextjs:nodejs /app/.next

COPY --from=builder --chown=nextjs:nodejs /app/next.config.mjs ./
COPY --from=builder --chown=nextjs:nodejs /app/package.json ./package.json
COPY --from=builder --chown=nextjs:nodejs /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static

USER nextjs
EXPOSE 3000

CMD ["node", "server.js"]

Docker 빌드 및 실행

docker build -t nextjs-app .

빌드가 완료되면, 3000번 포트를 매핑하여 Docker 컨테이너를 실행합니다.

docker run -p 3000:3000 nextjs-app

→ 웹 브라우저 주소창에서 http://localhost:3000 로 접속

notion image