Spring Boot with Docker

최근에 Spring Boot 으로 만든  어플리케이션을 Docker 를 사용하여 배포를 할 일이 생겨서 Spring Boot with Docker 의 내용을 요약 정리해 봅니다.

1. Simple Spring Boot Application

Spring Boot을 사용하여 “Hello Docker World”를 출력하는 간단한 웹 어플리케이션을 다음과 같이 작성합니다.

@SpringBootApplication
@RestController
public class DockerApplication {

   @GetMapping
   public String home() {
      return "Hello Docker World";
   }

   public static void main(String[] args) {
      SpringApplication.run(DockerApplication.class, args);
   }
}
$ http localhost:8080

Hello Docker World

2. Dockerfile 작성

Docker 이미지를 생성하기 위해 Dockerfile을 작성합니다. 파일의 위치는 src/main/docker/Dockerfile 입니다.

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD gs-spring-boot-docker-0.0.1-SNAPSHOT.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar"]
  • FROM: jdk 를 컨테이너에 포함합니다.
  • VOLUME: embedded tomcat 이 사용할 temp 디렉토리 입니다.
  • ADD: artifact 이름을 버전과 함께 명시하고 app.jar 라는 이름으로 컨테이너에 포함합니다.
  • RUN: app.jar 에 touch 명령을 실행시켜서 파일의 수정날짜를 변경합니다. 여기서는 큰 의미가 없지만, 파일의 수정 날짜가 요구되는 경우가 있습니다.
  • ENV: Java의 실행 옵션을 지정합니다.
  • ENTRYPOINT: Docker가 실행될 때 시작되는 명령입니다. 기본적으로  java -jar 과 다른 것이 없습니다. 시스템 환경 변수로 java.security.egd=file:/dev/./urandom 을 정의하고 있습니다. /dev/urandom 은 random number generator로 사용됩니다. tomcat의 startup 시간을 줄이는 효과가 있다고 합니다. 자세한 내용은 /dev/./urandom 을 참고하시기 바랍니다.

3. docker-maven-plugin 설정

docker-maven-plugin을 사용하여 Docker 이미지를 만들 수 있습니다.

<groupId>jade</groupId>
<artifactId>gs-spring-boot-docker</artifactId>
.....
<properties>
   <docker.image.prefix>jade</docker.image.prefix>
</properties>
......
<build>
.......
<plugins>
  <plugin>
   <groupId>com.spotify</groupId>
   <artifactId>docker-maven-plugin</artifactId>
   <version>0.4.14</version>
   <configuration>
      <imageName>${docker.image.prefix}/${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>
 </plugins>
</build>

4. Docker Build & Run

4.1 Build

$ mvn package docker:build

다음과 같이 Maven이 빌드됩니다.

[INFO] --- docker-maven-plugin:0.4.14:build (default-cli) @ gs-spring-boot-docker ---
[INFO] Copying /Users/jadeim/Playground/gs-spring-boot-docker/target/gs-spring-boot-docker-0.0.1-SNAPSHOT.jar -> /Users/jadeim/Playground/gs-spring-boot-docker/target/docker/gs-spring-boot-docker-0.0.1-SNAPSHOT.jar
[INFO] Copying src/main/docker/Dockerfile -> /Users/jadeim/Playground/gs-spring-boot-docker/target/docker/Dockerfile
[INFO] Building image springio/gs-spring-boot-docker
Step 1/6 : FROM frolvlad/alpine-oraclejdk8:slim
---> 354831d86a05
Step 2/6 : VOLUME /tmp
---> Using cache
---> b209c9570887
Step 3/6 : ADD gs-spring-boot-docker-0.0.1-SNAPSHOT.jar app.jar
---> 143a9cb7b3a1
Removing intermediate container 40c57077703e
Step 4/6 : RUN sh -c 'touch /app.jar'
---> Running in f8789a71a32e
---> c9f46c427f78
Removing intermediate container f8789a71a32e
Step 5/6 : ENV JAVA_OPTS ""
---> Running in 4a9e5b610b76
---> fc0092b4459b
Removing intermediate container 4a9e5b610b76
Step 6/6 : ENTRYPOINT sh -c java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar
---> Running in db23115803ef
---> c80937db215d

4.2 Run

$ docker run -p 8080:8080 -t jade/gs-spring-boot-docker

이제 컨테이너로 어플리케이션 배포 및 실행이 되었습니다.
http://localhost:8080 을 실행하면 “Hello Docker World”가 출력됩니다.

댓글 남기기