๐Ÿš€ React + Vite ํ”„๋กœ์ ํŠธ๋ฅผ Docker๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•

Ma_Seokjaeยท2025๋…„ 2์›” 18์ผ
0
post-thumbnail

์ด ๊ธ€์—์„œ๋Š” React + Vite ํ”„๋กœ์ ํŠธ๋ฅผ Docker ์ปจํ…Œ์ด๋„ˆ๋กœ ํŒจํ‚ค์ง•ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์ „์ฒด ๊ณผ์ •์„ ๋‹ค๋ฃจ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

Dockerfile์„ ํ™œ์šฉํ•˜์—ฌ Node.js๋กœ ๋นŒ๋“œ ํ›„, Nginx๋ฅผ ์ด์šฉํ•œ ์ •์  ํŒŒ์ผ ์„œ๋น™ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

๋˜ํ•œ, ๊ฐ ๋ช…๋ น์–ด์˜ ์˜๋ฏธ์™€ ์ˆ˜ํ–‰ ์ด์œ ๋„ ํ•จ๊ป˜ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.


โœ… 1. ์™œ React + Vite๋ฅผ Docker ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰ํ• ๊นŒ?

๐Ÿ”น Docker๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ด์œ 

  1. ํ™˜๊ฒฝ ์ผ๊ด€์„ฑ ์œ ์ง€
    • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ, ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ, ์šด์˜ ํ™˜๊ฒฝ์„ ๋™์ผํ•œ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅ.
    • "๋‚ด ๋กœ์ปฌ์—์„œ๋Š” ์ž˜ ๋˜๋Š”๋ฐ?" ๊ฐ™์€ ๋ฌธ์ œ ํ•ด๊ฒฐ.
  2. ๋ฐฐํฌ ๋ฐ ๊ด€๋ฆฌ ํŽธ์˜์„ฑ
    • ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด๋‘๋ฉด ์–ด๋””์„œ๋“  ์‹คํ–‰ ๊ฐ€๋Šฅ.
    • Kubernetes, AWS ECS ๋“ฑ๊ณผ ์—ฐ๊ณ„ํ•˜์—ฌ ํ™•์žฅ ๊ฐ€๋Šฅ.
  3. Nginx๋ฅผ ํ™œ์šฉํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™”
    • React๋Š” ์ •์  ํŒŒ์ผ(HTML, CSS, JS)๋กœ ์ œ๊ณต๋˜๋ฏ€๋กœ,Node.js ๋Œ€์‹  Nginx๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ์„œ๋น™.

โœ… 2. ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ํŒŒ์ผ ๊ตฌ์กฐ

jungle-gym-ft/
โ”‚โ”€โ”€ src/                # React ํ”„๋กœ์ ํŠธ ์†Œ์Šค ์ฝ”๋“œ
โ”‚โ”€โ”€ public/             # ์ •์  ํŒŒ์ผ
โ”‚โ”€โ”€ package.json        # ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ ๋ฐ ์Šคํฌ๋ฆฝํŠธ
โ”‚โ”€โ”€ Dockerfile          # Docker ๋นŒ๋“œ ๋ฐ ์‹คํ–‰ ์„ค์ •
โ”‚โ”€โ”€ .dockerignore       # Docker ๋นŒ๋“œ ์‹œ ์ œ์™ธํ•  ํŒŒ์ผ ์„ค์ •


โœ… 3. Dockerfile ์ž‘์„ฑ ๋ฐ ๋ถ„์„

๐Ÿ“Œ Dockerfile

# 1๏ธโƒฃ Node.js ํ™˜๊ฒฝ์—์„œ React ๋นŒ๋“œ
FROM node:18 AS build
WORKDIR /app

# package.json๊ณผ package-lock.json์„ ๋จผ์ € ๋ณต์‚ฌํ•˜์—ฌ ์˜์กด์„ฑ ์„ค์น˜
COPY package.json package-lock.json ./
RUN npm install

# ์ „์ฒด ์†Œ์Šค ์ฝ”๋“œ ๋ณต์‚ฌ ํ›„ ๋นŒ๋“œ ์‹คํ–‰
COPY . .
RUN npm run build

# 2๏ธโƒฃ Nginx๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์  ํŒŒ์ผ ์„œ๋น™
FROM nginx:latest
COPY --from=build /app/dist /usr/share/nginx/html

# ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
ENV PORT=80
EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

๐Ÿ“Œ Dockerfile ์ƒ์„ธ ๋ถ„์„

๐Ÿ“ 1๏ธโƒฃ React ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ๋‹จ๊ณ„ (Build Stage)

FROM node:18 AS build

โœ… Node.js 18์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑ

  • ์ตœ์‹  React/Vite ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด Node.js 18 ํ™˜๊ฒฝ์„ ์‚ฌ์šฉ.
WORKDIR /app

โœ… ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์ž‘์—…ํ•  ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •

  • /app ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰.
COPY package.json package-lock.json ./
RUN npm install

โœ… ํŒจํ‚ค์ง€ ์„ค์น˜ ์ตœ์ ํ™”

  • package.json, package-lock.json๋งŒ ๋จผ์ € ๋ณต์‚ฌํ•˜๊ณ  npm install์„ ์‹คํ–‰.
  • ์ดํ›„ COPY . .์„ ์‹คํ–‰ํ•˜๋Š” ์ด์œ ๋Š” ๋ณ€๊ฒฝ์ด ์—†์œผ๋ฉด ์บ์‹ฑํ•˜์—ฌ ๋นŒ๋“œ ์†๋„ ๋‹จ์ถ•.
COPY . .
RUN npm run build

โœ… ์†Œ์Šค ์ฝ”๋“œ ๋ณต์‚ฌ ํ›„ ๋นŒ๋“œ

  • npm run build๋ฅผ ์‹คํ–‰ํ•˜์—ฌ dist/ ๋””๋ ‰ํ† ๋ฆฌ์— ์ •์  ํŒŒ์ผ์„ ์ƒ์„ฑ.

๐Ÿ“ 2๏ธโƒฃ Nginx๋กœ ์ •์  ํŒŒ์ผ ์„œ๋น™ (Runtime Stage)

FROM nginx:latest

โœ… Node.js๊ฐ€ ์•„๋‹Œ Nginx๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์  ํŒŒ์ผ ์„œ๋น™

  • React๋Š” SSR(Server Side Rendering)์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ,Nginx๋กœ ์ตœ์ ํ™”๋œ ์ •์  ํŒŒ์ผ ์ œ๊ณต.
COPY --from=build /app/dist /usr/share/nginx/html

โœ… ๋นŒ๋“œ๋œ ์ •์  ํŒŒ์ผ์„ Nginx์— ๋ณต์‚ฌ

  • dist/ ํด๋”๋ฅผ /usr/share/nginx/html๋กœ ๋ณต์‚ฌํ•˜๋ฉด Nginx๊ฐ€ ์ž๋™์œผ๋กœ index.html์„ ์„œ๋น™.
ENV PORT=80
EXPOSE 80

โœ… ํฌํŠธ ์„ค์ •

  • EXPOSE 80: ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ํฌํŠธ ์ง€์ •.
    • React ์•ฑ์„ ์‹คํ–‰ํ•  ๊ธฐ๋ณธ ํฌํŠธ๋กœ 80 ์‚ฌ์šฉ.
  • ENV PORT=80: ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • (ํ˜„์žฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ํ™•์žฅ ๊ฐ€๋Šฅ).
CMD ["nginx", "-g", "daemon off;"]

โœ… Nginx ์‹คํ–‰ ๋ช…๋ น์–ด

  • daemon off; โ†’ Nginx๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ์„ค์ •.

โœ… 4. .dockerignore ์ž‘์„ฑ

node_modules
dist
.vscode
.git
.env

โœ… Docker ๋นŒ๋“œ ์‹œ ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ์ œ์™ธ

  • node_modules : ์ด๋ฏธ์ง€์— ํฌํ•จํ•  ํ•„์š” ์—†์Œ.
  • dist : ๋กœ์ปฌ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ ํฌํ•จํ•˜์ง€ ์•Š์Œ (์ปจํ…Œ์ด๋„ˆ์—์„œ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ).
  • .git, .vscode : ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ด€๋ จ ํŒŒ์ผ ์ œ์™ธ.
  • .env : ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ณดํ˜ธ.

โœ… 5. Docker ๋นŒ๋“œ ๋ฐ ์‹คํ–‰

1๏ธโƒฃ Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ

docker build -t my-react-app .

โœ… ์ด ๋ช…๋ น์–ด์˜ ์˜๋ฏธ

  • t my-react-app : ์ƒ์„ฑ๋œ Docker ์ด๋ฏธ์ง€๋ฅผ my-react-app์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ €์žฅ.
  • . : ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” Dockerfile์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ.

[์‹คํ–‰ ๊ฒฐ๊ณผ]


2๏ธโƒฃ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

docker run -d -p 9080:80 --name react-container my-react-app

โœ… ์ด ๋ช…๋ น์–ด์˜ ์˜๋ฏธ

  • d : ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ชจ๋“œ์—์„œ ์‹คํ–‰.
  • p 9080:80 : ํ˜ธ์ŠคํŠธ์˜ 9080 ํฌํŠธ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ 80 ํฌํŠธ์™€ ๋งคํ•‘.
    • ์ฆ‰, http://localhost:9080๋กœ ์ ‘๊ทผํ•˜๋ฉด Nginx๊ฐ€ React ์•ฑ์„ ์ œ๊ณต.
  • -name react-container : ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ react-container๋กœ ์ง€์ •.

[์‹คํ–‰ ๊ฒฐ๊ณผ]


3๏ธโƒฃ ์‹คํ–‰๋œ ์ปจํ…Œ์ด๋„ˆ ํ™•์ธ

docker ps

์ถœ๋ ฅ ์˜ˆ์‹œ:

CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                  NAMES
a7dacc832e9e   my-react-app   "/docker-entrypoint.โ€ฆ"   4 seconds ago   Up 3 seconds   0.0.0.0:9080->80/tcp   react-container

โœ… ํ™•์ธํ•ด์•ผ ํ•  ๊ฒƒ

  • PORTS ๋ถ€๋ถ„์—์„œ 0.0.0.0:9080->80/tcp์ด ๋ณด์ด๋ฉด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋จ.

[์‹คํ–‰ ๊ฒฐ๊ณผ]


4๏ธโƒฃ ์›น์—์„œ ํ™•์ธ

๋ธŒ๋ผ์šฐ์ €์—์„œ ์•„๋ž˜ ์ฃผ์†Œ ์ž…๋ ฅ:

http://localhost:9080

โœ… ์ •์ƒ์ ์œผ๋กœ ํ™”๋ฉด์ด ๋œจ๋ฉด ์„ฑ๊ณต! ๐ŸŽ‰


โœ… 6. ์‹คํ–‰๋œ ์ปจํ…Œ์ด๋„ˆ ์ •๋ฆฌ

1๏ธโƒฃ ์ปจํ…Œ์ด๋„ˆ ์ค‘์ง€

docker stop react-container

โœ… ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ง€.

2๏ธโƒฃ ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ

docker rm react-container

โœ… ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ญ์ œ.

3๏ธโƒฃ Docker ์ด๋ฏธ์ง€ ์‚ญ์ œ

docker rmi my-react-app

โœ… ๋นŒ๋“œ๋œ Docker ์ด๋ฏธ์ง€๋ฅผ ์‚ญ์ œ.

4๏ธโƒฃ ๋ชจ๋“  ๋ถˆํ•„์š”ํ•œ Docker ๋ฐ์ดํ„ฐ ์ •๋ฆฌ

docker system prune -a

โœ… ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ, ์ด๋ฏธ์ง€, ๋ณผ๋ฅจ ๋“ฑ์„ ์‚ญ์ œ.

โš ๏ธ ์ฃผ์˜: ์‚ญ์ œ ํ›„ ๋ณต๊ตฌ ๋ถˆ๊ฐ€๋Šฅ.


โœ… 7. ์ตœ์ข… ์š”์•ฝ

๋‹จ๊ณ„๋ช…๋ น์–ด์„ค๋ช…
1. Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œdocker build -t my-react-app .my-react-app์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ Docker ์ด๋ฏธ์ง€ ์ƒ์„ฑ
2. ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰docker run -d -p 9080:80 --name react-container my-react-app์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ํ›„ 9080 ํฌํŠธ์—์„œ React ์•ฑ ์ œ๊ณต
3. ์‹คํ–‰ ํ™•์ธdocker ps์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ํ™•์ธ
4. ์›น์—์„œ ํ…Œ์ŠคํŠธhttp://localhost:9080React ์•ฑ ์ •์ƒ ๋™์ž‘ ํ™•์ธ
5. ์ปจํ…Œ์ด๋„ˆ ์ค‘์ง€docker stop react-container์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ
6. ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œdocker rm react-container์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ

โœ… ์ด์ œ Docker๋ฅผ ์ด์šฉํ•œ React ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค! ๐Ÿš€๐Ÿ”ฅ

profile
Why not change the code?

0๊ฐœ์˜ ๋Œ“๊ธ€