springboot - docker 이미지로 만들어 실행하기

들어가기

SpringBoot로 생성한 스프링 프로젝트를 docker 이미지로 만들어서 동작시키는 예제를 만들어보겠다.

준비물

윈도우에 docker for windows를 설치

윈도우에 maven 설치

springboot 웹 프로젝트 준비

Springboot 웹 프로젝트로 jar파일 생성

SpringBoot로 생성한 웹 프로젝트를 준비했다.

그리고 tomcat대신 undertow로 was를 설정했다. 실습을 진행하는데 별 차이는 없다.

스프링 프로젝트 폴더에서 아래 메이븐 명령어를 실행해서 jar파일을 생성하자.

1
mvn clean package

clean : target폴더 내부의 파일들을 지운다.

pakcage : target폴더에 maven프로젝트를 빌드하고 실행가능한 jar or war로 파일을 패키징한다.

mvn clean package 실행결과

콘솔에서 빌드 성공과 그 결과인 target폴더 내부에 jar파일을 확인 할 수 있다.

이번에 springboot를 공부하면서 가장 충격적인 것이, 저 jar 파일이다.

SpringBoot는 SpringFramework를 감싸고 있는 일종의 자동화된 개발, 실행환경을 제공한다.

spring-boot-starter-parent가 제공하는 내장 WAS 실행환경이 존재하기 때문에, SpringBoot로 생성한 스프링 웹 프로젝트는 별도의 tomcat과 같은 was없이 단독으로 jar파일로 실행으로 웹 프로젝트를 실행 할 수 있다. 정말 신세계인거 같다.

생성된 jar 파일을 아래 명령어로 실행하여 스프링 웹 프로젝트가 동작하는지 확인해 보자.

1
java -jar target/nao-0.0.1-SNAPSHOT.jar

프로젝트 폴더에서 명령어를 입력하면 된다.

실행을 확인 할 수 있다.

동작을 확인 했으니, cntr z 키를 눌러 서비스를 종료하자.

SpringBoot웹 프로젝트의 jar로 도커 이미지 만들기

이제 생성한 jar파일을 이용해서 도커 이미지를 만들자.

프로젝트 폴더에 파일명: Dockfile 로 txt파일을 만들자.

그리고 내용을 아래로 채운다.

1
2
3
4
FROM openjdk:8-jdk-alpine
ADD target/nao-0.0.1-SNAPSHOT.jar app.jar
ENV JAVA_OPTS=""
ENTRYPOINT ["java","-jar","/app.jar"]

위 Dockfile을 이용하여 Dock Image를 생성할 것이다.

FROM : 베이스 이미지를 지정한다. ADD : 현재 경로기존의 jar파일을 복사해서 app.jar파일로 만들어 이미지에 적제한다. ENV : 환경변수 ENTRYPOINT : 이미지가 동작하면서 실행시킬 명령어를 입력한다. 결국 이미지가 run 되면 java -jar /app.jar 를 실행하게 된다.

이제 파일을 생성했으니 아래 명령어로 Dockfile을 이용해서 DockImage를 생성하자.

1
docker build --tag hanumoka-nao:0.1 .

-t옵션을 이용하여 생성하는 이미지의 이름은 hanumoka-nao로 지정한다.

마지막에 . 를 잊지말자(현제 명령어 실행 위치의 Dockfile을 사용하겠다는 의미이다.)

이미지가 생성된 것을 확인

생성한 docker 이미지를 실행하여 스프링 웹프로젝트 동작 확인

아래 명령어를 이용하여 방금 생성한 이미지를 실행하자.

1
docker run -p 58080:58080 hanumoka-nao:0.1

-p옵션을 이용하여 호스트의 포트와 docker이미지의 포트를 연결해 주자.

스프링 프로젝트가 동작하는 것을 확인 할 수 있다.

마무리

도커도 잘 모르고, 스프링 부트도 잘 모르니 여기저기에서 막히는 부분이 많다.

springboot를 보니 docker로 이미지 생성을 위한 전용 jar도 제공하는 듯하다.

흠, 지금 고민이 되는 부분은 docker에 올린 스프링 프로젝트에서 생성하는 로그파일을 볼수가 없다는 것이다.

뭔가 방법이 있을거 같은데...

참고자료

http://tech.cloudz-labs.io/posts/docker/docker-start/

http://wonwoo.ml/index.php/post/268