# 🐳 Docker κ°€μ΄λ“œ - WACE μ†”λ£¨μ…˜ (ERP-node) 이 λ¬Έμ„œλŠ” WACE μ†”λ£¨μ…˜μ˜ Docker ν™˜κ²½ μ„€μ • 및 μ‚¬μš©λ²•μ„ μ„€λͺ…ν•©λ‹ˆλ‹€. ## πŸ“‹ κ°œμš” **기술 μŠ€νƒ:** - **λ°±μ—”λ“œ**: Node.js + TypeScript + Prisma + PostgreSQL - **ν”„λ‘ νŠΈμ—”λ“œ**: Next.js + TypeScript + Tailwind CSS - **μ»¨ν…Œμ΄λ„ˆ**: Docker + Docker Compose **ν™˜κ²½:** - **개발**: Mac (λ³Όλ₯¨ 마운트 + Hot Reload) - **운영**: Linux μ„œλ²„ (μ΅œμ ν™”λœ ν”„λ‘œλ•μ…˜ λΉŒλ“œ) --- ## πŸ”§ 개발 ν™˜κ²½ (Mac) ### λΉ λ₯Έ μ‹œμž‘ ```bash # 전체 μ„œλΉ„μŠ€ μ‹œμž‘ (병렬 λΉŒλ“œ - κ°€μž₯ 빠름!) ./scripts/dev/start-all-parallel.sh ``` ### κ°œλ³„ μ„œλΉ„μŠ€ μ‹œμž‘ ```bash # λ°±μ—”λ“œλ§Œ μ‹œμž‘ ./scripts/dev/start-backend.sh # ν”„λ‘ νŠΈμ—”λ“œλ§Œ μ‹œμž‘ ./scripts/dev/start-frontend.sh ``` ### 개발용 Docker Compose νŒŒμΌλ“€ - **`docker/dev/docker-compose.backend.mac.yml`** - Mac 개발용 λ°±μ—”λ“œ - λ³Όλ₯¨ 마운트: `./backend-node:/app` (Hot Reload) - Dockerfile: `docker/dev/backend.Dockerfile` - 포트: `8080` - **`docker/dev/docker-compose.frontend.mac.yml`** - Mac 개발용 ν”„λ‘ νŠΈμ—”λ“œ - λ³Όλ₯¨ 마운트: `./frontend:/app` (Hot Reload) - Dockerfile: `docker/dev/frontend.Dockerfile` - 포트: `3000` ### 개발 ν™˜κ²½ νŠΉμ§• - βœ… **Hot Reload**: μ½”λ“œ λ³€κ²½ μ‹œ μžλ™ 반영 - βœ… **λ³Όλ₯¨ 마운트**: μ‹€μ‹œκ°„ 개발 - βœ… **디버그 λͺ¨λ“œ**: 상세 둜그 좜λ ₯ - βœ… **λΉ λ₯Έ μž¬μ‹œμž‘**: Docker μž¬λΉŒλ“œ λΆˆν•„μš” ### πŸ”₯ Hot Reload 상세 κ°€μ΄λ“œ #### βœ… **λ°”λ‘œ λ°˜μ˜λ˜λŠ” 것듀 (μ¦‰μ‹œ Hot Reload)** **λ°±μ—”λ“œ (Node.js + TypeScript):** ```bash backend-node/src/controllers/*.ts # API 컨트둀러 μˆ˜μ • backend-node/src/services/*.ts # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 μˆ˜μ • backend-node/src/routes/*.ts # λΌμš°ν„° μ„€μ • μˆ˜μ • backend-node/src/middleware/*.ts # 미듀웨어 μˆ˜μ • backend-node/src/utils/*.ts # μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜ μˆ˜μ • backend-node/src/types/*.ts # νƒ€μž… μ •μ˜ μˆ˜μ • backend-node/src/config/*.ts # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ • ``` β†’ **반영 μ‹œκ°„**: 1-2초 (nodemon μžλ™ μž¬μ‹œμž‘) **ν”„λ‘ νŠΈμ—”λ“œ (Next.js + TypeScript):** ```bash frontend/components/**/*.tsx # React μ»΄ν¬λ„ŒνŠΈ μˆ˜μ • frontend/app/**/*.tsx # νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈ μˆ˜μ • frontend/lib/**/*.ts # μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜ μˆ˜μ • frontend/hooks/*.ts # μ»€μŠ€ν…€ ν›… μˆ˜μ • frontend/types/*.ts # νƒ€μž… μ •μ˜ μˆ˜μ • frontend/constants/*.ts # μƒμˆ˜ μ •μ˜ μˆ˜μ • CSS/SCSS 파일 μˆ˜μ • # μŠ€νƒ€μΌ λ³€κ²½ ``` β†’ **반영 μ‹œκ°„**: μ¦‰μ‹œ (Fast Refresh) #### ❌ **Docker μž¬μ‹œμž‘μ΄ ν•„μš”ν•œ 것듀** **μ˜μ‘΄μ„± λ³€κ²½:** ```bash package.json μˆ˜μ • # μƒˆ νŒ¨ν‚€μ§€ μΆ”κ°€/제거 npm install / npm uninstall # νŒ¨ν‚€μ§€ μ„€μΉ˜/제거 package-lock.json λ³€κ²½ # μ˜μ‘΄μ„± 잠금 파일 ``` **Prisma κ΄€λ ¨:** ```bash backend-node/prisma/schema.prisma # DB μŠ€ν‚€λ§ˆ λ³€κ²½ npx prisma migrate # λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‹€ν–‰ npx prisma generate # ν΄λΌμ΄μ–ΈνŠΈ μž¬μƒμ„± ``` **μ„€μ • 파일:** ```bash next.config.mjs # Next.js μ„€μ • tsconfig.json # TypeScript μ„€μ • tailwind.config.js # Tailwind CSS μ„€μ • .env / .env.local # ν™˜κ²½ λ³€μˆ˜ eslint.config.mjs # ESLint μ„€μ • ``` **Docker κ΄€λ ¨:** ```bash Dockerfile / Dockerfile.dev # 도컀 파일 μˆ˜μ • docker-compose.*.yml # Docker Compose μ„€μ • .dockerignore # Docker λ¬΄μ‹œ 파일 ``` #### πŸ”„ **μž¬μ‹œμž‘ 방법** **νŠΉμ • μ„œλΉ„μŠ€λ§Œ μž¬μ‹œμž‘:** ```bash # λ°±μ—”λ“œλ§Œ μž¬μ‹œμž‘ docker-compose -f docker-compose.backend.mac.yml restart backend # ν”„λ‘ νŠΈμ—”λ“œλ§Œ μž¬μ‹œμž‘ docker-compose -f docker-compose.frontend.mac.yml restart frontend ``` **전체 μž¬λΉŒλ“œ:** ```bash # μ˜μ‘΄μ„± λ³€κ²½ μ‹œ (rebuild ν•„μš”) docker-compose -f docker-compose.backend.mac.yml up --build -d docker-compose -f docker-compose.frontend.mac.yml up --build -d ``` --- ## πŸš€ 운영 ν™˜κ²½ (Linux) ### 운영 μ„œλ²„ 배포 ```bash # Linux μ„œλ²„μ—μ„œ μ‹€ν–‰ ./scripts/prod/start-all-linux.sh ``` ### κ°œλ³„ μ„œλΉ„μŠ€ μ‹œμž‘ (운영용) ```bash # 직접 Docker Compose μ‚¬μš© docker-compose -f docker/prod/docker-compose.backend.prod.yml up -d docker-compose -f docker/prod/docker-compose.frontend.prod.yml up -d ``` ### 운영용 Docker Compose νŒŒμΌλ“€ - **`docker/prod/docker-compose.backend.prod.yml`** - 운영용 λ°±μ—”λ“œ - Dockerfile: `docker/prod/backend.Dockerfile` (ν”„λ‘œλ•μ…˜ μ΅œμ ν™”) - 포트: `8080` - ν™˜κ²½: `NODE_ENV=production` - **`docker/prod/docker-compose.frontend.prod.yml`** - 운영용 ν”„λ‘ νŠΈμ—”λ“œ - Dockerfile: `docker/prod/frontend.Dockerfile` (ν”„λ‘œλ•μ…˜ μ΅œμ ν™”) - 포트: `3000` - ν™˜κ²½: μ΅œμ ν™”λœ λΉŒλ“œ ### 운영 ν™˜κ²½ νŠΉμ§• - βœ… **μ΅œμ ν™”λœ λΉŒλ“œ**: ν”„λ‘œλ•μ…˜μš© 이미지 - βœ… **λ³΄μ•ˆ κ°•ν™”**: 운영 ν™˜κ²½ μ„€μ • - βœ… **μ„±λŠ₯ μ΅œμ ν™”**: 이미지 크기 μ΅œμ†Œν™” - βœ… **μ•ˆμ •μ„±**: ν”„λ‘œλ•μ…˜ λͺ¨λ“œ --- ## πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰 ``` ERP-node/ β”œβ”€β”€ πŸ”§ 개발용 (Mac) β”‚ β”œβ”€β”€ start-all-parallel.sh # 병렬 μ‹œμž‘ (μΆ”μ²œ) β”‚ β”œβ”€β”€ start-backend.sh # λ°±μ—”λ“œλ§Œ β”‚ β”œβ”€β”€ start-frontend.sh # ν”„λ‘ νŠΈμ—”λ“œλ§Œ β”‚ β”œβ”€β”€ docker-compose.backend.mac.yml # Mac 개발용 λ°±μ—”λ“œ β”‚ └── docker-compose.frontend.mac.yml# Mac 개발용 ν”„λ‘ νŠΈμ—”λ“œ β”‚ β”œβ”€β”€ πŸš€ 운영용 (Linux) β”‚ β”œβ”€β”€ start-all-separated-linux.sh # Linux 운영용 β”‚ β”œβ”€β”€ start-backend-linux.sh # λ°±μ—”λ“œλ§Œ (Linux) β”‚ β”œβ”€β”€ start-frontend-linux.sh # ν”„λ‘ νŠΈμ—”λ“œλ§Œ (Linux) β”‚ β”œβ”€β”€ docker-compose.backend.prod.yml# 운영용 λ°±μ—”λ“œ β”‚ └── docker-compose.frontend.prod.yml# 운영용 ν”„λ‘ νŠΈμ—”λ“œ β”‚ β”œβ”€β”€ πŸ“ λ°±μ—”λ“œ β”‚ β”œβ”€β”€ backend-node/ β”‚ β”‚ β”œβ”€β”€ Dockerfile # ν”„λ‘œλ•μ…˜μš© β”‚ β”‚ └── Dockerfile.dev # 개발용 β”‚ └── src/, prisma/, package.json... β”‚ β”œβ”€β”€ πŸ“ ν”„λ‘ νŠΈμ—”λ“œ β”‚ β”œβ”€β”€ frontend/ β”‚ β”‚ β”œβ”€β”€ Dockerfile # ν”„λ‘œλ•μ…˜μš© β”‚ β”‚ └── Dockerfile.dev # 개발용 β”‚ └── app/, components/, hooks/... β”‚ └── πŸ—‚οΈ 기타 β”œβ”€β”€ db/00-create-roles.sh # DB μ΄ˆκΈ°ν™” └── README.md, DOCKER.md... ``` --- ## 🌐 접속 정보 ### 개발 ν™˜κ²½ - **ν”„λ‘ νŠΈμ—”λ“œ**: http://localhost:3000 - **λ°±μ—”λ“œ API**: http://localhost:8080 - **전체 μ•±**: http://localhost:9771 (ν”„λ‘μ‹œ μ„€μ • μ‹œ) ### 운영 ν™˜κ²½ - **μ„œλ²„ IP에 따라 닀름** (Linux μ„œλ²„ μ„€μ • 확인) --- ## πŸ› οΈ μ£Όμš” λͺ…λ Ήμ–΄ ### Docker μ»¨ν…Œμ΄λ„ˆ 관리 ```bash # μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆ 확인 docker ps # λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ 쀑지 docker stop $(docker ps -q) # μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ»¨ν…Œμ΄λ„ˆ/이미지 정리 docker system prune -f ``` ### 둜그 확인 ```bash # λ°±μ—”λ“œ 둜그 docker logs pms-backend-mac -f # 개발용 docker logs pms-backend-prod -f # 운영용 # ν”„λ‘ νŠΈμ—”λ“œ 둜그 docker logs pms-frontend-mac -f # 개발용 docker logs pms-frontend-prod -f # 운영용 ``` ### μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€ 접속 ```bash # λ°±μ—”λ“œ μ»¨ν…Œμ΄λ„ˆ 접속 docker exec -it pms-backend-mac bash # 개발용 docker exec -it pms-backend-prod bash # 운영용 # ν”„λ‘ νŠΈμ—”λ“œ μ»¨ν…Œμ΄λ„ˆ 접속 docker exec -it pms-frontend-mac sh # 개발용 docker exec -it pms-frontend-prod sh # 운영용 ``` --- ## 🚨 νŠΈλŸ¬λΈ”μŠˆνŒ… ### 자주 λ°œμƒν•˜λŠ” λ¬Έμ œλ“€ #### 1. 포트 좩돌 ```bash # 포트 μ‚¬μš© 쀑인 ν”„λ‘œμ„ΈμŠ€ 확인 lsof -i :8080 lsof -i :3000 # ν”„λ‘œμ„ΈμŠ€ μ’…λ£Œ kill -9 ``` #### 2. Docker λΉŒλ“œ 였λ₯˜ ```bash # Docker μΊμ‹œ 클리어 ν›„ μž¬λΉŒλ“œ docker builder prune -f ./start-all-parallel.sh ``` #### 3. λ³Όλ₯¨ 마운트 문제 (κ°œλ°œν™˜κ²½) ```bash # Docker Desktop μ„€μ •μ—μ„œ 파일 곡유 확인 # Docker Desktop > Settings > Resources > File Sharing ``` #### 4. λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° 였λ₯˜ ```bash # λ°μ΄ν„°λ² μ΄μŠ€ μ΄ˆκΈ°ν™” ./db/00-create-roles.sh # PostgreSQL μ—°κ²° 확인 docker exec -it psql -U postgres ``` ### Warning λ©”μ‹œμ§€λ“€ (λ¬΄μ‹œν•΄λ„ 됨) ``` WARN: the attribute `version` is obsolete Network Error (μΌμ‹œμ ) ``` 이런 λ©”μ‹œμ§€λ“€μ€ Docker Compose 버전 차이둜 λ°œμƒν•˜λ©°, κΈ°λŠ₯μ—λŠ” 영ν–₯ μ—†μŠ΅λ‹ˆλ‹€. --- ## πŸ“ˆ μ„±λŠ₯ μ΅œμ ν™” ### 개발 ν™˜κ²½ μ΅œμ ν™” - βœ… **병렬 λΉŒλ“œ**: `start-all-parallel.sh` μ‚¬μš© - βœ… **Docker μΊμ‹œ**: `--no-cache` 제거됨 - βœ… **npm μ΅œμ ν™”**: `--prefer-offline --no-audit` 적용 ### 운영 ν™˜κ²½ μ΅œμ ν™” - βœ… **λ©€ν‹° μŠ€ν…Œμ΄μ§€ λΉŒλ“œ**: Dockerfile μ΅œμ ν™” - βœ… **이미지 크기 μ΅œμ†Œν™”**: Alpine Linux 기반 - βœ… **μ˜μ‘΄μ„± μΊμ‹œ**: λ ˆμ΄μ–΄ 캐싱 ν™œμš© --- ## πŸ”„ μ—…λ°μ΄νŠΈ κ°€μ΄λ“œ ### 개발 ν™˜κ²½ μ—…λ°μ΄νŠΈ ```bash # μ½”λ“œ λ³€κ²½ μ‹œ (Hot Reload μžλ™ 반영) # 별도 μž‘μ—… λΆˆν•„μš” # μ˜μ‘΄μ„± λ³€κ²½ μ‹œ docker-compose -f docker-compose.backend.mac.yml up --build -d ``` ### 운영 ν™˜κ²½ μ—…λ°μ΄νŠΈ ```bash # μƒˆλ‘œμš΄ 버전 배포 ./start-all-separated-linux.sh ``` --- ## πŸ“ž 지원 **문제 λ°œμƒ μ‹œ:** 1. 이 λ¬Έμ„œμ˜ νŠΈλŸ¬λΈ”μŠˆνŒ… μ„Ήμ…˜ 확인 2. Docker 둜그 확인 (`docker logs `) 3. κ°œλ°œνŒ€μ— 문의 **ν”„λ‘œμ νŠΈ κ΄€λ ¨:** - Node.js λ°±μ—”λ“œ: `backend-node/` 디렉토리 - Next.js ν”„λ‘ νŠΈμ—”λ“œ: `frontend/` 디렉토리 - λ°μ΄ν„°λ² μ΄μŠ€: PostgreSQL (JNDI μ„€μ •) --- **버전**: 1.0.0 **λ§ˆμ§€λ§‰ μ—…λ°μ΄νŠΈ**: 2024λ…„ 12μ›” 28일 **μž‘μ„±μž**: PLM κ°œλ°œνŒ€