SW/Java

GraalVM 네이티브 이미지를 위한 Docker 이미지 빌드 가이드

얇은생각 2024. 10. 26. 07:30
반응형

현대 소프트웨어 개발 환경에서는 성능을 극대화하고 배포 효율성을 높이는 것이 매우 중요합니다. 특히 GraalVM을 사용하여 애플리케이션을 네이티브 이미지로 빌드하면 시작 시간을 크게 줄일 수 있어, 클라우드 네이티브 애플리케이션에 매우 유리합니다. 이 글에서는 GraalVM 네이티브 이미지를 활용하여 Docker 이미지를 생성하는 과정을 다루며, SEO 최적화된 블로그 형식으로 구체적으로 설명하겠습니다.

 

 

GraalVM 네이티브 이미지를 위한 Docker 이미지 빌드 가이드

 

 

GraalVM 네이티브 이미지란?

GraalVM 네이티브 이미지는 자바 애플리케이션을 네이티브 실행 파일로 변환하는 도구입니다. 이를 통해 애플리케이션의 실행 속도를 크게 향상시킬 수 있으며, 메모리 소비를 줄이고 시작 시간을 대폭 줄일 수 있습니다. 특히 서버리스 환경이나 클라우드 배포에서 매우 유리하며, 성능을 극대화할 수 있는 강력한 도구입니다.

 

 

Docker 이미지 빌드의 중요성

GraalVM 네이티브 이미지를 Docker 컨테이너로 배포하면 클라우드 환경에서 효율적인 확장성관리 편의성을 얻을 수 있습니다. 멀티스테이지 빌드 방식을 활용하면 이미지 크기를 최소화하면서도 최적화된 배포 환경을 구축할 수 있습니다. 이 방법을 사용하면 애플리케이션의 성능과 배포 효율성을 극대화할 수 있습니다.

 

 

Dockerfile 작성: GraalVM 네이티브 이미지 빌드

1. 기본 이미지 설정

먼저, GraalVM 기반 이미지를 사용하여 네이티브 이미지를 빌드해야 합니다. 여기서는 GraalVM Java 17을 기반으로 한 이미지를 사용합니다.

FROM ghcr.io/graalvm/native-image:ol8-java17-22 AS builder

 

 

2. 필요한 도구 설치

Maven과 같은 빌드 도구를 설치합니다. 이 도구는 프로젝트의 의존성을 관리하고, 네이티브 이미지를 생성하는 데 사용됩니다. Dockerfile에서 필요한 도구를 설치하는 부분을 구성합니다.

# tar, gzip 설치
RUN microdnf update \
 && microdnf install --nodocs \
    tar \
    gzip \
 && microdnf clean all \
 && rm -rf /var/cache/yum

 

 

3. Maven 설치

Maven을 다운로드하고, 이를 통해 애플리케이션을 빌드합니다.

ARG MAVEN_DOWNLOAD_URL=https://dlcdn.apache.org/maven/maven-3/3.9.0/binaries/apache-maven-3.9.0-bin.tar.gz
ARG SHA=1ea149f4e48bc7b34d554aef86f948eca7df4e7874e30caf449f3708e4f8487c71a5e5c072a05f17c60406176ebeeaf56b5f895090c7346f8238e2da06cf6ecd

RUN mkdir -p /usr/share/maven /usr/share/maven/ref \
  && curl -fsSL -o /tmp/apache-maven.tar.gz ${MAVEN_DOWNLOAD_URL} \
  && echo "${SHA}  /tmp/apache-maven.tar.gz" | sha512sum -c - \
  && tar -xzf /tmp/apache-maven.tar.gz -C /usr/share/maven --strip-components=1 \
  && rm -f /tmp/apache-maven.tar.gz \
  && ln -s /usr/share/maven/bin/mvn /usr/bin/mvn

 

 

4. 프로젝트 소스 코드 복사 및 빌드

소스 코드를 Docker 이미지에 복사한 후, Maven을 사용하여 네이티브 이미지를 빌드합니다.

WORKDIR /build

# 소스 코드 복사
COPY . /build

# 빌드 실행
RUN mvn -Pnative native:compile

 

 

5. 최종 Docker 이미지 생성

이제 최종 Docker 이미지를 생성하고, 빌드된 네이티브 이미지를 해당 이미지에 복사합니다.

FROM docker.io/oraclelinux:8-slim

EXPOSE 8080

# 빌드된 네이티브 이미지 복사
COPY --from=builder /build/target/mygraalvmplanet .

ENTRYPOINT ["/mygraalvmplanet"]

 

 

Docker 이미지 빌드 및 실행

Dockerfile이 준비되었으면, Docker 이미지를 빌드할 차례입니다. 아래 명령어를 통해 이미지를 빌드합니다. 이 작업은 상당한 시간이 걸릴 수 있으니 인내심을 가지고 기다려야 합니다.

$ docker build . --tag mydeveloperplanet/mygraalvmplanet:0.0.1-SNAPSHOT -f Dockerfile-native-image-oracle-linux

 

 

이미지 빌드가 완료되면, 다음과 같이 이미지를 확인할 수 있습니다.

$ docker images
REPOSITORY                                         TAG                    IMAGE ID       CREATED         SIZE
mydeveloperplanet/mygraalvmplanet                  0.0.1-SNAPSHOT         57e0fda006f0   9 seconds ago   177MB

 

 

이 이미지는 177MB로 크기가 상당히 작으며, 이는 배포 효율성을 크게 높이는 요소입니다.

 

 

컨테이너 실행 및 성능 확인

이미지를 빌드한 후, 컨테이너를 실행하여 애플리케이션의 성능을 확인할 수 있습니다. GraalVM 네이티브 이미지로 빌드된 애플리케이션은 빠른 시작 시간을 자랑합니다.

$ docker run --name mygraalvmplanet mydeveloperplanet/mygraalvmplanet:0.0.1-SNAPSHOT

 

 

실행 결과는 다음과 같습니다. 애플리케이션이 0.055 만에 시작되는 것을 확인할 수 있습니다.

2023-02-26T13:13:50.188Z  INFO 1 --- [           main] c.m.m.MyGraalVmPlanetApplication         : Started MyGraalVmPlanetApplication in 0.055 seconds (process running for 0.061)

 

 

이처럼, GraalVM 네이티브 이미지를 사용하면 초고속 시작 시간낮은 메모리 사용량을 얻을 수 있으며, 이는 서버리스 환경이나 클라우드 환경에서 매우 유리합니다.

 

 

결론: 멀티스테이지 빌드를 활용한 GraalVM Docker 이미지 생성

이 글에서는 GraalVM 네이티브 이미지 Docker로 배포하는 방법을 알아보았습니다. 멀티스테이지 빌드를 사용하여 빌드 툴과 애플리케이션을 분리하고, 이를 통해 최적화된 Docker 이미지를 생성할 수 있었습니다.

이를 요약하면:

  1. GraalVM Maven을 사용하여 애플리케이션을 네이티브 이미지로 빌드합니다.
  2. 멀티스테이지 빌드를 통해 빌드 툴을 포함하지 않은 경량 이미지를 생성합니다.
  3. 최종적으로 Docker 컨테이너로 배포하여 빠른 시작 시간효율적인 리소스 사용을 구현할 수 있습니다.

 

Docker를 사용한 GraalVM 네이티브 이미지 배포는 최적화된 클라우드 네이티브 애플리케이션을 개발하는 데 매우 효과적인 방법입니다.

반응형