mirror of
https://github.com/ktds-dg0501/kt-event-marketing.git
synced 2025-12-06 10:06:24 +00:00
- 배포 관련 slash 명령어 추가 (컨테이너 이미지 빌드, 실행, K8s 배포, CI/CD) - 백엔드/프론트엔드 각각에 대한 배포 가이드 문서 추가 - 프롬프트 파일 추가 (think, design, develop) - deployment 디렉토리 생성 - 기존 명령어 파일 업데이트 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
233 lines
6.0 KiB
Markdown
233 lines
6.0 KiB
Markdown
# 백엔드 컨테이너 이미지 빌드 결과
|
|
|
|
## 프로젝트 정보
|
|
- **프로젝트명**: kt-event-marketing
|
|
- **빌드 일시**: 2025-10-27
|
|
- **빌드 대상**: 3개 마이크로서비스 (content-service, participation-service, user-service)
|
|
|
|
## 1. 사전 준비
|
|
|
|
### 1.1 서비스 확인
|
|
settings.gradle에서 확인된 구현 완료 서비스:
|
|
- ✅ content-service
|
|
- ✅ participation-service
|
|
- ✅ user-service
|
|
- ⏳ ai-service (미구현)
|
|
- ⏳ analytics-service (미구현)
|
|
- ⏳ distribution-service (미구현)
|
|
- ⏳ event-service (미구현)
|
|
|
|
### 1.2 bootJar 설정 확인
|
|
build.gradle에 이미 설정되어 있음 (line 101-103):
|
|
```gradle
|
|
bootJar {
|
|
archiveFileName = "${project.name}.jar"
|
|
}
|
|
```
|
|
|
|
## 2. Dockerfile 생성
|
|
|
|
### 2.1 디렉토리 생성
|
|
```bash
|
|
mkdir -p deployment/container
|
|
```
|
|
|
|
### 2.2 Dockerfile-backend 작성
|
|
파일 위치: `deployment/container/Dockerfile-backend`
|
|
|
|
```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"]
|
|
```
|
|
|
|
**주요 특징**:
|
|
- Multi-stage build로 이미지 크기 최적화
|
|
- Non-root user(k8s) 생성으로 보안 강화
|
|
- JAVA_OPTS 환경 변수로 JVM 옵션 설정 가능
|
|
|
|
## 3. JAR 파일 빌드
|
|
|
|
### 3.1 빌드 명령어
|
|
```bash
|
|
./gradlew :content-service:bootJar :participation-service:bootJar :user-service:bootJar
|
|
```
|
|
|
|
### 3.2 빌드 결과
|
|
```
|
|
BUILD SUCCESSFUL in 15s
|
|
18 actionable tasks: 5 executed, 13 up-to-date
|
|
```
|
|
|
|
### 3.3 생성된 JAR 파일
|
|
```bash
|
|
$ ls -lh */build/libs/*.jar
|
|
|
|
-rw-r--r-- 1 KTDS 197121 78M content-service/build/libs/content-service.jar
|
|
-rw-r--r-- 1 KTDS 197121 85M participation-service/build/libs/participation-service.jar
|
|
-rw-r--r-- 1 KTDS 197121 96M user-service/build/libs/user-service.jar
|
|
```
|
|
|
|
## 4. Docker 이미지 빌드
|
|
|
|
### 4.1 content-service 이미지 빌드
|
|
```bash
|
|
DOCKER_FILE=deployment/container/Dockerfile-backend
|
|
service=content-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 .
|
|
```
|
|
|
|
**빌드 결과**:
|
|
- Image ID: 06af046cbebe
|
|
- Size: 1.01GB
|
|
- Platform: linux/amd64
|
|
- Status: ✅ SUCCESS
|
|
|
|
### 4.2 participation-service 이미지 빌드
|
|
```bash
|
|
DOCKER_FILE=deployment/container/Dockerfile-backend
|
|
service=participation-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 .
|
|
```
|
|
|
|
**빌드 결과**:
|
|
- Image ID: 486f2c00811e
|
|
- Size: 1.04GB
|
|
- Platform: linux/amd64
|
|
- Status: ✅ SUCCESS
|
|
|
|
### 4.3 user-service 이미지 빌드
|
|
```bash
|
|
DOCKER_FILE=deployment/container/Dockerfile-backend
|
|
service=user-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 .
|
|
```
|
|
|
|
**빌드 결과**:
|
|
- Image ID: 7ef657c343dd
|
|
- Size: 1.09GB
|
|
- Platform: linux/amd64
|
|
- Status: ✅ SUCCESS
|
|
|
|
## 5. 빌드 결과 확인
|
|
|
|
### 5.1 이미지 목록 조회
|
|
```bash
|
|
$ docker images | grep -E "(content-service|participation-service|user-service)"
|
|
|
|
participation-service latest 486f2c00811e 48 seconds ago 1.04GB
|
|
user-service latest 7ef657c343dd 48 seconds ago 1.09GB
|
|
content-service latest 06af046cbebe 48 seconds ago 1.01GB
|
|
```
|
|
|
|
### 5.2 빌드 요약
|
|
| 서비스명 | Image ID | 크기 | 상태 |
|
|
|---------|----------|------|------|
|
|
| content-service | 06af046cbebe | 1.01GB | ✅ |
|
|
| participation-service | 486f2c00811e | 1.04GB | ✅ |
|
|
| user-service | 7ef657c343dd | 1.09GB | ✅ |
|
|
|
|
## 6. 다음 단계
|
|
|
|
### 6.1 컨테이너 실행 테스트
|
|
각 서비스의 Docker 이미지를 컨테이너로 실행하여 동작 확인:
|
|
```bash
|
|
docker run -d -p 8080:8080 --name content-service content-service:latest
|
|
docker run -d -p 8081:8081 --name participation-service participation-service:latest
|
|
docker run -d -p 8082:8082 --name user-service user-service:latest
|
|
```
|
|
|
|
### 6.2 컨테이너 레지스트리 푸시
|
|
이미지를 Docker Hub 또는 프라이빗 레지스트리에 푸시:
|
|
```bash
|
|
# 이미지 태깅
|
|
docker tag content-service:latest [registry]/content-service:1.0.0
|
|
docker tag participation-service:latest [registry]/participation-service:1.0.0
|
|
docker tag user-service:latest [registry]/user-service:1.0.0
|
|
|
|
# 레지스트리 푸시
|
|
docker push [registry]/content-service:1.0.0
|
|
docker push [registry]/participation-service:1.0.0
|
|
docker push [registry]/user-service:1.0.0
|
|
```
|
|
|
|
### 6.3 Kubernetes 배포
|
|
Kubernetes 클러스터에 배포하기 위한 매니페스트 작성 및 적용
|
|
|
|
## 7. 참고 사항
|
|
|
|
### 7.1 보안 고려사항
|
|
- ✅ Non-root user(k8s) 사용으로 보안 강화
|
|
- ✅ Multi-stage build로 빌드 도구 제외
|
|
- ⚠️ 프로덕션 환경에서는 이미지 스캔 권장
|
|
|
|
### 7.2 이미지 최적화
|
|
- 현재 이미지 크기: ~1GB
|
|
- JVM 튜닝 옵션 활용 가능: `JAVA_OPTS` 환경 변수
|
|
- 추후 경량화 검토: Alpine 기반 이미지, jlink 활용
|
|
|
|
### 7.3 빌드 자동화
|
|
향후 CI/CD 파이프라인에서 자동 빌드 통합 가능:
|
|
- GitHub Actions
|
|
- Jenkins
|
|
- GitLab CI/CD
|
|
- ArgoCD
|
|
|
|
## 8. 문제 해결
|
|
|
|
### 8.1 빌드 실패 시
|
|
- Gradle clean 실행 후 재빌드
|
|
- Docker daemon 상태 확인
|
|
- 디스크 공간 확인
|
|
|
|
### 8.2 이미지 크기 문제
|
|
- Multi-stage build 활용 (현재 적용됨)
|
|
- .dockerignore 파일 활용
|
|
- 불필요한 의존성 제거
|
|
|
|
---
|
|
|
|
**작성자**: DevOps Engineer (송근정)
|
|
**작성일**: 2025-10-27
|
|
**버전**: 1.0.0
|