스프링 부트 운영
우버 JAR 파일을 만들고 운영환경 배포
컨테이너 생성을 위한 계층형 Dockerfile 생성
애플리케이션 운영을 도와주는 스프링 부트 액추에이터
운영을 위해 사용할 기능과 사용하지 않을 기능 분별
애플리케이션 버전 세부 내용 추가
관리 서비스 라우트 지정
애플리케이션 배포
우버 JAR 배포
도커 배포
- 도커를 사용하면 컨테이너에 자바와 애플리케이션을 함께 담아서 배포할 수 있음
- 애플리케이션을 컨테이너화하는 가장 간단한 Dockerfile
FROM adoptopenjdk/openjdk8:latest
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
ENTRYPOINT ["java", "-jar", "/application.jar"]
- 빌드 파일에서 계층형 JAR 사용하도록 지정(pom.xml)
... 생략 ...
<build>
<plugins>
... 생략 ...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<enabled>true</enabled> <!-- 계층화 적용 -->
</layers>
</configuration>
</plugin>
... 생략 ...
</plugins>
</build>
... 생략 ...
dependencies
spring-boot-lodaer
sanpshot-dependencies
application
FROM adoptopenjdk/openjdk8:latest as builder
WORKDIR application
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
FROM adoptopenjdk/openjdk8:latest
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
#COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
docker build --tag hacking-with-spring-boot
docker run -it -p 8080:8080 hacking-with-spring-boot:latest
- spring-boot:build-image로 도커 이미지 빌드
./mvnw spring-boot:build-image
docker run -it -p 8080:8080 docker.io/library/hacking-with-spring-boot-ch5-reative:0.0.1-SNAPSHOT
- 도커 이미지와 페이키토 이미지 비교
- 계층기반 Dockerfile 이미지
- 장점
- Dockerfile을 직접 작성하므로 이미지 빌드 전체 과정 제어 가능
- 스프링 부트에서 계층화를 제공하므로 빌드 과정 최적화 가능
- 단점
- 컨테이너 직접 관리
- 컨테이너를 빌드 과정이 완전하지 않으면 보안에 취약한 계층 존재 위험
- 페이키토 빌드팩 기반 이미지
- 장점
- Dockerfile을 직접 다룰 필요 없음
- 최신 패치와 SSL을 포함한 업계 표준 컨테이너 기술이 빌드 과정에 포함
- 개발에 더 직중 가능
- 단점
- Dockerfile에 비해 제어할 수 있는 것이 적음
운영 애플리케이션 관리
- 애플리케이션 모니터링을 돕기 위한 스프링 부트 액추에이터 모듈 제공.
- 스프링 부트 액추에이터 의존성 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
애플리케이션 정상상태 점검: /actuactor/health
애플리케이션 상세정보: /actuator/info
액추에이터 접근 관리
- 기본적으로 웹으로 접근하는 것은 허용하지 않음
- 모든 액추에이터 엔드포인트를 웹으로 공개
management.endpoints.web.exposure.include=*
- 공개할 엔드포인트를 명시적으로 지정
management.endpoints.web.exposure.include=auditievents,beans,caches,...생략....
로깅 정보 엔드포인트: /actuator/loggers
- loggers 엔드포인트를 공개하면 사용 중인 모든 로거와 로그 레벨 정보를 확인 할 수 있음.
- 로그 레벨 변경 기능도 제공
다양한 운영 데이터 확인
스레드 정보 확인: /actuator/threaddump
힙 정보 확인: /actuactor/heapdump
HTTP 호출 트레이싱: /actuactor/httptrace
그 밖의 엔드포인트
- /actuactor/auditevents
- /actuactor/beans
- /actuactor/caches
- /actuactor/conditions
- /actuactor/configprops
- /actuactor/env
- /actuactor/flyway
- /actuactor/mappings
- /actuactor/metrics
관리 서비스 경로 수정
- 액추에이터 루트 엔드포인트 변경
// /actuator 대신 /manage로 변경 management.endpoints.web.base-path=/manage
- 액추에이터 상세 경로 변경
// /actuactor/loggers 대신 /logs로 변경 management.endpoints.web.base-path=/ management.endpoints.web.path-mapping.loggers=logs
정리
- 실행 가능한 JAR 파일 생성
- 계층 기반 Dockerfile 작성 및 컨테이너 생성
- 페이키토 빌드팩을 사용해서 Dockerfile 없이 컨테이너 생성
- 스프링 부트 액추에이터 추가
- 필요한 관리 서비스만 노출
참고
- "스프링 부트 실전 활용 마스터", 그렉 턴키스트 저(원서: "Hacking with Spring Boot 2.3 - Reactive Edition")
- 소스 코드