๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
๐“๐จ๐๐š๐ฒ ๐ˆ ๐‹๐ž๐š๐ซ๐ง

[Docker] next.js๋ฅผ Docker๋กœ ๋ฐฐํฌํ•˜๊ธฐ with multi-stage ๋นŒ๋“œ

by DevIseo 2025. 6. 5.
๋”๋ณด๊ธฐ

๐Ÿ“Œ ๋ชฉ์ฐจ

  1. Dockerfile ์ž‘์„ฑํ•˜๊ธฐ (Single-stage Dockerfile)
  2. Multi-stage ๋นŒ๋“œ๋ฅผ ํ†ตํ•œ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”
  3. .dockerignore๋กœ ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ์ œ๊ฑฐ
  4. ์ฃผ์š” Docker ๋ช…๋ น์–ด
  5. Reference

 
์‚ฌ๋‚ด ์„œ๋น„์Šค ํ”„๋กœ์ ํŠธ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ๋งก์œผ๋ฉด์„œ CI๋ฅผ ๊ตฌ์ถ•ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์ƒ๊ฒผ๋‹ค.
ํ˜„์žฌ ๊ฐœ๋ฐœ์ค‘์ธ ์„œ๋น„์Šค๋Š” next.js ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋‚ด๊ฐ€ ๋งก์€ ์—ญํ• ์€ Dockerfile์„ ์ƒ์„ฑํ•˜์—ฌ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜์—ฌ Teamcity์— ์—ฐ๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๊ณผ์ •์—์„œ ํŠน์ • ๋ธŒ๋žœ์น˜์— ์—…๋ฐ์ดํŠธ ๋ฐœ์ƒ ์‹œ, ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œ ํ›„ ์‚ฌ๋‚ด ์ €์žฅ์†Œ์— push ํ•˜๋„๋ก ํ•˜๋Š” ๊ณผ์ •๊นŒ์ง€๋Š” ๋‚ด๊ฐ€ ๋งก์•˜๋‹ค. ์ตœ์‹  ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋ฅผ ๊ฐ€์ ธ์™€ ์„œ๋ฒ„๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ์ž‘์—…์€ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž ์„ ๋ฐฐ๋‹˜์ด ์—ฐ๋™ํ•˜์‹œ๊ธฐ๋กœ ํ–ˆ๋‹ค.
 

Dockerfile ์ž‘์„ฑํ•˜๊ธฐ

๋จผ์ €, next.js ํ”„๋กœ์ ํŠธ ROOT์— Dockerfile์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

my-nextjs-app/
โ”œโ”€โ”€ Dockerfile          โœ… ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— ์œ„์น˜
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ yarn.lock
โ”œโ”€โ”€ public/
โ”œโ”€โ”€ pages/ or app/
โ”œโ”€โ”€ ...

 
์ถ”๊ฐ€ํ•œ Dockerfile์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

# Node.js ํ™˜๊ฒฝ ์„ค์ •
FROM node:20-alpine

# ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •
WORKDIR /app

# ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์„ค์ • ํŒŒ์ผ ๋ณต์‚ฌ ๋ฐ ์˜์กด์„ฑ ์„ค์น˜
COPY package.json yarn.lock ./
RUN yarn install

# ์ „์ฒด ์†Œ์Šค ์ฝ”๋“œ ๋ณต์‚ฌ
COPY . .

# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ
RUN yarn build

# ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋…ธ์ถœํ•  ํฌํŠธ
EXPOSE 3000

# ์•ฑ ์‹คํ–‰ ๋ช…๋ น์–ด
CMD ["yarn", "start"]

 

alpine์ด๋ž€?

Alpine Linux๋Š” ๋ณด์•ˆ, ๋‹จ์ˆœ์„ฑ, ๋ฆฌ์†Œ์Šค ์ ˆ์•ฝ์— ์ดˆ์ ์„ ๋งž์ถ˜ ์ดˆ๊ฒฝ๋Ÿ‰ ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ

 
์žฅ์ 

์ด๋ฏธ์ง€ ํฌ๊ธฐ ์ž‘์ŒAlpine ๊ธฐ๋ฐ˜ Node.js ์ด๋ฏธ์ง€๋Š” ์•ฝ 30~40MB๋Œ€. ๊ธฐ๋ณธ Debian ๊ธฐ๋ฐ˜์€ 300MB ์ด์ƒ.
๋ณด์•ˆ์„ฑ ๋†’์Œ์ตœ์†Œํ•œ์˜ ํŒจํ‚ค์ง€๋กœ ๊ตฌ์„ฑ๋˜์–ด ๊ณต๊ฒฉ ํ‘œ๋ฉด์ด ์ž‘์Œ.
๋น ๋ฅธ ๋ฐฐํฌ ๋ฐ ๋นŒ๋“œ์ด๋ฏธ์ง€๊ฐ€ ์ž‘์•„ ๋„คํŠธ์›Œํฌ ์ „์†ก ์†๋„ ๋ฐ CI/CD ์†๋„ ํ–ฅ์ƒ.
์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์œ ๋ฆฌ๋ถˆํ•„์š”ํ•œ ํŒจํ‚ค์ง€๊ฐ€ ์—†์–ด ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์„ค์น˜ํ•ด์„œ ์Šฌ๋ฆผํ•˜๊ฒŒ ์œ ์ง€ ๊ฐ€๋Šฅ.

 
์ฃผ์˜์ 

glibc ๋ฏธํฌํ•จAlpine์€ musl libc๋ฅผ ์‚ฌ์šฉํ•จ. ์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” glibc ํ•„์š”ํ•ด์„œ ์ถฉ๋Œ ๊ฐ€๋Šฅ.
๋นŒ๋“œ ํ™˜๊ฒฝ ๋ฌธ์ œnative addon์„ ์‚ฌ์šฉํ•˜๋Š” npm ํŒจํ‚ค์ง€๋Š” alpine์—์„œ ๋นŒ๋“œ ์‹œ ์—๋Ÿฌ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์Œ. ์˜ˆ: sharp, bcrypt
๋””๋ฒ„๊น… ๋„๊ตฌ ๋ถ€์กฑ๊ธฐ๋ณธ ์ด๋ฏธ์ง€์— bash, curl, wget, vim ๋“ฑ์ด ์—†์Œ. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ง์ ‘ ์„ค์น˜ํ•ด์•ผ ํ•จ.

 

๋„์ปค ์ด๋ฏธ์ง€ ๋นŒ๋“œํ•˜๊ธฐ

์œ„์—์„œ ์ž‘์„ฑํ•œ Dockerfile์„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•œ๋‹ค.
๋‚˜์˜ ๊ฒฝ์šฐ ์ด๋ฏธ docker ์„ค์น˜ ๋ฐ ํ™˜๊ฒฝ ์„ค์ •์ด ๋˜์–ด์žˆ๋Š” ์ƒํ™ฉ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, docker ์„ค์น˜๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์„ค์น˜๊ฐ€ ์‚ฌ์ „์— ํ•„์š”ํ•˜๋‹ค.
docker ์„ค์น˜ ๋ฐ ํ™˜๊ฒฝ ์„ค์ •์ด ๋๋‚˜๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•œ๋‹ค.

docker build -t [๋„์ปค ์ด๋ฏธ์ง€ ์ด๋ฆ„] .

# ์˜ˆ์‹œ
# docker build -t cattower-front .

 

๋นŒ๋“œ ๋œ ์ด๋ฏธ์ง€ ํ™•์ธ

docker images | grep [๋„์ปค ์ด๋ฏธ์ง€ ์ด๋ฆ„]

# ์˜ˆ์‹œ
# docker images | grep cattower-front

 

 
๋‚ด๊ฐ€ ์ƒ์„ฑํ•œ ๋นŒ๋“œ ์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ 3.82GB์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๋ช‡ ๋ถ„ ์ „ ์ƒ์„ฑ ๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
์ด ๋ช…๋ น์–ด ์™ธ์—๋„ images ๋ชฉ๋ก์„ ๋ณด๋Š” ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

docker image ls

 

์ƒ์„ฑํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰์‹œ์ผœ๋ณด๊ธฐ

docker run -d -p [์™ธ๋ถ€์—์„œ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ํฌํŠธ]:3000 [๋„์ปค ์ด๋ฏธ์ง€ ์ด๋ฆ„]

# ์ฃผ์˜ ์‚ฌํ•ญ
# 3000๋ฒˆ์˜ ๊ฒฝ์šฐ dockerfile์—์„œ expose ํ•œ port๋ฒˆํ˜ธ๋ฅผ ์ ๋Š” ๊ฒƒ!

# ์˜ˆ์‹œ
# docker run -d -p 80:3000 cattower-front
# local์—์„œ ํ•  ๊ฒฝ์šฐ localhost:80์œผ๋กœ ์ ‘์†์‹œ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž˜ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ

docker ps

 

์‹คํ–‰์‹œํ‚จ ์ปจํ…Œ์ด๋„ˆ ์ค‘์ง€ / ์‚ญ์ œํ•˜๊ธฐ, ์ด๋ฏธ์ง€ ์‚ญ์ œํ•˜๊ธฐ

docker stop [์ปจํ…Œ์ด๋„ˆ ID]
docker rm [์ปจํ…Œ์ด๋„ˆ ID]
docker image rm [์ด๋ฏธ์ง€ ์ด๋ฆ„]

 
 

Docker ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์„๊นŒ?

๋„์ปค ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์‹œ ๋„ˆ๋ฌด ์˜ค๋ž˜๊ฑธ๋ ค์„œ ํ•ด๋‹น ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฉด ์ค„์ด๋Š”๊ฒŒ ์ข‹์ง€ ์•Š์„๊นŒ ๋ผ๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.
๋„์ปค ๊ณต์‹๋ฌธ์—์„œ ๊ฒฝ๋Ÿ‰ํ™” ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์ค„์ด๊ณ  ์‹ถ์œผ๋ฉด multi-stage-builds๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜  .dockerignore ์‚ฌ์šฉํ•˜๋Š” ๋ฒ• ๋“ฑ์„ best practices๋กœ ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋‹ค.
(ํ•˜์ดํผ๋งํฌ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉด ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.)
 
๋‚˜๋Š” ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ  ๋‹ค์Œ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ๊ฒฝ๋Ÿ‰ํ™”๋ฅผ ์‹œ๋„ํ•˜์˜€๋‹ค.

  1. Multi-stage ๋นŒ๋“œ๋ฅผ ํ†ตํ•œ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”
  2. .dockerignore๋กœ ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ์ œ๊ฑฐ

 

1. Multi-stage ๋นŒ๋“œ๋ฅผ ํ†ตํ•œ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”

์œ„์—์„œ ์ž‘์„ฑํ–ˆ๋˜ ๋‹จ์ผ ๋นŒ๋“œ ์ด๋ฏธ์ง€์˜ ๋‹จ์ ์€ node_modules, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ, ๊ฐœ๋ฐœ ๋„๊ตฌ๊นŒ์ง€ ํฌํ•จ๋˜์–ด ์žˆ์–ด ์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ ํฌ๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด multi-stage ๋นŒ๋“œ๋ฅผ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด Dockerfile์— ์ ์šฉํ•œ๋‹ค.

###########################################
# ๐Ÿ› ๏ธ 1๋‹จ๊ณ„: ๋นŒ๋“œ ์Šคํ…Œ์ด์ง€ (Build Stage)
# - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๊ณ ,
# - ๋Ÿฐํƒ€์ž„์— ํ•„์š”ํ•œ ์‚ฐ์ถœ๋ฌผ๋งŒ ์ถ”์ถœ
###########################################
FROM node:20-alpine AS builder

# ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •
WORKDIR /app

# ์˜์กด์„ฑ ์„ค์น˜๋ฅผ ์œ„ํ•œ ํŒจํ‚ค์ง€ ํŒŒ์ผ ๋ณต์‚ฌ
COPY package.json yarn.lock ./

# lockfile์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜์กด์„ฑ ์„ค์น˜ (์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๋นŒ๋“œ)
RUN yarn install --frozen-lockfile

# ์ „์ฒด ์†Œ์Šค ์ฝ”๋“œ ๋ณต์‚ฌ
COPY . .

# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ (.next, public ๋“ฑ ์ƒ์„ฑ)
RUN yarn build

###########################################
# ๐Ÿš€ 2๋‹จ๊ณ„: ํ”„๋กœ๋•์…˜ ๋Ÿฐํƒ€์ž„ ์Šคํ…Œ์ด์ง€
# - ์‹ค์ œ ์‹คํ–‰์— ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ํŒŒ์ผ๋งŒ ํฌํ•จ
# - ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋ณด์•ˆ ๋ฐ ์„ฑ๋Šฅ ๊ฐœ์„ 
###########################################

FROM node:20-alpine

# ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •
WORKDIR /app

# ๋นŒ๋“œ๋œ ๊ฒฐ๊ณผ๋ฌผ ๋ฐ ์‹คํ–‰์— ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋ณต์‚ฌ
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/public ./public

# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉํ•˜๋Š” ํฌํŠธ ๊ฐœ๋ฐฉ
EXPOSE 3000

# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ๋ช…๋ น์–ด
CMD ["yarn", "start"]

 

multi-stage ์ ์šฉ ํ›„ ์ด๋ฏธ์ง€ ํฌ๊ธฐ ๋น„๊ต

์ „ : single-stage ๋นŒ๋“œ
ํ›„: multi-stage ๋นŒ๋“œ

 
ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ ์šฉ ํ›„ ๋‹ค์‹œ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•ด ๋ณด์•˜๋‹ค.

์ „ - single-stage ๋นŒ๋“œ (3.82GB)
ํ›„ - multi-stage ๋นŒ๋“œ (1.34GB)

 
3.82GB์—์„œ 1.34GB๋กœ ์•ฝ 64.9% ์ด๋ฏธ์ง€๊ฐ€ ๊ฐ์†Œํ–ˆ๋‹ค.

2.  .dockerignore ๋กœ ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ์ œ๊ฑฐ

๋‹ค์Œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” .dockerignore ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

my-nextjs-app/
โ”œโ”€โ”€ Dockerfile          โœ… ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— ์œ„์น˜
โ”œโ”€โ”€ .dockerignore       โœ… Dockerfile๊ณผ ๊ฐ™์€ ์œ„์น˜
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ yarn.lock
โ”œโ”€โ”€ public/
โ”œโ”€โ”€ pages/ or app/
โ”œโ”€โ”€ ...

 
Dockerfile๊ณผ ๊ฐ™์ด next.js์˜ ํ”„๋กœ์ ํŠธ ROOT ๊ฒฝ๋กœ์— .dockerignore๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

## .dockerignore

node_modules
.next

.git
.gitignore
*.log
.vscode
.idea
*.tsbuildinfo
.DS_Store

coverage
__tests__

 

.dockerignore ์ ์šฉ ํ›„ ์ด๋ฏธ์ง€ ํฌ๊ธฐ ๋น„๊ต

์ „ : multi-stage๋งŒ ์ ์šฉ
ํ›„ : multi-stage + .dockerignore ์ ์šฉ

 

์ „ - multi-stage๋งŒ ์ ์šฉ๋œ ์ด๋ฏธ์ง€ (1.34GB)

 

ํ›„ - multi-stage + .dockerignore ์ ์šฉํ•œ ์ด๋ฏธ์ง€ (1.08GB)

1.34GB์—์„œ 1.08GB๋กœ ์•ฝ 19.4% ์ด๋ฏธ์ง€๊ฐ€ ๊ฐ์†Œํ–ˆ๋‹ค.

 

์ตœ์ ํ™” ์ „ /ํ›„ ๋น„๊ต

์ตœ์ ํ™” ์ „์˜ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋Š” 3.82GB์˜€๊ณ , ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์˜ ์ตœ์ ํ™”๋ฅผ ๊ฑฐ์ณ ์ตœ์ข…์ ์œผ๋กœ๋Š” 1.08GB๊ฐ€ ๋˜์–ด ์•ฝ 72% ๊ฐ์†Œํ•˜์˜€๋‹ค.

 

 

์ฃผ์š” Docker ๋ช…๋ น์–ด

๋งˆ์ง€๋ง‰์œผ๋กœ Docker ๋ช…๋ น์–ด๋ฅผ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค.

## ๋„์ปค ์ด๋ฏธ์ง€ ๋นŒ๋“œ
docker build -t [์ด๋ฏธ์ง€ ์ด๋ฆ„] .

## ๋„์ปค ์ด๋ฏธ์ง€ ํฌ๊ธฐ ํ™•์ธ
docker images | grep [์ด๋ฏธ์ง€ ์ด๋ฆ„]

## ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ์ค‘์ง€
docker stop $(docker ps -q)

## ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ด๋ฏธ์ง€ ํ™•์ธ
docker ps

## ํฌํŠธ ๋งคํ•‘์„ ํฌํ•จํ•˜์—ฌ ์ƒˆ๋กœ ์‹คํ–‰
docker run -p 3000:3000 [์ด๋ฏธ์ง€ ์ด๋ฆ„]

## ๋„์ปค ์ด๋ฏธ์ง€ ๋ชฉ๋ก
docker image ls

## ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๊ฐ•์ œ ์‚ญ์ œ
docker rm -f $(docker ps -aq)

## ์ด๋ฏธ์ง€ ์‚ญ์ œ
docker rmi [์ด๋ฏธ์ง€ ์ด๋ฆ„]

 

Reference


https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile
https://promisingmoon.tistory.com/229#์š”์•ฝ -1
https://jaeseo0519.tistory.com/264#1. Health check๋ฅผ ์ง€์›ํ•˜๋Š” Docker Image ๋นŒ๋“œ-1
https://creboring.net/blog/how-docker-divide-image-layer/
https://medium.com/@hee98.09.14/docker-layer์™€-cache-574c12a1e9f7
https://velog.io/@gnoeyah/Next.jsํ”„๋กœ์ ํŠธ๋ฅผ-Docker์—-์˜ฌ๋ฆฌ๋ผ๋Š”-๋ฏธ์…˜์„-๋ฐ›์•˜๋‹ค
https://frorong.tistory.com/entry/Docker-NextJS-๋ฐฐํฌ๋ฅผ-์œ„ํ•œ-๋„์ปค-์ปจํ…Œ์ด๋„ˆํ™”
https://oliveyoung.tech/2022-05-03/How-to-Set-up-Build-Process-with-Teamcity/
https://docs.docker.com/build/building/best-practices/

๋Œ“๊ธ€