본문 바로가기

Java/Vert.x

도커 컨테이너(Docker container)를 사용해 버텍스 앱을 Java 기본 이미지에서 실행

더보기

버텍스 앱을 도커 컨테이너로 실행할 때 vertx 기본 이미지를 사용해서 도커 파일(Dockerfile)을 생성합니다.

vertx 기본 이미지는 JRE를 포함하고 있으나 애플리케이션 실행을 위해서 더 최신 버전의 JRE를 필요로 할 수 있습니다.

테스트 환경 및 주요 아젠다

버텍스 애플리케이션을 도커 컨테이너(Docker container)로 실행합니다.

vertx 기본 이미지는 JRE를 포함하고 있습니다. 애플리케이션이 기본 이미지의 JRE보다 더 최신 버전을 요구하는 경우 UnsupportedClassVersionError가 발생합니다.

java.lang.UnsupportedClassVersionError: App has been compiled by a more recent version of the Java Runtime (class file version 56.0), this version of the Java Runtime only recognizes class file versions up to 52.0

컨테이너에서 실행을 위해서 도커 파일(Dockerfile)을 작성하며 기본 이미지를 vertx 대신 java로 생성합니다.

기본 이미지 java는 앱에서 필요로 하는 JRE 버전과 일치시킬 수 있습니다.

더보기

이 프로젝트의 개발 환경

  • 애플리케이션 버전
    • OpenJDK 13
    • Vertx Core: 3.9.16
  • 빌드 환경
    • IntelliJ IDEA 2020.3 Ultimated Edition
    • Gradle

Vertx 애플리케이션 작성 및 fat.jar 파일 빌드

컨테이너에서 실행되는 애플리케이션 코드입니다. 사용된 코드는 이 블로그 문서: 도커(Docker) 환경에서 버텍스 앱을 컨테이너로 실행(Containerize)의 예시와 동일합니다.

public class HelloVerticle extends AbstractVerticle 
{
‌	@Override
‌	public void start() throws Exception {
‌		vertx.createHttpServer().requestHandler(request -> {
‌‌‌			request.response().end("Hello java world!");
‌‌		}).listen(8080);
‌	}
}

gradle 프로젝트에서 빌드 파일을 생성하면 기본적으로 jar 파일이 생성됩니다.

의존성이 추가된 fat.jar 파일을 생성하려면 build.gradle 파일을 다음과 같이 수정합니다.

plugins {
	id 'java'
	id 'com.github.johnrengelman.shadow' version '6.1.0'
}

...

shadowJar
{
	zip64 true
	classifier = 'fat'
	manifest
	{
		attributes 'Main-Class':'io.vertx.core.Launcher'
		attributes 'Main-Verticle':[실행 버티클 패키지 경로]
	}
}
코드 비고
Line 3 플러그인 추가 fat.jar 빌드를 위해서 shadow 플러그인을 추가합니다.
Line 14:15 Main-ClassMain-Verticle Main-Class는 Vertx 라이브러리의 Launcher입니다.
Main-Verticle은 애플리케이션이 최초 실행-배포하는 버티클입니다.

Gradle 설정을 새로고침(Reload Gradle Project)하고 gradle | Tasks | shadow | shadowJar를 실행합니다.

프로젝트 루트 디렉토리 기준 build | libs에서 fat.jar 파일이 생성됩니다.

더보기

이어서 도커 이미지를 생성할 때 기본 이미지를 vertx 대신 java를 사용하게 됩니다.

이미지에서 Vertx 라이브러리가 제외되므로 애플리케이션을 빌드 과정에서 Vertx 라이브러리에 대한 의존성(Dependency)을 포함시켜야합니다.

fat.jar(뚱뚱한 jar)은 빌드 과정에서 의존성을 포함한 빌드 파일입니다.

도커 파일 작성

프로젝트 루트 디렉토리에서 Dockerfile을 생성합니다.

FROM openjdk:13

ENV VERTICLE_FILE_PATH [fat.jar 파일 경로]/
ENV VERTICLE_FILE [fat.jar 파일 이름].jar
ENV VERTICLE_HOME /usr/verticles

EXPOSE 8080

COPY $VERTICLE_FILE_PATH$VERTICLE_FILE $VERTICLE_HOME/

WORKDIR $VERTICLE_HOME
ENTRYPOINT ["sh", "-c"]
CMD ["exec java -jar $VERTICLE_FILE"]
코드 비고
Line 1 FROM openjdk:13 기본 이미지를 openjdk로 사용합니다.
이미지의 태그 13은 openjdk의 버전입니다.
Line 3:5 ENV VERTIFLE_FILE_PATH는 프로젝트 루트 디렉토리 기준으로 fat.jar이 위치한 상대 경로입니다.
VERTIFLE_FILE은 fat.jar 파일의 이름입니다.
Line 7 EXPOSE EXPOSE는 이미지에서 사용하는 포트를 의미합니다.
단순 주석에 해당하며 이 선언이 포트에 직접적인 영향을 미치지는 않습니다.
Line 9 COPY fat.jar 파일을 컨테이너 내 VERTICLE_HOME 디렉토리로 복사합니다.
Line 11 WORKDIR 명령문 사용을 위해 VERTICLE_HOME 디렉토리로 이동합니다.
Line 12:13 CMD 명령문 사용을 시작하며 실행되는 명령문은 CMD에서 입력합니다.

Dockerfile을 빌드합니다.

$ docker build -t [이미지 이름] .

이미지가 빌드되면 도커 컨테이너를 실행합니다.

$ docker run -it -p 8080:8080 [도커 이미지]

이미지가 실행되면 웹 브라우저에서 애플리케이션을 테스트 할 수 있습니다.

웹 브라우저 검색 창에 http://127.0.0.1:8080/를 입력합니다. 웹 브라우저에서 "Hello java world!"가 표시됩니다.

정리 및 복습

  • 버텍스 앱을 도커 컨테이너에서 실행할 때 기본 이미지 vertx 대신 java를 사용 할 수 있습니다.
  • 기본 이미지로 java를 사용하면 앱에서 요구하는 JRE 버전과 일치하는 java 기본 이미지를 선택 할 수 있습니다.
  • java 기본 이미지를 사용하면 이미지에서 Vertx 라이브러리가 제외되므로 의존성이 포함된 빌드를 생성해야 합니다.
  • shadowJar 플러그인을 사용해 fat.jar 파일을 생성합니다.
  • fat.jar 파일은 의존성이 포함된 뚱뚱한 jar 빌드입니다.