Skip to content

๐ŸณNext.js์™€ Docker๋ฅผ ์‚ฌ์šฉํ•œ ๋นŒ๋“œ ์ตœ์ ํ™”ํ•˜๊ธฐ

๋…ธํ˜„์ง„ edited this page Dec 3, 2024 · 2 revisions

๋ชฉ์ฐจ


๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Next.js์™€ Docker๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๊ธฐ์กด ๋นŒ๋“œ ๋ฐฉ์‹

๋จผ์ € ๊ธฐ์กด ๋ฐฉ์‹์€ Next.js์˜ default build ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋นŒ๋“œ ๋ฐฉ์‹์€ .next ํด๋”๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋ฐฉ์‹์œผ๋กœ Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•œ ํ›„ production์— ํ•„์š”ํ•œ .next, node_modules, package.json, public ์„ ๋ณต์‚ฌํ•˜๋Š” ์‹์œผ๋กœ Docker ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

# 1. ๋นŒ๋“œ ๋‹จ๊ณ„
# ์ƒ์„ฑํ•  Docker ์ด๋ฏธ์ง€์˜ ๋ฒ ์ด์Šค๊ฐ€ ๋˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
# node - ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ ๋ฐ ๋‹ค์–‘ํ•œ ๋„๊ตฌ๊ฐ€ ํฌํ•จ๋œ ์ด๋ฏธ์ง€๋กœ, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋‚˜ ๋ณต์žกํ•œ ๋นŒ๋“œ ์ž‘์—…์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
# node:alpine - ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ  ๊ฐ€๋ฒผ์šด ์ด๋ฏธ์ง€๋กœ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์ด๋‚˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ œํ•œ๋œ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
FROM node:20-alpine AS build

# 1-1. ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •
# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ์‹คํ–‰ํ•  ๊ธฐ๋ณธ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
# /app ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ, ์ดํ›„์˜ ๋ชจ๋“  ๋ช…๋ น์–ด๊ฐ€ ์ด ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
WORKDIR /app

# 1-2. ์˜์กด์„ฑ ํŒŒ์ผ ๋ณต์‚ฌ
COPY package.json package-lock.json ./

# 1-3. ์˜์กด์„ฑ ์„ค์น˜
# ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.
RUN npm install --force

# 1-4. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋ณต์‚ฌ
# ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  ํŒŒ์ผ์„ /app ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
COPY . .

**# 1-5. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
ARG NEXT_PUBLIC_BACKEND_URL
ARG BACKEND_API_URL
ARG NEXT_PUBLIC_BACKEND_API_URL
ENV NEXT_PUBLIC_BACKEND_URL=${NEXT_PUBLIC_BACKEND_URL}
ENV BACKEND_API_URL=${BACKEND_API_URL}
ENV NEXT_PUBLIC_BACKEND_API_URL=${NEXT_PUBLIC_BACKEND_API_URL}**

# 1-6. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ
RUN npm run build

# 2. ๋Ÿฐํƒ€์ž„ ๋‹จ๊ณ„
FROM node:20-alpine

# 2-1. ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ๊ณผ ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋ณต์‚ฌ
**WORKDIR /app
COPY --from=build /app/.next ./.next
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/package.json ./package.json
COPY --from=build /app/public ./public**

# 2-2. ํฌํŠธ ์„ค์ •
# ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํฌํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๋ช…๋ น์–ด๋กœ, ํ˜ธ์ŠคํŠธ์™€ ํ†ต์‹ ํ•  ํฌํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
EXPOSE 3000

# 2-3. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
# ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰ํ•  ๊ธฐ๋ณธ ๋ช…๋ น์–ด๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
# CMD๋Š” Dockerfile์—์„œ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
**CMD [ "npm", "run", "start" ]**

์ด์™€ ๊ฐ™์ด Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•œ ๊ฒฐ๊ณผ ํฌ๊ธฐ๊ฐ€ 1.2GB๋กœ ์ƒ๋‹นํžˆ ์ปธ์Šต๋‹ˆ๋‹ค.

docker_๋ฐฐํฌ


Standalone ๋นŒ๋“œ ๋ฐฉ์‹

๋นŒ๋“œ ํŒŒ์ผ ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด๋˜ ์ค‘, ๋‹ค์Œ๊ณผ ๊ฐ™์ด Next.js ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๋นŒ๋“œ ์ถœ๋ ฅ๋ฌผ ์œ ํ˜•์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ™”๋ฉด ์บก์ฒ˜ 2024-11-26 010807

https://nextjs.org/docs/app/api-reference/next-config-js/output)](https://nextjs.org/docs/app/api-reference/next-config-js/output

๊ณต์‹ ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด standalone ๋นŒ๋“œ ๋ฐฉ์‹์€ production์— ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ํŒŒ์ผ๊ณผ ์˜์กด์„ฑ๋งŒ ๋ณต์‚ฌํ•จ์œผ๋กœ์จ ์šฉ๋Ÿ‰์„ ์ƒ๋‹นํžˆ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ํ•ด๋‹น ๋นŒ๋“œ ๋ฐฉ์‹์€ Docker๋กœ ๋ฐฐํฌํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค๊ณ  ์„ค๋ช…๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” VSCode์—์„œ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ™”๋ฉด ์บก์ฒ˜ 2024-11-25 234901

๋”ฐ๋ผ์„œ ๋นŒ๋“œ ์ถœ๋ ฅ๋ฌผ ์œ ํ˜•์„ standalone ์œผ๋กœ ๋ณ€๊ฒฝํ•œ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด Dockerfile์„ ์ˆ˜์ •ํ•œ ํ›„ Docker ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

// next.config.ts

import type { NextConfig } from 'next';

const nextConfig: NextConfig = {
  /* config options here */
  reactStrictMode: false,
  **output: 'standalone',**
};

export default nextConfig;
// .dockerignore

# Node.js ํ™˜๊ฒฝ
node_modules

# Git ๊ด€๋ จ ํŒŒ์ผ
.git
.gitignore

# env ํŒŒ์ผ
.env

# ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ
.next

# ํ…Œ์ŠคํŠธ ๊ด€๋ จ ํŒŒ์ผ
__tests__
.swc
playwright-report
test_results
tests
node_modules
# 1. ๋นŒ๋“œ ๋‹จ๊ณ„
# ์ƒ์„ฑํ•  Docker ์ด๋ฏธ์ง€์˜ ๋ฒ ์ด์Šค๊ฐ€ ๋˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
# node - ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ ๋ฐ ๋‹ค์–‘ํ•œ ๋„๊ตฌ๊ฐ€ ํฌํ•จ๋œ ์ด๋ฏธ์ง€๋กœ, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋‚˜ ๋ณต์žกํ•œ ๋นŒ๋“œ ์ž‘์—…์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
# node:alpine - ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ  ๊ฐ€๋ฒผ์šด ์ด๋ฏธ์ง€๋กœ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์ด๋‚˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ œํ•œ๋œ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
FROM node:20-alpine AS build

# 1-1. ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •
# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ์‹คํ–‰ํ•  ๊ธฐ๋ณธ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
# /app ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ, ์ดํ›„์˜ ๋ชจ๋“  ๋ช…๋ น์–ด๊ฐ€ ์ด ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
WORKDIR /app

# 1-2. ์˜์กด์„ฑ ํŒŒ์ผ ๋ณต์‚ฌ
COPY package.json package-lock.json ./

# 1-3. ์˜์กด์„ฑ ์„ค์น˜
# ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.
RUN npm install --force

# 1-4. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋ณต์‚ฌ
# ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  ํŒŒ์ผ์„ /app ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
COPY . .

**# 1-5. client-side ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
ARG ARG_NEXT_PUBLIC_BACKEND_URL
ARG ARG_NEXT_PUBLIC_BACKEND_API_URL
ENV NEXT_PUBLIC_BACKEND_URL=${ARG_NEXT_PUBLIC_BACKEND_URL}
ENV NEXT_PUBLIC_BACKEND_API_URL=${ARG_NEXT_PUBLIC_BACKEND_API_URL}**

# 1-6. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ
RUN npm run build

# 2. ๋Ÿฐํƒ€์ž„ ๋‹จ๊ณ„
FROM node:20-alpine

# 2-1. ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ๊ณผ ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋ณต์‚ฌ
**WORKDIR /app
COPY --from=build /app/.next/standalone ./
COPY --from=build /app/.next/static ./.next/static
COPY --from=build /app/public ./public**

**# 2-2. server-side ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
ARG ARG_BACKEND_API_URL
ENV BACKEND_API_URL=${ARG_BACKEND_API_URL}**

# 2-3. ํฌํŠธ ์„ค์ •
# ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํฌํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๋ช…๋ น์–ด๋กœ, ํ˜ธ์ŠคํŠธ์™€ ํ†ต์‹ ํ•  ํฌํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
EXPOSE 3000

# 2-4. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
# ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰ํ•  ๊ธฐ๋ณธ ๋ช…๋ น์–ด๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
# CMD๋Š” Dockerfile์—์„œ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
**CMD [ "node", "server.js" ]**

๊ทธ ๊ฒฐ๊ณผ Docker ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ 202 MB ๋กœ ์ƒ๋‹นํžˆ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

image

MafiaCamp

๐Ÿ“”์†Œ๊ฐœ
๐ŸŽฏํ”„๋กœ์ ํŠธ ๊ทœ์น™
๐Ÿ’ปํ”„๋กœ์ ํŠธ ๊ธฐํš
๐Ÿ€๊ธฐ์ˆ  ์Šคํƒ
๐Ÿ“š๊ทธ๋ฃน ํšŒ๊ณ 
๐ŸŒˆ๊ฐœ๋ฐœ ์ผ์ง€
๐Ÿ€๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฒฝํ—˜
๐Ÿ”งํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…
Clone this wiki locally