# ๐Ÿณ Docker ์‹คํ–‰ ๊ฐ€์ด๋“œ REST API ์„œ๋ฒ„๋ฅผ Docker๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ## ๐Ÿ“‹ ์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ ### Windows - Docker Desktop for Windows - WSL2 (๊ถŒ์žฅ) ### Linux - Docker Engine - Docker Compose (์„ ํƒ์‚ฌํ•ญ) ### macOS - Docker Desktop for Mac ## ๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘ ### 1. Docker Compose ์‚ฌ์šฉ (๊ถŒ์žฅ) #### ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ ```bash # ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ docker-compose up -d # ๋กœ๊ทธ ํ™•์ธ docker-compose logs -f # ์ค‘์ง€ docker-compose down ``` #### ๊ฐœ๋ฐœ ๋ชจ๋“œ ```bash # ๊ฐœ๋ฐœ ๋ชจ๋“œ๋กœ ์‹คํ–‰ docker-compose -f docker-compose.dev.yml up # ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ docker-compose -f docker-compose.dev.yml up -d ``` ### 2. ์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ #### Windows ```cmd # ์ด๋ฏธ์ง€ ๋นŒ๋“œ scripts\docker-build.bat # ํ”„๋กœ๋•์…˜ ์‹คํ–‰ scripts\docker-run.bat # ๊ฐœ๋ฐœ ๋ชจ๋“œ ์‹คํ–‰ scripts\docker-run-dev.bat ``` #### Linux/macOS ```bash # ์‹คํ–‰ ๊ถŒํ•œ ๋ถ€์—ฌ (์ตœ์ดˆ 1ํšŒ) chmod +x scripts/*.sh # ์ด๋ฏธ์ง€ ๋นŒ๋“œ ./scripts/docker-build.sh # ํ”„๋กœ๋•์…˜ ์‹คํ–‰ ./scripts/docker-run.sh # ๊ฐœ๋ฐœ ๋ชจ๋“œ ์‹คํ–‰ ./scripts/docker-run-dev.sh ``` ## ๐Ÿ”ง ์ˆ˜๋™ Docker ๋ช…๋ น์–ด ### ์ด๋ฏธ์ง€ ๋นŒ๋“œ ```bash # ๊ธฐ๋ณธ ๋นŒ๋“œ docker build -t restapi-server:latest . # ์บ์‹œ ์—†์ด ๋นŒ๋“œ docker build --no-cache -t restapi-server:latest . # ํŠน์ • ์Šคํ…Œ์ด์ง€๊นŒ์ง€ ๋นŒ๋“œ docker build --target production -t restapi-server:latest . ``` ### ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ #### ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ ```bash docker run -d \ --name restapi-server \ --restart unless-stopped \ -p 5577:5577 \ -e NODE_ENV=production \ -e DB_HOST=39.117.244.52 \ -e DB_PORT=11521 \ -e DB_DATABASE=XE \ -e DB_USERNAME=wace \ -e DB_PASSWORD=wace0909!! \ -e PORT=5577 \ restapi-server:latest ``` #### ๊ฐœ๋ฐœ ๋ชจ๋“œ (๋ณผ๋ฅจ ๋งˆ์šดํŠธ) ```bash docker run -it \ --name restapi-server-dev \ -p 5577:5577 \ -e NODE_ENV=development \ -v $(pwd):/app \ -v /app/node_modules \ restapi-server:latest npm run dev ``` ## ๐Ÿ“Š ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ ### ์ƒํƒœ ํ™•์ธ ```bash # ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ํ™•์ธ docker ps # ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ํ™•์ธ docker ps -a # ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ธ ์ •๋ณด docker inspect restapi-server ``` ### ๋กœ๊ทธ ํ™•์ธ ```bash # ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ docker logs -f restapi-server # ์ตœ๊ทผ 100์ค„ docker logs --tail 100 restapi-server # ํŠน์ • ์‹œ๊ฐ„ ์ดํ›„ ๋กœ๊ทธ docker logs --since "2024-01-01T00:00:00" restapi-server ``` ### ์ปจํ…Œ์ด๋„ˆ ์ œ์–ด ```bash # ์ค‘์ง€ docker stop restapi-server # ์‹œ์ž‘ docker start restapi-server # ์žฌ์‹œ์ž‘ docker restart restapi-server # ์ œ๊ฑฐ docker rm restapi-server # ๊ฐ•์ œ ์ œ๊ฑฐ docker rm -f restapi-server ``` ### ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ์ ‘๊ทผ ```bash # ์‰˜ ์ ‘๊ทผ docker exec -it restapi-server /bin/sh # ํŠน์ • ๋ช…๋ น์–ด ์‹คํ–‰ docker exec restapi-server node -v ``` ## ๐Ÿ” ํ—ฌ์Šค์ฒดํฌ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ### ํ—ฌ์Šค์ฒดํฌ ํ™•์ธ ```bash # API ํ—ฌ์Šค์ฒดํฌ curl http://localhost:5577/api/health # Docker ํ—ฌ์Šค์ฒดํฌ ์ƒํƒœ docker inspect --format='{{.State.Health.Status}}' restapi-server ``` ### ๋ฆฌ์†Œ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง ```bash # ์‹ค์‹œ๊ฐ„ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ docker stats restapi-server # ์ปจํ…Œ์ด๋„ˆ ํ”„๋กœ์„ธ์Šค ํ™•์ธ docker top restapi-server ``` ## ๐Ÿ—‚ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ | ๋ณ€์ˆ˜๋ช… | ๊ธฐ๋ณธ๊ฐ’ | ์„ค๋ช… | |--------|--------|------| | NODE_ENV | production | ์‹คํ–‰ ํ™˜๊ฒฝ | | PORT | 9771 | ์„œ๋ฒ„ ํฌํŠธ | | DB_HOST | 39.117.244.52 | Oracle DB ํ˜ธ์ŠคํŠธ | | DB_PORT | 11521 | Oracle DB ํฌํŠธ | | DB_DATABASE | XE | ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„ | | DB_USERNAME | wace | DB ์‚ฌ์šฉ์ž๋ช… | | DB_PASSWORD | wace0909!! | DB ๋น„๋ฐ€๋ฒˆํ˜ธ | ### ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํŒŒ์ผ ์‚ฌ์šฉ ```bash # .env ํŒŒ์ผ ์ƒ์„ฑ cat > .env << EOF NODE_ENV=production PORT=5577 DB_HOST=39.117.244.52 DB_PORT=11521 DB_DATABASE=XE DB_USERNAME=wace DB_PASSWORD=wace0909!! EOF # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํŒŒ์ผ๋กœ ์‹คํ–‰ docker run --env-file .env -p 5577:5577 restapi-server:latest ``` ## ๐Ÿ”ง ๋ฌธ์ œ ํ•ด๊ฒฐ ### ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋“ค #### 1. Oracle Client ์˜ค๋ฅ˜ ```bash # ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ Oracle Client ํ™•์ธ docker exec restapi-server ls -la /opt/oracle/instantclient # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํ™•์ธ docker exec restapi-server env | grep ORACLE ``` #### 2. ํฌํŠธ ์ถฉ๋Œ ```bash # ํฌํŠธ ์‚ฌ์šฉ ํ™•์ธ netstat -tulpn | grep 9771 # ๋‹ค๋ฅธ ํฌํŠธ๋กœ ์‹คํ–‰ docker run -p 9772:9771 restapi-server:latest ``` #### 3. ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ```bash # ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์„ค์ • docker run -m 512m restapi-server:latest # ์Šค์™‘ ์ œํ•œ ์„ค์ • docker run -m 512m --memory-swap 1g restapi-server:latest ``` #### 4. ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๋ฌธ์ œ ```bash # ์ปจํ…Œ์ด๋„ˆ ๋„คํŠธ์›Œํฌ ํ™•์ธ docker network ls # ์ปจํ…Œ์ด๋„ˆ IP ํ™•์ธ docker inspect restapi-server | grep IPAddress ``` ### ๋กœ๊ทธ ๋ถ„์„ ```bash # ์—๋Ÿฌ ๋กœ๊ทธ๋งŒ ํ•„ํ„ฐ๋ง docker logs restapi-server 2>&1 | grep -i error # ํŠน์ • ํŒจํ„ด ๊ฒ€์ƒ‰ docker logs restapi-server 2>&1 | grep -i "oracle\|database" ``` ## ๐Ÿš€ ์„ฑ๋Šฅ ์ตœ์ ํ™” ### ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์ตœ์ ํ™” ```bash # ์ด๋ฏธ์ง€ ํฌ๊ธฐ ํ™•์ธ docker images restapi-server # ๋ ˆ์ด์–ด ๋ถ„์„ docker history restapi-server:latest ``` ### ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ ํ™œ์šฉ ํ˜„์žฌ Dockerfile์€ ์ด๋ฏธ ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค: - `base`: Oracle Client ์„ค์น˜ - `dependencies`: ํ”„๋กœ๋•์…˜ ์˜์กด์„ฑ๋งŒ ์„ค์น˜ - `dev-dependencies`: ๊ฐœ๋ฐœ ์˜์กด์„ฑ ํฌํ•จ - `production`: ์ตœ์ข… ์‹คํ–‰ ์ด๋ฏธ์ง€ ### ๋ฆฌ์†Œ์Šค ์ œํ•œ ```bash # CPU ์ œํ•œ docker run --cpus="1.5" restapi-server:latest # ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ docker run -m 1g restapi-server:latest # ๋ณตํ•ฉ ์ œํ•œ docker run --cpus="1.5" -m 1g restapi-server:latest ``` ## ๐Ÿ“ฆ ๋ฐฐํฌ ์ „๋žต ### 1. Blue-Green ๋ฐฐํฌ ```bash # Green ํ™˜๊ฒฝ ์‹คํ–‰ docker run -d --name restapi-server-green -p 9772:9771 restapi-server:latest # ํ—ฌ์Šค์ฒดํฌ ํ›„ ํŠธ๋ž˜ํ”ฝ ์ „ํ™˜ # Blue ํ™˜๊ฒฝ ์ค‘์ง€ docker stop restapi-server-blue ``` ### 2. ๋กค๋ง ์—…๋ฐ์ดํŠธ (Docker Swarm) ```bash # Swarm ๋ชจ๋“œ ์ดˆ๊ธฐํ™” docker swarm init # ์„œ๋น„์Šค ์ƒ์„ฑ docker service create --name restapi-server --replicas 3 -p 5577:5577 restapi-server:latest # ์—…๋ฐ์ดํŠธ docker service update --image restapi-server:v2 restapi-server ``` ### 3. ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์‚ฌ์šฉ ```bash # ์ด๋ฏธ์ง€ ํƒœ๊น… docker tag restapi-server:latest your-registry.com/restapi-server:v1.0.0 # ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ํ‘ธ์‹œ docker push your-registry.com/restapi-server:v1.0.0 # ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ํ’€ docker pull your-registry.com/restapi-server:v1.0.0 ``` ## ๐Ÿ” ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ ### 1. ๋น„root ์‚ฌ์šฉ์ž ์‹คํ–‰ Dockerfile์—์„œ ์ด๋ฏธ ๋น„root ์‚ฌ์šฉ์ž(`restapi`)๋กœ ์‹คํ–‰ํ•˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ### 2. ์‹œํฌ๋ฆฟ ๊ด€๋ฆฌ ```bash # Docker Secrets ์‚ฌ์šฉ (Swarm ๋ชจ๋“œ) echo "wace0909!!" | docker secret create db_password - # ์„œ๋น„์Šค์—์„œ ์‹œํฌ๋ฆฟ ์‚ฌ์šฉ docker service create --secret db_password restapi-server:latest ``` ### 3. ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ```bash # ์ปค์Šคํ…€ ๋„คํŠธ์›Œํฌ ์ƒ์„ฑ docker network create --driver bridge restapi-network # ๋„คํŠธ์›Œํฌ์— ์ปจํ…Œ์ด๋„ˆ ์—ฐ๊ฒฐ docker run --network restapi-network restapi-server:latest ``` ์ด์ œ Docker๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œˆ๋„์šฐ์™€ ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ REST API ์„œ๋ฒ„๋ฅผ ์‰ฝ๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!