티스토리 뷰
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이미지로 만들어서 실행 하는법을 알아봤습니다. 더 많은 명령어와 옵션들은 인터넷을 찾아보면 확인할 수 있습니다.
'Web Development' 카테고리의 다른 글
STOMP(Simple/Stream Text Oriented Message Protocol) (0) | 2020.09.28 |
---|---|
Base64 Encoding (0) | 2020.09.16 |
Jenkins 계정 권한 관리 (Role-based Authorization Strategy Plugin) (0) | 2020.03.26 |
Shiro JdbcRealm(Postgresql) (0) | 2020.03.20 |
OSGI for Java Bundle Programing (0) | 2020.03.16 |
- Total
- Today
- Yesterday