From 91f4d4841c114fec0873cc393cc754af919e61ee Mon Sep 17 00:00:00 2001 From: hiondal Date: Wed, 10 Sep 2025 22:51:16 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B0=B1=EC=97=94=EB=93=9C=20=EC=BB=A8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EB=84=88=20=EC=8B=A4=ED=96=89=20=EA=B0=80?= =?UTF-8?q?=EC=9D=B4=EB=93=9C=20=EC=9E=91=EC=84=B1=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 5개 백엔드 서비스의 컨테이너 실행 가이드 작성 - 각 서비스의 환경변수를 .run.xml에서 추출하여 적용 - ACR(acrdigitalgarage01) 연동 및 이미지 푸시 가이드 - VM(4.230.5.6) 접속 및 컨테이너 실행 방법 - CORS 설정에 VM IP 주소 추가로 프론트엔드 호환성 확보 - 재배포, 헬스체크, 트러블슈팅 가이드 포함 대상 서비스: - api-gateway:8080 (API Gateway) - user-service:8081 (사용자 관리) - bill-service:8082 (요금 조회) - product-service:8083 (상품 변경) - kos-mock:8084 (KOS 목업) --- deployment/container/run-container-guide.md | 343 ++++++++++++++++++++ 1 file changed, 343 insertions(+) create mode 100644 deployment/container/run-container-guide.md diff --git a/deployment/container/run-container-guide.md b/deployment/container/run-container-guide.md new file mode 100644 index 0000000..23d84ea --- /dev/null +++ b/deployment/container/run-container-guide.md @@ -0,0 +1,343 @@ +# 백엔드 컨테이너 실행 가이드 + +## 시스템 정보 +- **시스템명**: phonebill +- **ACR명**: acrdigitalgarage01 +- **VM 정보**: + - IP: 4.230.5.6 + - 사용자: azureuser + - SSH 키: ~/home/bastion-dg0500 + +## 백엔드 서비스 목록 +총 5개의 백엔드 서비스를 컨테이너로 실행합니다. + +| 서비스명 | 포트 | 설명 | +|---------|------|------| +| api-gateway | 8080 | API Gateway 서비스 | +| user-service | 8081 | 사용자 관리 서비스 | +| bill-service | 8082 | 요금 조회 서비스 | +| product-service | 8083 | 상품 변경 서비스 | +| kos-mock | 8084 | KOS 시스템 목업 서비스 | + +## 사전 준비사항 + +### 1. 로컬에서 컨테이너 이미지 확인 +현재 생성된 컨테이너 이미지를 확인합니다. +```bash +docker images | grep -E "(api-gateway|user-service|bill-service|product-service|kos-mock)" +``` + +### 2. ACR 인증정보 확인 +Azure CLI를 통해 ACR 인증정보를 확인합니다. +```bash +az acr credential show --name acrdigitalgarage01 +``` + +결과 예시: +```json +{ + "passwords": [ + { + "name": "password", + "value": "{암호}" + }, + { + "name": "password2", + "value": "{암호2}" + } + ], + "username": "acrdigitalgarage01" +} +``` + +## 컨테이너 이미지 푸시 + +### 1. ACR 로그인 (로컬) +```bash +docker login acrdigitalgarage01.azurecr.io -u acrdigitalgarage01 -p {암호} +``` + +### 2. 이미지 태그 및 푸시 +각 서비스별로 다음 명령을 실행합니다: + +#### API Gateway +```bash +docker tag api-gateway:latest acrdigitalgarage01.azurecr.io/phonebill/api-gateway:latest +docker push acrdigitalgarage01.azurecr.io/phonebill/api-gateway:latest +``` + +#### User Service +```bash +docker tag user-service:latest acrdigitalgarage01.azurecr.io/phonebill/user-service:latest +docker push acrdigitalgarage01.azurecr.io/phonebill/user-service:latest +``` + +#### Bill Service +```bash +docker tag bill-service:latest acrdigitalgarage01.azurecr.io/phonebill/bill-service:latest +docker push acrdigitalgarage01.azurecr.io/phonebill/bill-service:latest +``` + +#### Product Service +```bash +docker tag product-service:latest acrdigitalgarage01.azurecr.io/phonebill/product-service:latest +docker push acrdigitalgarage01.azurecr.io/phonebill/product-service:latest +``` + +#### KOS Mock +```bash +docker tag kos-mock:latest acrdigitalgarage01.azurecr.io/phonebill/kos-mock:latest +docker push acrdigitalgarage01.azurecr.io/phonebill/kos-mock:latest +``` + +## VM 접속 및 컨테이너 실행 + +### 1. VM 접속 + +#### Linux/Mac 사용자 +터미널을 실행하고 다음 명령을 실행합니다: + +```bash +# SSH 키 파일 권한 설정 (최초 한번만) +chmod 400 ~/home/bastion-dg0500 + +# VM 접속 +ssh -i ~/home/bastion-dg0500 azureuser@4.230.5.6 +``` + +#### Windows 사용자 +Windows Terminal을 실행하고 동일한 명령을 실행합니다: + +```bash +# SSH 키 파일 권한 설정 (최초 한번만) +chmod 400 ~/home/bastion-dg0500 + +# VM 접속 +ssh -i ~/home/bastion-dg0500 azureuser@4.230.5.6 +``` + +### 2. VM에서 ACR 로그인 +```bash +docker login acrdigitalgarage01.azurecr.io -u acrdigitalgarage01 -p {암호} +``` + +### 3. 컨테이너 실행 명령 + +#### API Gateway (포트: 8080) +```bash +SERVER_PORT=8080 + +docker run -d --name api-gateway --rm -p ${SERVER_PORT}:${SERVER_PORT} \ +-e BILL_SERVICE_URL=http://localhost:8082 \ +-e CORS_ALLOWED_ORIGINS="http://localhost:3000,http://4.230.5.6:3000" \ +-e JWT_ACCESS_TOKEN_VALIDITY=18000000 \ +-e JWT_REFRESH_TOKEN_VALIDITY=86400000 \ +-e JWT_SECRET="nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ==" \ +-e KOS_MOCK_URL=http://localhost:8084 \ +-e PRODUCT_SERVICE_URL=http://localhost:8083 \ +-e SERVER_PORT=${SERVER_PORT} \ +-e SPRING_PROFILES_ACTIVE=dev \ +-e USER_SERVICE_URL=http://localhost:8081 \ +acrdigitalgarage01.azurecr.io/phonebill/api-gateway:latest +``` + +#### User Service (포트: 8081) +```bash +SERVER_PORT=8081 + +docker run -d --name user-service --rm -p ${SERVER_PORT}:${SERVER_PORT} \ +-e BILL_INQUIRY_URL=http://localhost:8082 \ +-e CORS_ALLOWED_ORIGINS="http://localhost:3000,http://4.230.5.6:3000" \ +-e DB_HOST=20.249.70.6 \ +-e DB_KIND=postgresql \ +-e DB_NAME=phonebill_auth \ +-e DB_PASSWORD="AuthUser2025!" \ +-e DB_PORT=5432 \ +-e DB_USERNAME=auth_user \ +-e DDL_AUTO=update \ +-e JWT_ACCESS_TOKEN_VALIDITY=18000000 \ +-e JWT_REFRESH_TOKEN_VALIDITY=86400000 \ +-e JWT_SECRET="nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ==" \ +-e REDIS_DATABASE=0 \ +-e REDIS_HOST=20.249.193.103 \ +-e REDIS_PASSWORD="Redis2025Dev!" \ +-e REDIS_PORT=6379 \ +-e SERVER_PORT=${SERVER_PORT} \ +-e SHOW_SQL=true \ +-e SPRING_PROFILES_ACTIVE=dev \ +acrdigitalgarage01.azurecr.io/phonebill/user-service:latest +``` + +#### Bill Service (포트: 8082) +```bash +SERVER_PORT=8082 + +docker run -d --name bill-service --rm -p ${SERVER_PORT}:${SERVER_PORT} \ +-e CORS_ALLOWED_ORIGINS="http://localhost:3000,http://4.230.5.6:3000" \ +-e DB_CONNECTION_TIMEOUT=30000 \ +-e DB_HOST=20.249.175.46 \ +-e DB_IDLE_TIMEOUT=600000 \ +-e DB_KIND=postgresql \ +-e DB_LEAK_DETECTION=60000 \ +-e DB_MAX_LIFETIME=1800000 \ +-e DB_MAX_POOL=20 \ +-e DB_MIN_IDLE=5 \ +-e DB_NAME=bill_inquiry_db \ +-e DB_PASSWORD="BillUser2025!" \ +-e DB_PORT=5432 \ +-e DB_USERNAME=bill_inquiry_user \ +-e JWT_ACCESS_TOKEN_VALIDITY=18000000 \ +-e JWT_REFRESH_TOKEN_VALIDITY=86400000 \ +-e JWT_SECRET="nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ==" \ +-e KOS_BASE_URL=http://localhost:8084 \ +-e LOG_FILE_NAME=logs/bill-service.log \ +-e REDIS_DATABASE=1 \ +-e REDIS_HOST=20.249.193.103 \ +-e REDIS_MAX_ACTIVE=8 \ +-e REDIS_MAX_IDLE=8 \ +-e REDIS_MAX_WAIT=-1 \ +-e REDIS_MIN_IDLE=0 \ +-e REDIS_PASSWORD="Redis2025Dev!" \ +-e REDIS_PORT=6379 \ +-e REDIS_TIMEOUT=2000 \ +-e SERVER_PORT=${SERVER_PORT} \ +-e SPRING_PROFILES_ACTIVE=dev \ +acrdigitalgarage01.azurecr.io/phonebill/bill-service:latest +``` + +#### Product Service (포트: 8083) +```bash +SERVER_PORT=8083 + +docker run -d --name product-service --rm -p ${SERVER_PORT}:${SERVER_PORT} \ +-e CORS_ALLOWED_ORIGINS="http://localhost:3000,http://4.230.5.6:3000" \ +-e DB_HOST=20.249.107.185 \ +-e DB_KIND=postgresql \ +-e DB_NAME=product_change_db \ +-e DB_PASSWORD="ProductUser2025!" \ +-e DB_PORT=5432 \ +-e DB_USERNAME=product_change_user \ +-e DDL_AUTO=update \ +-e JWT_ACCESS_TOKEN_VALIDITY=18000000 \ +-e JWT_REFRESH_TOKEN_VALIDITY=86400000 \ +-e JWT_SECRET="nwe5Yo9qaJ6FBD/Thl2/j6/SFAfNwUorAY1ZcWO2KI7uA4bmVLOCPxE9hYuUpRCOkgV2UF2DdHXtqHi3+BU/ecbz2zpHyf/720h48UbA3XOMYOX1sdM+dQ==" \ +-e KOS_API_KEY=dev-api-key \ +-e KOS_BASE_URL=http://localhost:8084 \ +-e KOS_CLIENT_ID=product-service-dev \ +-e KOS_MOCK_ENABLED=true \ +-e REDIS_DATABASE=2 \ +-e REDIS_HOST=20.249.193.103 \ +-e REDIS_PASSWORD="Redis2025Dev!" \ +-e REDIS_PORT=6379 \ +-e SERVER_PORT=${SERVER_PORT} \ +-e SPRING_PROFILES_ACTIVE=dev \ +acrdigitalgarage01.azurecr.io/phonebill/product-service:latest +``` + +#### KOS Mock (포트: 8084) +```bash +SERVER_PORT=8084 + +docker run -d --name kos-mock --rm -p ${SERVER_PORT}:${SERVER_PORT} \ +-e SERVER_PORT=${SERVER_PORT} \ +-e SPRING_PROFILES_ACTIVE=dev \ +acrdigitalgarage01.azurecr.io/phonebill/kos-mock:latest +``` + +### 4. 컨테이너 실행 상태 확인 +모든 컨테이너가 정상적으로 실행되고 있는지 확인합니다: + +```bash +# 전체 컨테이너 상태 확인 +docker ps + +# 서비스별 개별 확인 +docker ps | grep api-gateway +docker ps | grep user-service +docker ps | grep bill-service +docker ps | grep product-service +docker ps | grep kos-mock +``` + +### 5. 서비스 헬스체크 +각 서비스가 정상적으로 응답하는지 확인합니다: + +```bash +# API Gateway +curl http://localhost:8080/actuator/health + +# User Service +curl http://localhost:8081/actuator/health + +# Bill Service +curl http://localhost:8082/actuator/health + +# Product Service +curl http://localhost:8083/actuator/health + +# KOS Mock +curl http://localhost:8084/actuator/health +``` + +## 재배포 방법 + +### 1. 컨테이너 이미지 재생성 (로컬) +```bash +/deploy-build-image-back +``` + +### 2. 컨테이너 이미지 푸시 (로컬) +각 서비스별로 실행: +```bash +# 예: User Service 재배포 +docker tag user-service:latest acrdigitalgarage01.azurecr.io/phonebill/user-service:latest +docker push acrdigitalgarage01.azurecr.io/phonebill/user-service:latest +``` + +### 3. VM에서 컨테이너 중지 및 재시작 +```bash +# 컨테이너 중지 +docker stop user-service + +# 이미지 삭제 (새 버전 pull을 위해) +docker rmi acrdigitalgarage01.azurecr.io/phonebill/user-service:latest + +# 컨테이너 재실행 (위의 실행 명령 재사용) +SERVER_PORT=8081 +docker run -d --name user-service --rm -p ${SERVER_PORT}:${SERVER_PORT} \ +[환경변수들...] \ +acrdigitalgarage01.azurecr.io/phonebill/user-service:latest +``` + +## 트러블슈팅 + +### 컨테이너 로그 확인 +```bash +# 실시간 로그 확인 +docker logs -f {서비스명} + +# 최근 로그 확인 +docker logs --tail 100 {서비스명} +``` + +### 포트 사용 확인 +```bash +# 포트 사용 상태 확인 +netstat -tulpn | grep {포트번호} +``` + +### 네트워크 연결 테스트 +```bash +# 서비스간 연결 테스트 +curl http://localhost:{포트}/actuator/health +``` + +## 중요사항 + +1. **CORS 설정**: 모든 서비스의 CORS_ALLOWED_ORIGINS에 VM IP가 추가되어 있습니다 (`http://4.230.5.6:3000`) +2. **환경변수**: 모든 환경변수가 .run.xml 파일에서 추출되어 정확히 설정됩니다 +3. **포트 매핑**: 각 서비스의 내부 포트와 호스트 포트가 동일하게 설정됩니다 +4. **자동 재시작**: `--rm` 옵션으로 컨테이너 종료 시 자동 삭제됩니다 +5. **백그라운드 실행**: `-d` 옵션으로 데몬 모드로 실행됩니다 + +이제 모든 백엔드 서비스가 VM에서 컨테이너로 실행될 준비가 완료되었습니다. \ No newline at end of file