티스토리 뷰

Web Development

Build Docker Image with Maven (java)

§무명소졸§ 2020. 6. 25. 16:08

MSA (Microservice Architecture) 와 Cloud 를 이용한 서비스등 배포 편의성 등으로 Docker를 많이 사용합니다. Docker Container 내부에 이미 애플리케이션을 실행하기 위한 환경을 (OS 등) 갖추고 있기 때문에 Docker를 이용하면 애플리케이션을 빠르고 신속하게 서비스할 수 있습니다. 오늘은 간단한 예제를 통해 자바 애플리케이션을 Maven을 통해 Docker Image를 만들어 보겠습니다.

Simple Project 생성

우선 메이븐을 이용해서 프로젝트 초기화를 하겠습니다. 메이븐이 설치되어 있지 않다면 [maven 설치]해당 링크로 가서 운영체제에 맞는 maven을 설치하면 됩니다. maven이 설치 됐다면 아래 명령어로 프로젝트를 생성합니다.

mvn archetype:generate -DgroupId=info.m2sj -DartifactId=simple -DarchetypeArtifactId=maven-archetype-quickstart

프로젝트 생성이 완료되면 기본적인 자바 프로젝트 package 구조와 pom.xml이 생성됩니다. App.java 라는 파일이 생성됐는데 이 파일을 수정해서 3초마다 메세지를 출력하는 간단한 애플리케이션을 만들겠습니다.  아래는 해당하는 자바 코드입니다. 

package info.m2sj;

import java.util.concurrent.TimeUnit;

public class App {
    public static void main(String[] args) throws InterruptedException {
        while (true) {
            TimeUnit.SECONDS.sleep(3);
            System.out.println("Running...");
        }
    }
}

 

코드 작성이 완료됐으면 build를 해보겠습니다.

mvn clean package

만약 아래와 같은 메세지의 오류가 발생 한다면
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] Source option 5 is no longer supported. Use 7 or later.
[ERROR] Target option 5 is no longer supported. Use 7 or later.

pom.xml 에 아래 라인을 추가해주세요.

    <properties>
     <maven.compiler.source>1.8</maven.compiler.source>
     <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

build 가 정상적으로 끝나면 target 디렉토리에 simple-1.0-SNAPSHOT.jar 파일이 생성돼 있을겁니다. jar 파일을 실행해보겠습니다.

java -jar ./simple-1.0-SNAPSHOT.jar 
./simple-1.0-SNAPSHOT.jar에 기본 Manifest 속성이 없습니다.

jar파일이 실행이 되지 않고 오류를 만나게 되는데 Runnable 가능한 jar 파일 형태가 아니기 때문입니다. jar 파일을 Runnable jar 로 만들기 위한 몇 개의 maven 플러그인이 존재하는데 그 중 shade 를 이용해서 만들어 보겠습니다. pom.xml 에 아래 라인을 추가하고 다시 mvn clean package 명령어를 실행 합니다.

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.2</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>info.m2sj.App</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
   </build>

다시 jar를 파일을 실행하면 Running 을 3초마다 출력 하는걸 확인할 수 있습니다.


Docker Image 생성을 위한 Maven Plugin   

이제 pom.xml 파일에 Docker Image 생성을 위한 플러그인 을 추가합니다. 물론 Docker Image를 생성하기 위해서는 호스트에 Docker가설치 돼있어야 합니다.

 <plugin>
 	<groupId>com.spotify</groupId>
 	<artifactId>docker-maven-plugin</artifactId>
 	<version>1.2.0</version>
 	<configuration>
 		<imageName>info/m2sj/${project.artifactId}</imageName>
 		<dockerDirectory>src/main/docker</dockerDirectory>
 		<resources>
 			<resource>
 				<targetPath>/</targetPath>
 				<directory>${project.build.directory}</directory>
 				<include>${project.build.finalName}.jar</include>
 				</resource>
 		</resources>
 	</configuration>
 </plugin>
  • imageName
    Docker 이미지 이름입니다. docker image ls 명령어로 확인할 때 Repository 에 해당합니다.
  • dockerDirectory
    Dockerfile 이 위치할 디렉토리입니다.
  • targetPath
    리소스를 Copy할 디렉토리 경로입니다.
  • directory
    Docker 이미지 빌드에 필요한 리소스 디렉토리 경로입니다.
  • include
    Docker 이미지 빌드에 필요한 리소스 파일명입니다.

Dockerfile 

docker 이미지 빌드 생성시 참고하게 되는 meta파일입니다. 이미지 생성시 필요한 설정이나 실행해야 될 요소들을 설정합니다. 여기서는 간단한 내용만 포함합니다.

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD simple-1.0-SNAPSHOT.jar simple-1.0-SNAPSHOT.jar 
ENTRYPOINT ["java","-jar","/simple-1.0-SNAPSHOT.jar"]

Docker Build Image

이제 maven 명령어로 jar 파일을 생성하고 Docker Image를 생성하겠습니다. 아래 명령어를 실행합니다.

mvn clean package docker:build

실행 로그 마지막 부분을 보면 아래처럼 Docker Image 생성 로그가 보입니다.

docker image ls 명령어로 생성된 이미지 리스트를 확인할 수 있습니다.

Docker Run

이제 만들어진 이미지를 실행해서 자바 애플리케이션을 실행해보겠습니다. 아래 명령어를 실행합니다.

docker run info/m2sj/simple

아까 작성했던 자바 애플리케이션이 정상적으로 동작 하는걸 확인할 수 있습니다.

간단하게 자바 애플리케이션을 Docker이미지로 만들어서 실행 하는법을 알아봤습니다. 더 많은 명령어와 옵션들은 인터넷을 찾아보면 확인할 수 있습니다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크