mirror of
https://github.com/ktds-dg0501/kt-event-marketing.git
synced 2026-06-13 16:19:11 +00:00
백엔드 서비스 AKS 배포 및 설정 완료
- Kubernetes 매니페스트 파일 생성 (7개 서비스) * user-service, event-service, ai-service, content-service * participation-service, analytics-service, distribution-service * 공통 리소스: Ingress, ConfigMap, Secret, ImagePullSecret - analytics-service 배포 문제 해결 * Hibernate PostgreSQL dialect 추가 * DB 자격증명 수정 (eventuser/Hi5Jessica!) * analytics_db 데이터베이스 생성 - content-service Probe 경로 수정 * Context path 포함 (/api/v1/content/actuator/health) - distribution-service 신규 배포 * Docker 이미지 빌드 및 ACR 푸시 * K8s 매니페스트 생성 및 배포 * Ingress 경로 추가 (/distribution) - Gradle bootJar 설정 추가 * 5개 서비스에 archiveFileName 설정 - 배포 가이드 문서 추가 * deployment/k8s/deploy-k8s-guide.md * claude/deploy-k8s-back.md * deployment/container/build-image.md 업데이트 배포 완료: 모든 백엔드 서비스(7개) 정상 실행 중 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
+347
-272
@@ -1,321 +1,396 @@
|
||||
# Event Service 컨테이너 이미지 빌드 가이드
|
||||
# 백엔드 컨테이너 이미지 작성 결과
|
||||
|
||||
## 1. 빌드 일시
|
||||
- **빌드 날짜**: 2025-10-28
|
||||
- **빌드 시간**: 14:35 KST
|
||||
## 작업 개요
|
||||
- **작업일시**: 2025-10-29
|
||||
- **작성자**: DevOps Engineer (송근정 "데브옵스 마스터")
|
||||
- **대상 서비스**: 6개 백엔드 마이크로서비스
|
||||
|
||||
## 2. 수정 사항
|
||||
## 1. 서비스 확인
|
||||
|
||||
### 2.1 타입 불일치 수정
|
||||
Event Service 컴파일 오류 해결을 위해 다음 파일들을 수정했습니다:
|
||||
### settings.gradle 분석
|
||||
```gradle
|
||||
rootProject.name = 'kt-event-marketing'
|
||||
|
||||
#### UserPrincipal.java (common 모듈)
|
||||
- **파일 경로**: `common/src/main/java/com/kt/event/common/security/UserPrincipal.java`
|
||||
- **수정 내용**: userId와 storeId 타입을 Long에서 UUID로 변경
|
||||
- **변경 이유**: EventService의 메서드 시그니처가 UUID를 기대하므로 일관성 유지
|
||||
// Common module
|
||||
include 'common'
|
||||
|
||||
```java
|
||||
// Before
|
||||
private final Long userId;
|
||||
private final Long storeId;
|
||||
|
||||
// After
|
||||
private final UUID userId;
|
||||
private final UUID storeId;
|
||||
// Microservices
|
||||
include 'user-service'
|
||||
include 'event-service'
|
||||
include 'ai-service'
|
||||
include 'content-service'
|
||||
include 'distribution-service'
|
||||
include 'participation-service'
|
||||
include 'analytics-service'
|
||||
```
|
||||
|
||||
#### JwtTokenProvider.java (common 모듈)
|
||||
- **파일 경로**: `common/src/main/java/com/kt/event/common/security/JwtTokenProvider.java`
|
||||
- **수정 내용**: JWT 토큰 파싱 시 Long.parseLong()을 UUID.fromString()으로 변경
|
||||
- **변경 이유**: UserPrincipal의 타입 변경에 따른 파싱 로직 수정
|
||||
### 빌드 가능한 서비스 (6개)
|
||||
Main Application 클래스가 존재하는 서비스:
|
||||
1. **user-service** - `UserServiceApplication.java`
|
||||
2. **event-service** - `EventServiceApplication.java`
|
||||
3. **ai-service** - `AiServiceApplication.java`
|
||||
4. **content-service** - `ContentApplication.java`
|
||||
5. **participation-service** - `ParticipationServiceApplication.java`
|
||||
6. **analytics-service** - `AnalyticsServiceApplication.java`
|
||||
|
||||
```java
|
||||
// Before
|
||||
Long userId = Long.parseLong(claims.getSubject());
|
||||
Long storeId = storeIdStr != null ? Long.parseLong(storeIdStr) : null;
|
||||
### 제외된 서비스
|
||||
- **distribution-service**: 소스 코드 미구현 상태 (src/main/java 디렉토리 없음)
|
||||
|
||||
// After
|
||||
UUID userId = UUID.fromString(claims.getSubject());
|
||||
UUID storeId = storeIdStr != null ? UUID.fromString(storeIdStr) : null;
|
||||
```
|
||||
## 2. bootJar 설정
|
||||
|
||||
#### event-service/build.gradle
|
||||
- **수정 내용**: bootJar 설정 추가
|
||||
- **변경 이유**: 컨테이너 이미지 빌드를 위한 JAR 파일명 명시
|
||||
각 서비스의 `build.gradle`에 bootJar 설정 추가/수정:
|
||||
|
||||
### 설정 추가된 서비스 (5개)
|
||||
```gradle
|
||||
bootJar {
|
||||
archiveFileName = 'event-service.jar'
|
||||
archiveFileName = '{service-name}.jar'
|
||||
}
|
||||
```
|
||||
|
||||
## 3. 빌드 명령어
|
||||
- user-service/build.gradle
|
||||
- ai-service/build.gradle
|
||||
- distribution-service/build.gradle (향후 구현 대비)
|
||||
- participation-service/build.gradle
|
||||
- analytics-service/build.gradle
|
||||
|
||||
### 3.1 Common 모듈 컴파일
|
||||
```bash
|
||||
./gradlew common:compileJava
|
||||
### 기존 설정 확인된 서비스 (2개)
|
||||
- event-service/build.gradle ✅
|
||||
- content-service/build.gradle ✅
|
||||
|
||||
## 3. Dockerfile 생성
|
||||
|
||||
### 파일 경로
|
||||
`deployment/container/Dockerfile-backend`
|
||||
|
||||
### Dockerfile 내용
|
||||
```dockerfile
|
||||
# Build stage
|
||||
FROM openjdk:23-oraclelinux8 AS builder
|
||||
ARG BUILD_LIB_DIR
|
||||
ARG ARTIFACTORY_FILE
|
||||
COPY ${BUILD_LIB_DIR}/${ARTIFACTORY_FILE} app.jar
|
||||
|
||||
# Run stage
|
||||
FROM openjdk:23-slim
|
||||
ENV USERNAME=k8s
|
||||
ENV ARTIFACTORY_HOME=/home/${USERNAME}
|
||||
ENV JAVA_OPTS=""
|
||||
|
||||
# Add a non-root user
|
||||
RUN adduser --system --group ${USERNAME} && \
|
||||
mkdir -p ${ARTIFACTORY_HOME} && \
|
||||
chown ${USERNAME}:${USERNAME} ${ARTIFACTORY_HOME}
|
||||
|
||||
WORKDIR ${ARTIFACTORY_HOME}
|
||||
COPY --from=builder app.jar app.jar
|
||||
RUN chown ${USERNAME}:${USERNAME} app.jar
|
||||
|
||||
USER ${USERNAME}
|
||||
|
||||
ENTRYPOINT [ "sh", "-c" ]
|
||||
CMD ["java ${JAVA_OPTS} -jar app.jar"]
|
||||
```
|
||||
|
||||
**결과**: BUILD SUCCESSFUL in 6s
|
||||
### Dockerfile 특징
|
||||
- **Multi-stage build**: 빌드와 실행 스테이지 분리
|
||||
- **Non-root user**: 보안을 위한 k8s 사용자 실행
|
||||
- **플랫폼**: linux/amd64 (K8s 클러스터 호환)
|
||||
- **Java 버전**: OpenJDK 23
|
||||
|
||||
### 3.2 Event Service 컴파일
|
||||
## 4. JAR 파일 빌드
|
||||
|
||||
### 빌드 명령어
|
||||
```bash
|
||||
./gradlew event-service:compileJava
|
||||
./gradlew user-service:bootJar ai-service:bootJar event-service:bootJar \
|
||||
content-service:bootJar participation-service:bootJar analytics-service:bootJar
|
||||
```
|
||||
|
||||
**결과**: BUILD SUCCESSFUL in 6s
|
||||
|
||||
### 3.3 Event Service JAR 빌드
|
||||
```bash
|
||||
./gradlew event-service:bootJar
|
||||
### 빌드 결과
|
||||
```
|
||||
BUILD SUCCESSFUL in 27s
|
||||
33 actionable tasks: 15 executed, 18 up-to-date
|
||||
```
|
||||
|
||||
**결과**:
|
||||
- BUILD SUCCESSFUL in 5s
|
||||
- JAR 파일 생성: `event-service/build/libs/event-service.jar` (94MB)
|
||||
|
||||
### 3.4 Docker 이미지 빌드
|
||||
### 생성된 JAR 파일
|
||||
```bash
|
||||
$ ls -lh */build/libs/*.jar
|
||||
|
||||
-rw-r--r-- 1 KTDS 197121 94M 10월 29 09:49 ai-service/build/libs/ai-service.jar
|
||||
-rw-r--r-- 1 KTDS 197121 95M 10월 29 09:48 analytics-service/build/libs/analytics-service.jar
|
||||
-rw-r--r-- 1 KTDS 197121 78M 10월 29 09:49 content-service/build/libs/content-service.jar
|
||||
-rw-r--r-- 1 KTDS 197121 94M 10월 29 09:49 event-service/build/libs/event-service.jar
|
||||
-rw-r--r-- 1 KTDS 197121 85M 10월 29 09:49 participation-service/build/libs/participation-service.jar
|
||||
-rw-r--r-- 1 KTDS 197121 96M 10월 29 09:49 user-service/build/libs/user-service.jar
|
||||
```
|
||||
|
||||
## 5. Docker 이미지 빌드
|
||||
|
||||
### 사전 준비사항
|
||||
⚠️ **Docker Desktop이 실행 중이어야 합니다**
|
||||
|
||||
Docker Desktop 시작 확인:
|
||||
```bash
|
||||
# Docker 상태 확인
|
||||
docker version
|
||||
docker ps
|
||||
|
||||
# Docker Desktop이 정상 실행되면 위 명령들이 정상 동작합니다
|
||||
```
|
||||
|
||||
### 빌드 명령어
|
||||
|
||||
#### 5.1 user-service
|
||||
```bash
|
||||
DOCKER_FILE=deployment/container/Dockerfile-backend
|
||||
|
||||
docker build \
|
||||
--platform linux/amd64 \
|
||||
--build-arg BUILD_LIB_DIR="user-service/build/libs" \
|
||||
--build-arg ARTIFACTORY_FILE="user-service.jar" \
|
||||
-f ${DOCKER_FILE} \
|
||||
-t user-service:latest .
|
||||
```
|
||||
|
||||
#### 5.2 ai-service
|
||||
```bash
|
||||
DOCKER_FILE=deployment/container/Dockerfile-backend
|
||||
|
||||
docker build \
|
||||
--platform linux/amd64 \
|
||||
--build-arg BUILD_LIB_DIR="ai-service/build/libs" \
|
||||
--build-arg ARTIFACTORY_FILE="ai-service.jar" \
|
||||
-f ${DOCKER_FILE} \
|
||||
-t ai-service:latest .
|
||||
```
|
||||
|
||||
#### 5.3 event-service
|
||||
```bash
|
||||
DOCKER_FILE=deployment/container/Dockerfile-backend
|
||||
|
||||
docker build \
|
||||
--platform linux/amd64 \
|
||||
--build-arg BUILD_LIB_DIR="event-service/build/libs" \
|
||||
--build-arg ARTIFACTORY_FILE="event-service.jar" \
|
||||
-f deployment/container/Dockerfile-backend \
|
||||
-f ${DOCKER_FILE} \
|
||||
-t event-service:latest .
|
||||
```
|
||||
|
||||
**결과**: 이미지 빌드 성공
|
||||
- Image ID: bbeecf2ccaf2
|
||||
- Size: 1.08GB
|
||||
- Created: 19 seconds ago
|
||||
|
||||
## 4. 빌드 검증
|
||||
|
||||
### 4.1 JAR 파일 확인
|
||||
#### 5.4 content-service
|
||||
```bash
|
||||
ls -lh event-service/build/libs/
|
||||
```
|
||||
DOCKER_FILE=deployment/container/Dockerfile-backend
|
||||
|
||||
**출력**:
|
||||
```
|
||||
-rw-r--r-- 1 KTDS 197121 94M 10월 28 14:35 event-service.jar
|
||||
```
|
||||
|
||||
### 4.2 Docker 이미지 확인
|
||||
```bash
|
||||
docker images | grep event-service
|
||||
```
|
||||
|
||||
**출력**:
|
||||
```
|
||||
event-service latest bbeecf2ccaf2 19 seconds ago 1.08GB
|
||||
```
|
||||
|
||||
## 5. Dockerfile 구조
|
||||
|
||||
**파일 위치**: `deployment/container/Dockerfile-backend`
|
||||
|
||||
### 빌드 스테이지 (Build Stage)
|
||||
- **Base Image**: openjdk:23-oraclelinux8
|
||||
- **작업**: JAR 파일 복사
|
||||
|
||||
### 실행 스테이지 (Run Stage)
|
||||
- **Base Image**: openjdk:23-slim
|
||||
- **사용자**: k8s (non-root user)
|
||||
- **작업 디렉토리**: /home/k8s
|
||||
- **진입점**: `java ${JAVA_OPTS} -jar app.jar`
|
||||
|
||||
## 6. 컨테이너 실행 가이드
|
||||
|
||||
### 6.1 기본 실행
|
||||
```bash
|
||||
docker run -d \
|
||||
--name event-service \
|
||||
-p 8082:8082 \
|
||||
-e SPRING_PROFILES_ACTIVE=dev \
|
||||
-e SERVER_PORT=8082 \
|
||||
event-service:latest
|
||||
```
|
||||
|
||||
### 6.2 환경변수 설정
|
||||
Event Service 실행을 위한 주요 환경변수:
|
||||
|
||||
#### 필수 환경변수
|
||||
- `SERVER_PORT`: 서버 포트 (기본값: 8082)
|
||||
- `DB_HOST`: PostgreSQL 호스트
|
||||
- `DB_PORT`: PostgreSQL 포트 (기본값: 5432)
|
||||
- `DB_NAME`: 데이터베이스 이름
|
||||
- `DB_USERNAME`: 데이터베이스 사용자명
|
||||
- `DB_PASSWORD`: 데이터베이스 비밀번호
|
||||
- `REDIS_HOST`: Redis 호스트
|
||||
- `REDIS_PORT`: Redis 포트 (기본값: 6379)
|
||||
- `REDIS_PASSWORD`: Redis 비밀번호
|
||||
- `KAFKA_BOOTSTRAP_SERVERS`: Kafka 브로커 주소
|
||||
- `JWT_SECRET`: JWT 서명 키 (최소 32자)
|
||||
|
||||
#### 선택 환경변수
|
||||
- `DISTRIBUTION_SERVICE_URL`: Distribution Service URL
|
||||
- `JAVA_OPTS`: JVM 옵션
|
||||
|
||||
### 6.3 Docker Compose 실행 예시
|
||||
```yaml
|
||||
services:
|
||||
event-service:
|
||||
image: event-service:latest
|
||||
container_name: event-service
|
||||
ports:
|
||||
- "8082:8082"
|
||||
environment:
|
||||
- SPRING_PROFILES_ACTIVE=prod
|
||||
- SERVER_PORT=8082
|
||||
- DB_HOST=your-db-host
|
||||
- DB_PORT=5432
|
||||
- DB_NAME=event_db
|
||||
- DB_USERNAME=event_user
|
||||
- DB_PASSWORD=your-password
|
||||
- REDIS_HOST=your-redis-host
|
||||
- REDIS_PORT=6379
|
||||
- REDIS_PASSWORD=your-redis-password
|
||||
- KAFKA_BOOTSTRAP_SERVERS=your-kafka:9092
|
||||
- JWT_SECRET=your-jwt-secret-key-minimum-32-characters
|
||||
- DISTRIBUTION_SERVICE_URL=http://distribution-service:8086
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
## 7. 헬스체크
|
||||
|
||||
### 7.1 Spring Boot Actuator
|
||||
```bash
|
||||
curl http://localhost:8082/actuator/health
|
||||
```
|
||||
|
||||
**예상 응답**:
|
||||
```json
|
||||
{
|
||||
"status": "UP",
|
||||
"components": {
|
||||
"ping": {
|
||||
"status": "UP"
|
||||
},
|
||||
"db": {
|
||||
"status": "UP"
|
||||
},
|
||||
"redis": {
|
||||
"status": "UP"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 7.2 Swagger UI
|
||||
```
|
||||
http://localhost:8082/swagger-ui/index.html
|
||||
```
|
||||
|
||||
## 8. 빌드 결과 요약
|
||||
|
||||
### 서비스 정보
|
||||
- **서비스명**: event-service
|
||||
- **포트**: 8082
|
||||
- **JAR 크기**: 94MB
|
||||
- **이미지 크기**: 1.08GB
|
||||
- **Base Image**: openjdk:23-slim
|
||||
- **Platform**: linux/amd64
|
||||
|
||||
### 빌드 통계
|
||||
- **Common 컴파일**: 6초
|
||||
- **Event Service 컴파일**: 6초
|
||||
- **JAR 빌드**: 5초
|
||||
- **Docker 이미지 빌드**: 약 120초
|
||||
|
||||
### 주요 의존성
|
||||
- Spring Boot Actuator
|
||||
- Spring Kafka
|
||||
- Spring Data Redis
|
||||
- Spring Cloud OpenFeign
|
||||
- PostgreSQL Driver
|
||||
- Jackson
|
||||
|
||||
## 9. 트러블슈팅
|
||||
|
||||
### 9.1 컴파일 오류 해결
|
||||
**증상**: userId/storeId 타입 불일치 오류
|
||||
|
||||
**해결**:
|
||||
- UserPrincipal의 userId, storeId를 UUID로 변경
|
||||
- JwtTokenProvider의 파싱 로직을 UUID.fromString()으로 수정
|
||||
|
||||
### 9.2 Gradle Clean 오류
|
||||
**증상**: `Unable to delete directory 'common\build'`
|
||||
|
||||
**해결**: clean 없이 빌드 수행
|
||||
```bash
|
||||
./gradlew event-service:bootJar
|
||||
```
|
||||
|
||||
### 9.3 Docker 빌드 컨텍스트 오류
|
||||
**증상**: JAR 파일을 찾을 수 없음
|
||||
|
||||
**해결**:
|
||||
- JAR 파일이 실제로 빌드되었는지 확인
|
||||
- 빌드 아규먼트 경로가 올바른지 확인
|
||||
|
||||
## 10. 다음 단계
|
||||
|
||||
### 빌드 수행 이력
|
||||
|
||||
#### 최신 빌드 (2025-10-28)
|
||||
|
||||
**1단계: JAR 빌드**
|
||||
```bash
|
||||
./gradlew content-service:clean content-service:bootJar
|
||||
```
|
||||
|
||||
빌드 결과:
|
||||
```
|
||||
BUILD SUCCESSFUL in 8s
|
||||
9 actionable tasks: 6 executed, 3 up-to-date
|
||||
```
|
||||
|
||||
**2단계: Docker 이미지 빌드**
|
||||
```bash
|
||||
docker build \
|
||||
--platform linux/amd64 \
|
||||
--build-arg BUILD_LIB_DIR="content-service/build/libs" \
|
||||
--build-arg ARTIFACTORY_FILE="content-service.jar" \
|
||||
-f deployment/container/Dockerfile-backend \
|
||||
-f ${DOCKER_FILE} \
|
||||
-t content-service:latest .
|
||||
```
|
||||
|
||||
빌드 결과:
|
||||
- ✅ Build stage 완료 (openjdk:23-oraclelinux8)
|
||||
- ✅ Run stage 완료 (openjdk:23-slim)
|
||||
- ✅ 이미지 생성 완료
|
||||
|
||||
**3단계: 이미지 확인**
|
||||
#### 5.5 participation-service
|
||||
```bash
|
||||
docker images | grep content-service
|
||||
DOCKER_FILE=deployment/container/Dockerfile-backend
|
||||
|
||||
docker build \
|
||||
--platform linux/amd64 \
|
||||
--build-arg BUILD_LIB_DIR="participation-service/build/libs" \
|
||||
--build-arg ARTIFACTORY_FILE="participation-service.jar" \
|
||||
-f ${DOCKER_FILE} \
|
||||
-t participation-service:latest .
|
||||
```
|
||||
|
||||
확인 결과:
|
||||
```
|
||||
content-service latest ff73258c94cc 15 seconds ago 393MB
|
||||
#### 5.6 analytics-service
|
||||
```bash
|
||||
DOCKER_FILE=deployment/container/Dockerfile-backend
|
||||
|
||||
docker build \
|
||||
--platform linux/amd64 \
|
||||
--build-arg BUILD_LIB_DIR="analytics-service/build/libs" \
|
||||
--build-arg ARTIFACTORY_FILE="analytics-service.jar" \
|
||||
-f ${DOCKER_FILE} \
|
||||
-t analytics-service:latest .
|
||||
```
|
||||
|
||||
### 빌드 정보
|
||||
- **서비스명**: content-service
|
||||
- **JAR 파일**: content-service.jar
|
||||
- **Docker 이미지**: content-service:latest
|
||||
- **이미지 ID**: ff73258c94cc
|
||||
- **이미지 크기**: 393MB
|
||||
- **노출 포트**: 8084
|
||||
### 빌드 스크립트 (일괄 실행)
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# build-all-images.sh
|
||||
|
||||
### 빌드 일시
|
||||
- **최신 빌드**: 2025-10-28
|
||||
- **이전 빌드**: 2025-10-27
|
||||
DOCKER_FILE=deployment/container/Dockerfile-backend
|
||||
|
||||
### 환경
|
||||
- **Base Image**: openjdk:23-slim
|
||||
- **Platform**: linux/amd64
|
||||
- **User**: k8s (non-root)
|
||||
- **Java Version**: 23
|
||||
services=(
|
||||
"user-service"
|
||||
"ai-service"
|
||||
"event-service"
|
||||
"content-service"
|
||||
"participation-service"
|
||||
"analytics-service"
|
||||
)
|
||||
|
||||
for service in "${services[@]}"; do
|
||||
echo "Building ${service}..."
|
||||
docker build \
|
||||
--platform linux/amd64 \
|
||||
--build-arg BUILD_LIB_DIR="${service}/build/libs" \
|
||||
--build-arg ARTIFACTORY_FILE="${service}.jar" \
|
||||
-f ${DOCKER_FILE} \
|
||||
-t ${service}:latest .
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "✅ ${service} build successful"
|
||||
else
|
||||
echo "❌ ${service} build failed"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
echo "🎉 All images built successfully!"
|
||||
```
|
||||
|
||||
## 6. 이미지 확인
|
||||
|
||||
### 생성된 이미지 확인 명령어
|
||||
```bash
|
||||
# 모든 서비스 이미지 확인
|
||||
docker images | grep -E "(user-service|ai-service|event-service|content-service|participation-service|analytics-service)"
|
||||
|
||||
# 개별 서비스 확인
|
||||
docker images user-service:latest
|
||||
docker images ai-service:latest
|
||||
docker images event-service:latest
|
||||
docker images content-service:latest
|
||||
docker images participation-service:latest
|
||||
docker images analytics-service:latest
|
||||
```
|
||||
|
||||
### 빌드 결과 ✅
|
||||
```
|
||||
REPOSITORY TAG IMAGE ID CREATED SIZE
|
||||
user-service latest 91c511ef86bd About a minute ago 1.09GB
|
||||
ai-service latest 9477022fa493 About a minute ago 1.08GB
|
||||
event-service latest add81de69536 About a minute ago 1.08GB
|
||||
content-service latest aa9cc16ad041 About a minute ago 1.01GB
|
||||
participation-service latest 9b044a3854dd About a minute ago 1.04GB
|
||||
analytics-service latest ac569de42545 About a minute ago 1.08GB
|
||||
```
|
||||
|
||||
**빌드 일시**: 2025-10-29 09:50 KST
|
||||
**빌드 소요 시간**: 약 13초 (병렬 빌드)
|
||||
**총 이미지 크기**: 6.48GB
|
||||
|
||||
## 7. 이미지 테스트
|
||||
|
||||
### 로컬 실행 테스트 (예시: user-service)
|
||||
```bash
|
||||
# 컨테이너 실행
|
||||
docker run -d \
|
||||
--name user-service-test \
|
||||
-p 8080:8080 \
|
||||
-e SPRING_PROFILES_ACTIVE=dev \
|
||||
user-service:latest
|
||||
|
||||
# 로그 확인
|
||||
docker logs -f user-service-test
|
||||
|
||||
# 헬스체크
|
||||
curl http://localhost:8080/actuator/health
|
||||
|
||||
# 정리
|
||||
docker stop user-service-test
|
||||
docker rm user-service-test
|
||||
```
|
||||
|
||||
## 8. 다음 단계
|
||||
|
||||
### 8.1 컨테이너 레지스트리 푸시
|
||||
```bash
|
||||
# Docker Hub 예시
|
||||
docker tag user-service:latest <your-registry>/user-service:latest
|
||||
docker push <your-registry>/user-service:latest
|
||||
|
||||
# Azure Container Registry 예시
|
||||
docker tag user-service:latest <acr-name>.azurecr.io/user-service:latest
|
||||
docker push <acr-name>.azurecr.io/user-service:latest
|
||||
```
|
||||
|
||||
### 8.2 Kubernetes 배포
|
||||
- Kubernetes Deployment 매니페스트 작성
|
||||
- Service 리소스 정의
|
||||
- ConfigMap/Secret 설정
|
||||
- Ingress 구성
|
||||
|
||||
### 8.3 CI/CD 파이프라인 구성
|
||||
- GitHub Actions 또는 Jenkins 파이프라인 작성
|
||||
- 자동 빌드 및 배포 설정
|
||||
- 이미지 태깅 전략 수립 (semantic versioning)
|
||||
|
||||
## 9. 트러블슈팅
|
||||
|
||||
### Issue 1: Docker Desktop 미실행
|
||||
**증상**:
|
||||
```
|
||||
ERROR: error during connect: open //./pipe/dockerDesktopLinuxEngine:
|
||||
The system cannot find the file specified.
|
||||
```
|
||||
|
||||
**해결**:
|
||||
1. Docker Desktop 애플리케이션 시작
|
||||
2. 시스템 트레이의 Docker 아이콘이 안정화될 때까지 대기
|
||||
3. `docker ps` 명령으로 정상 동작 확인
|
||||
|
||||
### Issue 2: JAR 파일 없음
|
||||
**증상**:
|
||||
```
|
||||
COPY failed: file not found in build context
|
||||
```
|
||||
|
||||
**해결**:
|
||||
```bash
|
||||
# JAR 파일 재빌드
|
||||
./gradlew {service-name}:clean {service-name}:bootJar
|
||||
|
||||
# 생성 확인
|
||||
ls -l {service-name}/build/libs/{service-name}.jar
|
||||
```
|
||||
|
||||
### Issue 3: 플랫폼 불일치
|
||||
**증상**: K8s 클러스터에서 실행 안됨
|
||||
|
||||
**해결**: `--platform linux/amd64` 옵션 사용 (이미 적용됨)
|
||||
|
||||
## 10. 요약
|
||||
|
||||
### ✅ 완료된 작업
|
||||
1. ✅ 6개 서비스의 bootJar 설정 완료
|
||||
2. ✅ Dockerfile-backend 생성 완료
|
||||
3. ✅ 6개 서비스 JAR 파일 빌드 완료 (총 542MB)
|
||||
4. ✅ 6개 서비스 Docker 이미지 빌드 완료 (총 6.48GB)
|
||||
|
||||
### 📊 최종 서비스 현황
|
||||
| 서비스 | JAR 빌드 | Docker 이미지 | 이미지 크기 | Image ID | 상태 |
|
||||
|--------|---------|--------------|-----------|----------|------|
|
||||
| user-service | ✅ 96MB | ✅ | 1.09GB | 91c511ef86bd | ✅ Ready |
|
||||
| ai-service | ✅ 94MB | ✅ | 1.08GB | 9477022fa493 | ✅ Ready |
|
||||
| event-service | ✅ 94MB | ✅ | 1.08GB | add81de69536 | ✅ Ready |
|
||||
| content-service | ✅ 78MB | ✅ | 1.01GB | aa9cc16ad041 | ✅ Ready |
|
||||
| participation-service | ✅ 85MB | ✅ | 1.04GB | 9b044a3854dd | ✅ Ready |
|
||||
| analytics-service | ✅ 95MB | ✅ | 1.08GB | ac569de42545 | ✅ Ready |
|
||||
| distribution-service | ❌ | ❌ | - | - | 소스 미구현 |
|
||||
|
||||
### 🎯 빌드 성능 메트릭
|
||||
- **JAR 빌드 시간**: 27초
|
||||
- **Docker 이미지 빌드**: 병렬 실행으로 약 13초
|
||||
- **총 소요 시간**: 약 40초
|
||||
- **빌드 성공률**: 100% (6/6 서비스)
|
||||
|
||||
### 🚀 다음 단계 권장사항
|
||||
1. **컨테이너 레지스트리 푸시** (예: Azure ACR, Docker Hub)
|
||||
2. **Kubernetes 배포 매니페스트 작성**
|
||||
3. **CI/CD 파이프라인 구성** (GitHub Actions 또는 Jenkins)
|
||||
4. **모니터링 및 로깅 설정**
|
||||
|
||||
---
|
||||
|
||||
**작성일**: 2025-10-29 09:50 KST
|
||||
**작성자**: DevOps Engineer (송근정 "데브옵스 마스터")
|
||||
**빌드 완료**: ✅ 모든 서비스 이미지 빌드 성공
|
||||
|
||||
Reference in New Issue
Block a user