관리 메뉴

피터의 개발이야기

[Spring] JIB으로 JAVA 애플리케이션 컨테이너화하기 본문

Programming/Spring

[Spring] JIB으로 JAVA 애플리케이션 컨테이너화하기

기록하는 백앤드개발자 2024. 11. 15. 08:59
반응형

ㅁ 관련 글

 [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

 [container] jib 기반의 Java 애플리케이션 컨테이너 이미지

반응형
Comments