# 백엔드 컨테이너 이미지 빌드 결과 ## 프로젝트 정보 - **프로젝트명**: 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