
์ด ๊ธ์์๋ React + Vite ํ๋ก์ ํธ๋ฅผ Docker ์ปจํ ์ด๋๋ก ํจํค์งํ๊ณ ์คํํ๋ ์ ์ฒด ๊ณผ์ ์ ๋ค๋ฃจ๊ณ ์ ํฉ๋๋ค.
Dockerfile์ ํ์ฉํ์ฌ Node.js๋ก ๋น๋ ํ, Nginx๋ฅผ ์ด์ฉํ ์ ์ ํ์ผ ์๋น ๋ฐฉ์์ ์ค๋ช ํ๋๋ก ํ๊ฒ ์ต๋๋ค
๋ํ, ๊ฐ ๋ช ๋ น์ด์ ์๋ฏธ์ ์ํ ์ด์ ๋ ํจ๊ป ์ ๋ฆฌํ์์ต๋๋ค.
jungle-gym-ft/
โโโ src/ # React ํ๋ก์ ํธ ์์ค ์ฝ๋
โโโ public/ # ์ ์ ํ์ผ
โโโ package.json # ํ๋ก์ ํธ ์์กด์ฑ ๋ฐ ์คํฌ๋ฆฝํธ
โโโ Dockerfile # Docker ๋น๋ ๋ฐ ์คํ ์ค์
โโโ .dockerignore # Docker ๋น๋ ์ ์ ์ธํ ํ์ผ ์ค์

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 ์์ธ ๋ถ์FROM node:18 AS build
โ 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/ ๋๋ ํ ๋ฆฌ์ ์ ์ ํ์ผ์ ์์ฑ.FROM nginx:latest
โ Node.js๊ฐ ์๋ 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: ์ปจํ
์ด๋ ๋ด๋ถ์์ ์ฌ์ฉํ ํฌํธ ์ง์ .ENV PORT=80: ํ๊ฒฝ ๋ณ์ ์ค์ (ํ์ฌ ์ฌ์ฉํ์ง ์์ง๋ง ํ์ฅ ๊ฐ๋ฅ).CMD ["nginx", "-g", "daemon off;"]
โ Nginx ์คํ ๋ช ๋ น์ด
daemon off; โ Nginx๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํ๋์ง ์๋๋ก ์ค์ ..dockerignore ์์ฑnode_modules
dist
.vscode
.git
.env
โ Docker ๋น๋ ์ ๋ถํ์ํ ํ์ผ ์ ์ธ
node_modules : ์ด๋ฏธ์ง์ ํฌํจํ ํ์ ์์.dist : ๋ก์ปฌ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ ํฌํจํ์ง ์์ (์ปจํ
์ด๋์์ ๋ค์ ๋น๋ํ๊ธฐ ๋๋ฌธ)..git, .vscode : ๊ฐ๋ฐ ํ๊ฒฝ ๊ด๋ จ ํ์ผ ์ ์ธ..env : ํ๊ฒฝ ๋ณ์ ๋ณดํธ.docker build -t my-react-app .
โ ์ด ๋ช ๋ น์ด์ ์๋ฏธ
t my-react-app : ์์ฑ๋ Docker ์ด๋ฏธ์ง๋ฅผ my-react-app์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅ.. : ํ์ฌ ๋๋ ํ ๋ฆฌ์ ์๋ Dockerfile์ ์ฌ์ฉํ์ฌ ๋น๋.
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๋ก ์ง์ .
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์ด ๋ณด์ด๋ฉด ์ ์์ ์ผ๋ก ์คํ๋จ.
๋ธ๋ผ์ฐ์ ์์ ์๋ ์ฃผ์ ์ ๋ ฅ:
http://localhost:9080
โ
์ ์์ ์ผ๋ก ํ๋ฉด์ด ๋จ๋ฉด ์ฑ๊ณต! ๐

docker stop react-container
โ ์คํ ์ค์ธ ์ปจํ ์ด๋๋ฅผ ์ค์ง.
docker rm react-container
โ ์ปจํ ์ด๋๋ฅผ ์ญ์ .
docker rmi my-react-app
โ ๋น๋๋ Docker ์ด๋ฏธ์ง๋ฅผ ์ญ์ .
docker system prune -a
โ ์ฌ์ฉํ์ง ์๋ ๋ชจ๋ ์ปจํ ์ด๋, ์ด๋ฏธ์ง, ๋ณผ๋ฅจ ๋ฑ์ ์ญ์ .
โ ๏ธ ์ฃผ์: ์ญ์ ํ ๋ณต๊ตฌ ๋ถ๊ฐ๋ฅ.
| ๋จ๊ณ | ๋ช ๋ น์ด | ์ค๋ช |
|---|---|---|
| 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:9080 | React ์ฑ ์ ์ ๋์ ํ์ธ |
| 5. ์ปจํ ์ด๋ ์ค์ง | docker stop react-container | ์คํ ์ค์ธ ์ปจํ ์ด๋ ์ข ๋ฃ |
| 6. ์ปจํ ์ด๋ ์ญ์ | docker rm react-container | ์ปจํ ์ด๋ ์ญ์ |
โ ์ด์ Docker๋ฅผ ์ด์ฉํ React ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํด์ก์ต๋๋ค! ๐๐ฅ