도커에 스프링 부트 서비스 배포

2018, Aug 01    

## spring boot service를 도커에 배포 하기

  • 간단한 프로젝트 예(server : 8080)
@SpringBootApplication
@RestController
public class SampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SampleApplication.class, args);
    }

    @GetMapping
    public String sayHello() {
        return "Hello";
    }
}
## pom.xml
<groupId>com.example</groupId>
<artifactId>sample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
  • 프로젝트 루트에 Dockerfile생성
FROM frolvlad/alpine-oraclejdk8
VOLUME /tmp
ADD target/sample-0.0.1-SNAPSHOT.jar sample.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/sample.jar"]

FROM frolvlad/alpine-oraclejdk8
도커에게 alpine-oraclejdk8 버전을 기반 이미지로 해서 도커 이미지를 만들라고 알려준다.
frolvlad는 alpine-oraclejdk8 이미지가 저장된 저장소를 의미한다.
alpine-oraclejdk8 이미지는 알파인 리눅스와 오라클 jdk8로 만들어진 도커이미지다.
이 이미지를 기반 이미지로 사용하면 직접 자바 라이브러리를 설치하지 않아도 자바를 사용하는 애플리케이션 이미지를 만들 수 있다.

VOLUME /tmp
VOLUME에 지정된 디렉토리에 컨테이너가 접근할 수 있게 해준다. /tmp 디렉토리는 스프링 부트 애플리케이션이 톰캣을 위한 작업 디렉토리를 생성하는 곳이다. tmp 디렉토리는 컨테이너에게는 논리적인 디렉토리며, 호스트의 로컬 디렉토리를 간접적으로 가리킨다.

ADD target/sample-0.0.1-SNAPSHOT.jar sample.jar
sample.jar 애플리케이션 실행 바이너리 파일을 지정한 이름으로 컨테이너에 추가한다. target/sample-0.0.1-SNAPSHOT.jar 파일을 sample.jar 파일로 이름을 바꿔 컨테이너에 추가한다.

EXPOSE 8080
컨테이너 내부에서 실행되는 스프링 부트 서비스를 호스트의 8080 포트에 바인딩 한다.

ENTRYPOINT [“java”,”-jar”,”/sample.jar”]
컨테이너가 시작될 때 기본으로 실행되는 애플리케이션을 지정한다. java -jar 명령으로 sample.jar 파일을 실행한다.

  • 프로젝트 빌드
    $ mvn package
    
  • 도커 빌드
    docker build -t sample:1.0 .
    
  • 도커 이미지 frolvlad/alpine-oraclejdk8, sample이 생성된 것을 확인 할 수 있다.
    $docker images
    sample                       1.0                 2653eae83290        5 hours ago         183MB
    frolvlad/alpine-oraclejdk8   latest              3a32bd04b7ef        2 weeks ago         167MB
    
  • 8080, 80801 포트의 container 생성
    docker run -d -p 8080:8080 --name sample-service1 sample:1.0
    docker run -d -p 8081:8080 --name sample-service2 sample:1.0
    
  • 8080포트와 8081포트 서비스 되는 것 확인
    $ curl http://localhost:8080
    Hello
    $ curl http://localhost:8081
    Hello