A A
[Docker] Dockerfile ์ž‘์„ฑํ•˜๊ธฐ: ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ

Dockerfile์„ ์ž‘์„ฑํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์„ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Docker๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ปจํ…Œ์ด๋„ˆํ™”ํ•˜์—ฌ ์ผ๊ด€๋œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

 

Dockerfile์€ ์ด๋Ÿฌํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • ํŒŒ์ผ๋กœ, ํšจ์œจ์ ์ด๊ณ  ์ผ๊ด€๋œ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” Dockerfile์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹ค์ œ ์˜ˆ์ œ๊นŒ์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ์ƒ์„ธํžˆ ์„ค๋ช…๋“œ๋ฆด ํ…Œ๋‹ˆ, ๋”ฐ๋ผ์˜ค์‹œ๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!


Dockerfile์ด๋ž€?

Dockerfile์€ Docker ์ด๋ฏธ์ง€๋ฅผ ์ž๋™์œผ๋กœ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด๋“ค์ด ๋ชจ์—ฌ ์žˆ๋Š” ํ…์ŠคํŠธ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
 

Dockerfile reference

Find all the available commands you can use in a Dockerfile and learn how to use them, including COPY, ARG, ENTRYPOINT, and more.

docs.docker.com

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ์„ ์ฝ”๋“œ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•˜๊ณ  ์ผ๊ด€๋œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Dockerfile์„ ์ž‘์„ฑํ•˜๋ฉด ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ์†์‰ฝ๊ฒŒ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ๊ณผ์ •์—์„œ ํฐ ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Dockerfile์˜ ์ฃผ์š” ์—ญํ• 

  • ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ์ง€์ •: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์ž‘ํ•  ๊ธฐ๋ณธ ํ™˜๊ฒฝ ์„ค์ •
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋ณต์‚ฌ: ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ด๋ฏธ์ง€ ์•ˆ์œผ๋กœ ๋ณต์‚ฌ
  • ์˜์กด์„ฑ ์„ค์น˜ ๋ฐ ๋นŒ๋“œ: ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์— ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ •์˜
  • ์‹คํ–‰ ๋ช…๋ น์–ด ์„ค์ •: ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด ์ง€์ •

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

์ด์ œ ์‹ค์ œ๋กœ Dockerfile์„ ์ž‘์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ๋กœ Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Docker ์ปจํ…Œ์ด๋„ˆ๋กœ ํŒจํ‚ค์ง•ํ•˜๋Š” ๊ณผ์ •์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ์„ ํƒ

Docker ์ด๋ฏธ์ง€๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ ˆ์ด์–ด(Layer)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ฐ ๋ ˆ์ด์–ด๋Š” ์ด์ „ ๋ ˆ์ด์–ด ์œ„์— ์Œ“์ด๋ฉฐ, ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

# Node.js ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ์ง€์ •
FROM node:20.15.1
  • FROM: ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” Node.js ๋ฒ„์ „ 20.15.1์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • node:20.15.1: Node.js ๊ณต์‹ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ํŠน์ • ๋ฒ„์ „์„ ๋ช…์‹œํ•˜์—ฌ ์ผ๊ด€๋œ ํ™˜๊ฒฝ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

2. ์†Œ์Šค ์ฝ”๋“œ ๋ณต์‚ฌ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ด๋ฏธ์ง€ ์•ˆ์œผ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

# ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  ํŒŒ์ผ์„ /app ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณต์‚ฌ
COPY . /app
  • COPY: ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ ํŒŒ์ผ์„ ์ด๋ฏธ์ง€ ์•ˆ์œผ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ณต์‚ฌํ•  ์†Œ์Šค ๊ฒฝ๋กœ, ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ณต์‚ฌํ•  ๋ชฉ์ ์ง€ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.
  • .: ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, Dockerfile์ด ์œ„์น˜ํ•œ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • /app: ์ด๋ฏธ์ง€ ๋‚ด๋ถ€์˜ /app ๋””๋ ‰ํ† ๋ฆฌ์— ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

3. ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •

๋ณต์‚ฌํ•œ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์œ„์น˜ํ•œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

4. ์˜์กด์„ฑ ์„ค์น˜ ๋ฐ ๋นŒ๋“œ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์— ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์„ค์น˜ํ•˜๊ณ  ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

# ์˜์กด์„ฑ ์„ค์น˜ ๋ฐ ๋นŒ๋“œ
RUN npm ci && npm run build
  • RUN: ์ด๋ฏธ์ง€ ์•ˆ์—์„œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • npm ci: package-lock.json์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •ํ™•ํ•œ ์˜์กด์„ฑ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. npm install๋ณด๋‹ค ๋” ๋น ๋ฅด๊ณ  ์ผ๊ด€๋œ ์„ค์น˜๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
    • npm run build: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. Next.js ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, ์ •์  ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

5. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์— ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

# ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ •์˜
ENV PORT=3000
  • ENV: ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉํ•  ํฌํŠธ๋ฅผ 3000์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ•œ ๋ฒˆ์— ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
ENV PORT=3000 \
    NODE_ENV=production

6. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ๋ช…๋ น์–ด ์„ค์ •

์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
ENTRYPOINT ["npm", "run", "start"]
  • ENTRYPOINT: ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” npm run start ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • CMD์™€์˜ ์ฐจ์ด์ :
    • ENTRYPOINT๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ํ•ญ์ƒ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์„ค์ •ํ•˜๋ฉฐ, CMD๋Š” ๊ธฐ๋ณธ ์ธ์ž๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ENTRYPOINT๋Š” ๋” ๊ฐ•๋ ฅํ•œ ๋ช…๋ น์–ด ์‹คํ–‰ ์„ค์ •์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ตœ์ข… Dockerfile

์œ„์˜ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ์ข…ํ•ฉํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ Dockerfile์ด ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค.

# Node ์„ค์น˜ (๋ฒ ์ด์Šค ์ด๋ฏธ์ง€)
FROM node:20.15.1

# ์†Œ์Šค์ฝ”๋“œ ๋ณต์‚ฌ
COPY . /app

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

# ์˜์กด์„ฑ ์„ค์น˜ ๋ฐ ๋นŒ๋“œ
RUN npm ci && npm run build

# ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ •์˜
ENV PORT=3000

# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
ENTRYPOINT ["npm", "run", "start"]

 


.dockerignore ์„ค์ •

Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ, ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ์ด ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก .dockerignore ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.dockerignore ์˜ˆ์ œ

node_modules
dist
*.log
  • node_modules: ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์˜ ์˜์กด์„ฑ ํŒŒ์ผ๋“ค์ด ํฌํ•จ๋œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์˜์กด์„ฑ์„ ๋‹ค์‹œ ์„ค์น˜ํ•˜๋„๋ก ํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • dist: ๋นŒ๋“œ๋œ ํŒŒ์ผ๋“ค์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ํ•„์š” ์‹œ Dockerfile ๋‚ด์—์„œ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ, ๋ณ„๋„๋กœ ํฌํ•จํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • *.log: ๋กœ๊ทธ ํŒŒ์ผ๋“ค์„ ์ œ์™ธํ•˜์—ฌ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

Dockerfile์„ ์ž‘์„ฑํ•˜๊ณ  ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์€ ์ฒ˜์Œ์—๋Š” ๋ณต์žกํ•˜๊ฒŒ ๋Š๊ปด์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•œ ๋ฒˆ ์ต์ˆ™ํ•ด์ง€๋ฉด ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Dockerfile์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ์™€ ์ž‘์„ฑ ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.