phonebill/deployment/container/run-container-guide.md
hiondal 99bef2c853 백엔드 컨테이너 실행 가이드 서비스 간 통신 설정 수정
- API Gateway의 마이크로서비스 URL을 VM IP로 변경
  - BILL_SERVICE_URL: localhost → 4.230.5.6:8082
  - KOS_MOCK_URL: localhost → 4.230.5.6:8084
  - PRODUCT_SERVICE_URL: localhost → 4.230.5.6:8083
  - USER_SERVICE_URL: localhost → 4.230.5.6:8081

- Bill Service의 KOS_BASE_URL을 VM IP로 변경
  - KOS_BASE_URL: localhost:8084 → 4.230.5.6:8084

- Product Service의 KOS_BASE_URL을 VM IP로 변경
  - KOS_BASE_URL: localhost:8084 → 4.230.5.6:8084

이 변경으로 VM 환경에서 마이크로서비스 간 통신이 정상적으로 작동합니다.
2025-09-10 23:01:28 +09:00

9.6 KiB

백엔드 컨테이너 실행 가이드

시스템 정보

  • 시스템명: 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. 로컬에서 컨테이너 이미지 확인

현재 생성된 컨테이너 이미지를 확인합니다.

docker images | grep -E "(api-gateway|user-service|bill-service|product-service|kos-mock)"

2. ACR 인증정보 확인

Azure CLI를 통해 ACR 인증정보를 확인합니다.

az acr credential show --name acrdigitalgarage01

결과 예시:

{
  "passwords": [
    {
      "name": "password",
      "value": "{암호}"
    },
    {
      "name": "password2", 
      "value": "{암호2}"
    }
  ],
  "username": "acrdigitalgarage01"
}

컨테이너 이미지 푸시

1. ACR 로그인 (로컬)

docker login acrdigitalgarage01.azurecr.io -u acrdigitalgarage01 -p {암호}

2. 이미지 태그 및 푸시

각 서비스별로 다음 명령을 실행합니다:

API Gateway

docker tag api-gateway:latest acrdigitalgarage01.azurecr.io/phonebill/api-gateway:latest
docker push acrdigitalgarage01.azurecr.io/phonebill/api-gateway:latest

User Service

docker tag user-service:latest acrdigitalgarage01.azurecr.io/phonebill/user-service:latest
docker push acrdigitalgarage01.azurecr.io/phonebill/user-service:latest

Bill Service

docker tag bill-service:latest acrdigitalgarage01.azurecr.io/phonebill/bill-service:latest
docker push acrdigitalgarage01.azurecr.io/phonebill/bill-service:latest

Product Service

docker tag product-service:latest acrdigitalgarage01.azurecr.io/phonebill/product-service:latest
docker push acrdigitalgarage01.azurecr.io/phonebill/product-service:latest

KOS Mock

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 사용자

터미널을 실행하고 다음 명령을 실행합니다:

# SSH 키 파일 권한 설정 (최초 한번만)
chmod 400 ~/home/bastion-dg0500

# VM 접속
ssh -i ~/home/bastion-dg0500 azureuser@4.230.5.6

Windows 사용자

Windows Terminal을 실행하고 동일한 명령을 실행합니다:

# SSH 키 파일 권한 설정 (최초 한번만)
chmod 400 ~/home/bastion-dg0500

# VM 접속
ssh -i ~/home/bastion-dg0500 azureuser@4.230.5.6

2. VM에서 ACR 로그인

docker login acrdigitalgarage01.azurecr.io -u acrdigitalgarage01 -p {암호}

3. 컨테이너 실행 명령

API Gateway (포트: 8080)

SERVER_PORT=8080

docker run -d --name api-gateway --rm -p ${SERVER_PORT}:${SERVER_PORT} \
-e BILL_SERVICE_URL=http://4.230.5.6: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://4.230.5.6:8084 \
-e PRODUCT_SERVICE_URL=http://4.230.5.6:8083 \
-e SERVER_PORT=${SERVER_PORT} \
-e SPRING_PROFILES_ACTIVE=dev \
-e USER_SERVICE_URL=http://4.230.5.6:8081 \
acrdigitalgarage01.azurecr.io/phonebill/api-gateway:latest

User Service (포트: 8081)

SERVER_PORT=8081

docker run -d --name user-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.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)

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://4.230.5.6: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)

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://4.230.5.6: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)

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. 컨테이너 실행 상태 확인

모든 컨테이너가 정상적으로 실행되고 있는지 확인합니다:

# 전체 컨테이너 상태 확인
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. 서비스 헬스체크

각 서비스가 정상적으로 응답하는지 확인합니다:

# 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. 컨테이너 이미지 재생성 (로컬)

/deploy-build-image-back

2. 컨테이너 이미지 푸시 (로컬)

각 서비스별로 실행:

# 예: 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에서 컨테이너 중지 및 재시작

# 컨테이너 중지
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

트러블슈팅

컨테이너 로그 확인

# 실시간 로그 확인
docker logs -f {서비스명}

# 최근 로그 확인  
docker logs --tail 100 {서비스명}

포트 사용 확인

# 포트 사용 상태 확인
netstat -tulpn | grep {포트번호}

네트워크 연결 테스트

# 서비스간 연결 테스트
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에서 컨테이너로 실행될 준비가 완료되었습니다.