mirror of
https://github.com/ktds-dg0501/kt-event-marketing.git
synced 2025-12-06 09:26: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>
6.0 KiB
6.0 KiB
백엔드 컨테이너 이미지 빌드 결과
프로젝트 정보
- 프로젝트명: 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):
bootJar {
archiveFileName = "${project.name}.jar"
}
2. Dockerfile 생성
2.1 디렉토리 생성
mkdir -p deployment/container
2.2 Dockerfile-backend 작성
파일 위치: deployment/container/Dockerfile-backend
# 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 빌드 명령어
./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 파일
$ 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 이미지 빌드
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 이미지 빌드
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 이미지 빌드
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 이미지 목록 조회
$ 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 이미지를 컨테이너로 실행하여 동작 확인:
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 또는 프라이빗 레지스트리에 푸시:
# 이미지 태깅
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