최근에 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”가 출력됩니다.