# 백엔드 컨테이너 실행 가이드 ## 목차 1. [개요](#개요) 2. [VM 접속](#vm-접속) 3. [Git Repository 클론](#git-repository-클론) 4. [컨테이너 이미지 빌드](#컨테이너-이미지-빌드) 5. [컨테이너 레지스트리 설정](#컨테이너-레지스트리-설정) 6. [컨테이너 이미지 푸시](#컨테이너-이미지-푸시) 7. [컨테이너 실행](#컨테이너-실행) 8. [컨테이너 확인](#컨테이너-확인) 9. [재배포](#재배포) --- ## 개요 본 가이드는 **kt-event-marketing** 시스템의 백엔드 마이크로서비스들을 Docker 컨테이너로 실행하는 방법을 안내합니다. ### 시스템 정보 - **시스템명**: kt-event-marketing - **ACR명**: acrdigitalgarage01 - **서비스 목록**: - user-service (포트: 8081) - event-service (포트: 8080) - analytics-service (포트: 8086) - participation-service (포트: 8084) ### VM 정보 - **IP**: 20.196.65.160 - **사용자 ID**: P82265804@ktds.co.kr - **SSH Key 파일**: ~/home/bastion-dg0505 --- ## VM 접속 ### 1단계: 터미널 실행 - **Linux/Mac**: 기본 터미널 실행 - **Windows**: Windows Terminal 실행 ### 2단계: SSH Key 파일 권한 설정 (최초 1회) ```bash chmod 400 ~/home/bastion-dg0505 ``` ### 3단계: VM 접속 ```bash ssh -i ~/home/bastion-dg0505 P82265804@ktds.co.kr@20.196.65.160 ``` --- ## Git Repository 클론 ### 1단계: workspace 디렉토리 생성 및 이동 ```bash mkdir -p ~/home/workspace cd ~/home/workspace ``` ### 2단계: 소스 클론 ```bash git clone https://github.com/ktds-dg0501/kt-event-marketing.git ``` ### 3단계: 프로젝트 디렉토리로 이동 ```bash cd kt-event-marketing ``` --- ## 컨테이너 이미지 빌드 ### 이미지 빌드 가이드 참조 프로젝트 내 빌드 가이드를 참조하여 컨테이너 이미지를 생성합니다: ```bash # 빌드 가이드 파일 열기 cat deployment/container/build-image.md ``` 빌드 가이드에 따라 각 서비스의 컨테이너 이미지를 생성하세요. --- ## 컨테이너 레지스트리 설정 ### 1단계: ACR 인증 정보 확인 Azure CLI를 사용하여 ACR 인증 정보를 확인합니다: ```bash az acr credential show --name acrdigitalgarage01 ``` **출력 예시**: ```json { "passwords": [ { "name": "password", "value": "{암호}" }, { "name": "password2", "value": "{암호2}" } ], "username": "acrdigitalgarage01" } ``` - **ID**: `username` 값 (예: acrdigitalgarage01) - **암호**: `passwords[0].value` 값 ### 2단계: Docker 로그인 ```bash docker login acrdigitalgarage01.azurecr.io -u {ID} -p {암호} ``` **예시**: ```bash docker login acrdigitalgarage01.azurecr.io -u acrdigitalgarage01 -p mySecretPassword123 ``` --- ## 컨테이너 이미지 푸시 각 서비스의 이미지를 ACR에 푸시합니다. ### user-service ```bash docker tag user-service:latest acrdigitalgarage01.azurecr.io/kt-event-marketing/user-service:latest docker push acrdigitalgarage01.azurecr.io/kt-event-marketing/user-service:latest ``` ### event-service ```bash docker tag event-service:latest acrdigitalgarage01.azurecr.io/kt-event-marketing/event-service:latest docker push acrdigitalgarage01.azurecr.io/kt-event-marketing/event-service:latest ``` ### analytics-service ```bash docker tag analytics-service:latest acrdigitalgarage01.azurecr.io/kt-event-marketing/analytics-service:latest docker push acrdigitalgarage01.azurecr.io/kt-event-marketing/analytics-service:latest ``` ### participation-service ```bash docker tag participation-service:latest acrdigitalgarage01.azurecr.io/kt-event-marketing/participation-service:latest docker push acrdigitalgarage01.azurecr.io/kt-event-marketing/participation-service:latest ``` --- ## 컨테이너 실행 각 서비스를 Docker 컨테이너로 실행합니다. ### user-service 실행 ```bash SERVER_PORT=8081 docker run -d --name user-service --rm -p ${SERVER_PORT}:${SERVER_PORT} \ -e SERVER_PORT=8081 \ -e DB_URL=jdbc:postgresql://20.249.125.115:5432/userdb \ -e DB_DRIVER=org.postgresql.Driver \ -e DB_HOST=20.249.125.115 \ -e DB_PORT=5432 \ -e DB_NAME=userdb \ -e DB_USERNAME=eventuser \ -e DB_PASSWORD=Hi5Jessica! \ -e DB_KIND=postgresql \ -e DDL_AUTO=update \ -e SHOW_SQL=true \ -e JPA_DIALECT=org.hibernate.dialect.PostgreSQLDialect \ -e H2_CONSOLE_ENABLED=false \ -e REDIS_ENABLED=true \ -e REDIS_HOST=20.214.210.71 \ -e REDIS_PORT=6379 \ -e REDIS_PASSWORD=Hi5Jessica! \ -e REDIS_DATABASE=0 \ -e EXCLUDE_REDIS="" \ -e KAFKA_BOOTSTRAP_SERVERS=4.230.50.63:9092 \ -e KAFKA_CONSUMER_GROUP=user-service-consumers \ -e EXCLUDE_KAFKA="" \ -e JWT_SECRET=kt-event-marketing-secret-key-for-development-only-please-change-in-production \ -e JWT_ACCESS_TOKEN_VALIDITY=604800000 \ -e CORS_ALLOWED_ORIGINS="http://localhost:*,http://20.196.65.160:3000" \ -e LOG_LEVEL_APP=DEBUG \ -e LOG_LEVEL_WEB=INFO \ -e LOG_LEVEL_SQL=DEBUG \ -e LOG_LEVEL_SQL_TYPE=TRACE \ -e LOG_FILE_PATH=logs/user-service.log \ acrdigitalgarage01.azurecr.io/kt-event-marketing/user-service:latest ``` ### event-service 실행 ```bash SERVER_PORT=8080 docker run -d --name event-service --rm -p ${SERVER_PORT}:${SERVER_PORT} \ -e SERVER_PORT=8080 \ -e DB_HOST=20.249.177.232 \ -e DB_PORT=5432 \ -e DB_NAME=eventdb \ -e DB_USERNAME=eventuser \ -e DB_PASSWORD=Hi5Jessica! \ -e DDL_AUTO=update \ -e REDIS_HOST=20.214.210.71 \ -e REDIS_PORT=6379 \ -e REDIS_PASSWORD=Hi5Jessica! \ -e KAFKA_BOOTSTRAP_SERVERS=20.249.182.13:9095,4.217.131.59:9095 \ -e CONTENT_SERVICE_URL=http://localhost:8082 \ -e DISTRIBUTION_SERVICE_URL=http://localhost:8084 \ -e JWT_SECRET=kt-event-marketing-secret-key-for-development-only-please-change-in-production \ -e LOG_LEVEL=DEBUG \ -e SQL_LOG_LEVEL=DEBUG \ acrdigitalgarage01.azurecr.io/kt-event-marketing/event-service:latest ``` ### analytics-service 실행 ```bash SERVER_PORT=8086 docker run -d --name analytics-service --rm -p ${SERVER_PORT}:${SERVER_PORT} \ -e DB_KIND=postgresql \ -e DB_HOST=4.230.49.9 \ -e DB_PORT=5432 \ -e DB_NAME=analyticdb \ -e DB_USERNAME=eventuser \ -e DB_PASSWORD=Hi5Jessica! \ -e DDL_AUTO=update \ -e SHOW_SQL=true \ -e REDIS_HOST=20.214.210.71 \ -e REDIS_PORT=6379 \ -e REDIS_PASSWORD=Hi5Jessica! \ -e REDIS_DATABASE=5 \ -e KAFKA_ENABLED=true \ -e KAFKA_BOOTSTRAP_SERVERS=20.249.182.13:9095,4.217.131.59:9095 \ -e KAFKA_CONSUMER_GROUP_ID=analytics-service-consumers \ -e SAMPLE_DATA_ENABLED=true \ -e SERVER_PORT=8086 \ -e JWT_SECRET=dev-jwt-secret-key-for-development-only-kt-event-marketing \ -e JWT_ACCESS_TOKEN_VALIDITY=1800 \ -e JWT_REFRESH_TOKEN_VALIDITY=86400 \ -e CORS_ALLOWED_ORIGINS="http://localhost:*,http://20.196.65.160:3000" \ -e LOG_FILE=logs/analytics-service.log \ -e LOG_LEVEL_APP=DEBUG \ -e LOG_LEVEL_WEB=INFO \ -e LOG_LEVEL_SQL=DEBUG \ -e LOG_LEVEL_SQL_TYPE=TRACE \ acrdigitalgarage01.azurecr.io/kt-event-marketing/analytics-service:latest ``` ### participation-service 실행 ```bash SERVER_PORT=8084 docker run -d --name participation-service --rm -p ${SERVER_PORT}:${SERVER_PORT} \ -e DB_HOST=4.230.72.147 \ -e DB_NAME=participationdb \ -e DB_PASSWORD=Hi5Jessica! \ -e DB_PORT=5432 \ -e DB_USERNAME=eventuser \ -e DDL_AUTO=update \ -e JWT_EXPIRATION=86400000 \ -e JWT_SECRET=kt-event-marketing-secret-key-for-development-only-change-in-production \ -e KAFKA_BOOTSTRAP_SERVERS=20.249.182.13:9095,4.217.131.59:9095 \ -e LOG_FILE=logs/participation-service.log \ -e LOG_LEVEL=INFO \ -e REDIS_HOST=20.214.210.71 \ -e REDIS_PASSWORD=Hi5Jessica! \ -e REDIS_PORT=6379 \ -e SERVER_PORT=8084 \ -e SHOW_SQL=true \ acrdigitalgarage01.azurecr.io/kt-event-marketing/participation-service:latest ``` --- ## 컨테이너 확인 모든 서비스가 정상적으로 실행되었는지 확인합니다. ### 전체 서비스 확인 ```bash docker ps ``` ### 개별 서비스 확인 ```bash docker ps | grep user-service docker ps | grep event-service docker ps | grep analytics-service docker ps | grep participation-service ``` ### 서비스 로그 확인 ```bash docker logs user-service docker logs event-service docker logs analytics-service docker logs participation-service ``` --- ## 재배포 소스 코드 수정 후 재배포 방법입니다. ### 1단계: 로컬에서 수정된 소스 푸시 로컬 개발 환경에서 소스 수정 후 Git에 푸시합니다. ### 2단계: VM 접속 ```bash ssh -i ~/home/bastion-dg0505 P82265804@ktds.co.kr@20.196.65.160 ``` ### 3단계: 디렉토리 이동 및 소스 내려받기 ```bash cd ~/home/workspace/kt-event-marketing git pull ``` ### 4단계: 컨테이너 이미지 재생성 빌드 가이드에 따라 이미지를 재생성합니다: ```bash cat deployment/container/build-image.md ``` ### 5단계: 컨테이너 이미지 푸시 (예: user-service) ```bash docker tag user-service:latest acrdigitalgarage01.azurecr.io/kt-event-marketing/user-service:latest docker push acrdigitalgarage01.azurecr.io/kt-event-marketing/user-service:latest ``` ### 6단계: 기존 컨테이너 중지 ```bash docker stop user-service ``` ### 7단계: 컨테이너 이미지 삭제 ```bash docker rmi acrdigitalgarage01.azurecr.io/kt-event-marketing/user-service:latest ``` ### 8단계: 컨테이너 재실행 위 [컨테이너 실행](#컨테이너-실행) 섹션의 명령을 다시 실행합니다. --- ## 참고 사항 ### CORS 설정 - 프론트엔드 접근을 위해 `CORS_ALLOWED_ORIGINS` 환경변수에 `http://20.196.65.160:3000`이 추가되었습니다. - 필요에 따라 추가 도메인을 콤마(,)로 구분하여 추가할 수 있습니다. ### 포트 매핑 - user-service: 8081 - event-service: 8080 - analytics-service: 8086 - participation-service: 8084 ### 환경변수 보안 - 본 가이드는 개발 환경용입니다. - 운영 환경에서는 비밀번호, JWT 시크릿 등을 환경변수 파일이나 Secret 관리 시스템을 통해 관리해야 합니다. ### Docker 네트워크 - 현재는 호스트 네트워크 모드로 실행됩니다. - 서비스 간 통신이 필요한 경우 Docker 네트워크를 생성하여 사용하는 것을 권장합니다. --- ## 문제 해결 ### 컨테이너가 시작되지 않는 경우 ```bash docker logs {서비스명} ``` ### 포트가 이미 사용 중인 경우 ```bash # 포트 사용 프로세스 확인 sudo netstat -tulpn | grep {포트번호} # 기존 컨테이너 중지 docker stop {서비스명} ``` ### 이미지 다운로드 실패 ```bash # Docker 로그인 재시도 docker login acrdigitalgarage01.azurecr.io -u {ID} -p {암호} # 이미지 pull 재시도 docker pull acrdigitalgarage01.azurecr.io/kt-event-marketing/{서비스명}:latest ```