doyeon e70f121db5 배포 가이드 및 명령어 추가
- 배포 관련 slash 명령어 추가 (컨테이너 이미지 빌드, 실행, K8s 배포, CI/CD)
- 백엔드/프론트엔드 각각에 대한 배포 가이드 문서 추가
- 프롬프트 파일 추가 (think, design, develop)
- deployment 디렉토리 생성
- 기존 명령어 파일 업데이트

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-27 15:03:36 +09:00

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