일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- PETERICA
- Linux
- Java
- APM
- kotlin coroutine
- IntelliJ
- CloudWatch
- kotlin spring
- 코틀린 코루틴의 정석
- 공부
- 정보처리기사 실기 기출문제
- AI
- Spring
- 정보처리기사 실기
- kotlin querydsl
- MySQL
- minikube
- kotlin
- aws
- Pinpoint
- AWS EKS
- 정보처리기사실기 기출문제
- 기록으로 실력을 쌓자
- CKA
- CKA 기출문제
- 오블완
- mysql 튜닝
- Kubernetes
- Elasticsearch
- 티스토리챌린지
- Today
- Total
피터의 개발이야기
[Spring] JIB으로 JAVA 애플리케이션 컨테이너화하기 본문
ㅁ 관련 글
ㅇ [kubernets] skaffold란, Kubernetes 로컬 개발환경
Skaffold는 Kubernetes 네이티브 애플리케이션을 위한 지속적인 개발을 용이하게 하는 CLI 도구이다. Skaffold는 소스 코드의 변경 사항을 감지 하고 정책 기반 이미지 태깅 및 최적화되고 빠른 로컬 워크플로 를 통해 애플리케이션을 자동으로 빌드 , 푸시 , 테스트 및 배포 하는 파이프라인을 처리한다. |
ㅇ [kubernets] Kubernetes 로컬 개발환경 skaffold, Intellij
ㄴ skaffold와 Intellij를 연동하여 쿠버네티스 로컬 개발환경 세팅하는 과정을 정리
ㅁ 들어가며
예전 Skaffold의 로컬환경을 구성하면서 JIB를 설정해 보았는데, 이번 글에서는 는 Jib에 대해 구체적으로 정리해 보았다.
ㅁ Jib이란?
Jib은 Java 애플리케이션을 위한 컨테이너 이미지 빌드 도구이다. 그래서 Java 애플리케이션을 쉽고 빠르게 컨테이너화할 수 있게 도와준다. Jib은 Google에서 개발한 오픈소스 도구로, Docker 데몬 없이도 최적화된 Docker 및 OCI 이미지를 빌드할 수 있게 해준다. 그래서 Jib을 사용하면 Dockerfile을 작성할 필요 없이 빌드 도구 설정만으로 컨테이너 이미지를 만들 수 있어 매우 편리하다.
ㅁ 주요 특징
ㅇ Docker 데몬 없이 이미지 빌드 가능
ㅇ Gradle과 Maven 플러그인으로 제공
ㅇ 애플리케이션을 여러 레이어로 분리하여 빌드 속도 향상
ㅇ 변경된 부분만 재빌드하는 증분 빌드 지원
ㅇ 자동으로 최적화된 Docker 이미지 생성
ㅁ Jib 설치 및 설정
Jib은 Gradle과 Maven 모두 지원한다. 여기서는 Gradle을 기준으로 작성하였다.
plugins {
id 'com.google.cloud.tools.jib' version '3.3.1'
}
ㅇ 먼저 build.gradle 파일에 Jib 플러그인을 추가
jib {
from {
image = 'openjdk:11-jre-slim'
}
to {
image = 'myregistry.github.url/myapp'
tags = ['latest', version]
}
container {
ports = ['8080']
jvmFlags = ['-Xms512m', '-Xmx512m']
}
}
ㅇ Jib 설정을 추가한다.
- 기본 이미지: openjdk:11-jre-slim
- 생성된 이미지: myregistry.github.url/myapp으로 푸시하도록 지정
- 컨테이너의 8080 포트를 노출하고 JVM 옵션도 설정
ㅁ Jib으로 이미지 빌드하기
./gradlew jib
ㅇ Jib으로 이미지를 빌드하기 이해서 터미널에서 위 명령어를 실행한다.
ㅇ 이 명령어로 이미지를 빌드하고 설정된 레지스트리로 푸시까지 한 번에 수행된다.
./gradlew jibDockerBuild
ㅇ 로컬에서만 빌드하고 싶은 경우
ㅇ 위 명령어로 Docker 데몬을 사용해 로컬에 이미지를 생성할 수 있다.
ㅁ Jib의 장점
ㅇ 빠른 빌드 속도
Jib은 애플리케이션을 여러 레이어로 나누어 빌드한다. 이렇게 하면 변경된 부분만 재빌드할 수 있어 전체 빌드 시간이 크게 단축된다.
ㅇ 쉬운 사용법
Dockerfile 작성이 필요 없고, 빌드 도구 설정만으로 이미지를 만들 수 있어 사용이 매우 간편하다.
ㅇ 재현 가능한 빌드
동일한 소스로 빌드하면 항상 같은 이미지가 생성되어 일관성을 보장한다.
ㅇ 최적화된 이미지
Jib은 자동으로 레이어를 최적화하여 작고 효율적인 이미지를 만든다.
ㅁ Jib 사용 시 주의사항
ㅇ 메모리 사용량
Jib은 기본적으로 빌드 프로세스에 많은 메모리를 사용한다. 대규모 프로젝트에서는 Gradle의 메모리 설정을 조정해야 할 수 있다.
ㅇ 캐시 관리
Jib은 빌드 속도를 높이기 위해 캐시를 사용한다. 하지만 가끔 캐시로 인해 예상치 못한 결과가 나올 수 있다.
--no-cache
이럴 때는 옵션을 사용해 캐시를 무시하고 빌드할 수 있다.
ㅇ 멀티 모듈 프로젝트
멀티 모듈 프로젝트에서 Jib을 사용할 때는 각 모듈별로 Jib 설정을 해야 한다. 이 경우 공통 설정을 상위 build.gradle 파일에 정의하고 각 모듈에서 상속받아 사용하는 것이 좋다.
ㅁ Jib vs Dockerfile
위에서 Jib의 장점으로 빠른 빌드 속도를 말하였다. Jib과 전통적인 Dockerfile 방식과의 차이점에서 주요 차이점이 있다.
ㅇ 빌드 속도
Jib은 변경된 부분만 재빌드하므로 일반적으로 Dockerfile 방식보다 빠르다. 특히 큰 프로젝트일수록 그 차이가 더 커진다.
ㅇ 이미지 최적화
Jib은 자동으로 레이어를 최적화하여 작고 효율적인 이미지를 만든다. Dockerfile에서도 이런 최적화가 가능하지만 수동으로 해야 한다.
ㅇ 사용 편의성
Jib은 Dockerfile 작성이 필요 없어 사용이 더 간편하다. 특히 Java 개발자에게 친숙한 빌드 도구 설정만으로 이미지를 만들 수 있다.
ㅇ 재현성
Jib은 동일한 소스로 항상 같은 이미지를 만들어낸다. Dockerfile 방식에서는 이를 위해 추가적인 주의가 필요하다.
ㅁ Jib 활용 팁
ㅇ 베이스 이미지 최적화
Jib의 기본 베이스 이미지는 꽤 무겁다. 애플리케이션에 따라 더 가벼운 이미지를 선택할 수 있다.
jib {
from {
image = 'gcr.io/distroless/java:11'
}
}
ㅇ Google의 Distroless 이미지를 사용하여 더 작은 크기의 컨테이너를 만들 수 있다.
ㅇ 빌드 아규먼트 사용
Jib에서도 Docker의 ARG와 비슷한 기능을 사용할 수 있다
jib {
to {
image = 'myregistry.azurecr.io/myapp:${project.version}'
}
}
ㅇ 프로젝트 버전을 이미지 태그로 사용할 수 있다.
ㅇ 멀티스테이지 빌드
Jib은 기본적으로 멀티스테이지 빌드를 지원하지 않는다. 하지만 다음과 같이 설정하면 비슷한 효과를 낼 수 있다.
jib {
from {
image = 'openjdk:11-jdk-slim'
}
container {
entrypoint = ['java', '-cp', '/app/resources:/app/classes:/app/libs/*', 'com.example.Main']
}
}
ㅇ 빌드 시에는 JDK를 사용하고, 실행 시에는 JRE만 사용하는 효과를 낼 수 있다.
ㅁ 마무리
Jib은 Java 애플리케이션을 컨테이너화하는 강력하고 편리한 도구이다. Docker에 대한 깊은 지식 없이도 최적화된 컨테이너 이미지를 만들 수 있어 개발자의 생산성을 크게 향상시킨다. 특히 CI/CD 파이프라인에 Jib을 통합하면 빌드 및 배포 프로세스를 크게 간소화할 수 있다. Jenkins, GitLab CI, GitHub Actions 등 대부분의 CI/CD 도구와 쉽게 통합할 수 있어 더욱 유용하다. Jib을 사용하면 개발자는 Dockerfile 작성과 Docker 명령어 실행에 시간을 쓰는 대신 애플리케이션 개발에 더 집중할 수 있다. 또한 일관된 빌드 결과와 최적화된 이미지는 운영 환경에서의 안정성과 효율성을 높여준다.
물론 Jib이 모든 상황에 최적의 솔루션은 아니다. 복잡한 빌드 프로세스가 필요하거나 Java 이외의 언어로 작성된 애플리케이션의 경우 전통적인 Dockerfile 방식이 더 적합할 수 있다. 하지만 대부분의 Java 프로젝트에서 Jib은 훌륭한 선택이 될 것이다.
ㅁ 함께 보면 좋은 사이트
ㅇ [Jib] Gradle Jib을 통한 빌드 사용법 및 Jib 이해하기, 빌드 시간 단축하기기 - gradlew jib
'Programming > Spring' 카테고리의 다른 글
[Spring] @Cacheable 사용법 (1) | 2024.11.27 |
---|---|
[Spring] RestTemplate의 Connection Timeout 설정과 에러 패턴 (0) | 2024.11.14 |
[Spring] Hadoop- Hive 컨넥션 유지 방법, @Scheduled (0) | 2024.10.28 |
[Spring] embedded Tomcat을 사용할 때 메모리가 누적 경우 (0) | 2024.10.22 |
[Spring] @Async를 활용한 비동기 처리 (0) | 2024.10.10 |