Simplify

Spring Boot 를 Java docker 이용해서 구동하기(How to run Spring Boot with java docker container) 본문

Web & Server/Docker & Container

Spring Boot 를 Java docker 이용해서 구동하기(How to run Spring Boot with java docker container)

Simplify - Jonghun 2019. 7. 2. 11:00

앞서 

2019/06/13 - [Web & Server/Docker & Container] - Docker-compose 를 이용해 편하게 docker 쓰기 에서 설명햇던 것 처럼, docker-compose 를 이용하면 긴 명령어를 대신하여 조금 더 편하게 환경을 구성할 수 있습니다. 그리고 

2019/06/17 - [Web & Server/Spring & Spring Boot] - Spring Boot WAR 로 배포하기 (How to deploy with *.war file with Spring Boot) 에서 설명한 것 처럼, Spring Boot 를 war 파일로 변경하여 tomcat 상에서 구동하는 것도 가능합니다. 그런데, 이렇게 구동하면 Spring Boot 가 가진 내장 tomcat 을 활용하지 않는 것이 되므로, 결국 Spring Boot 를 이용하는 최대 장점 중 하나를 잃어버리게 됩니다.

 

여기서는 Spring Boot 의 기본 상태인 jar 로 그대로 빌드하고 이를 java 명령어를 통해 실행할 수 있는 docker 환경을 구성해 보려고 합니다. 

 

 

java docker 다운로드 받기 

 

당연히, docker hub 에서 openjdk 버전을 다운로드 받겠습니다. java 가 유료화가 되면서, 상용인 경우에만 과금하겠다고 했지만, 이 부분은 개인 개발자가 명확하게 대응하기 힘든 부분이니, openjdk 를 받아 사용하기로 합니다. 링크에 접속하여 openjdk 의 8대 버전을 다운로드 받았습니다. 

docker pull openjdk:8u212-jdk

이렇게 되면 리눅스 환경에서, open jdk 8.212 버전만 설치되어 있는 깡통 jdk 가 다운로드 된다고 보면 됩니다. 이 이후에는 이제 저 container 가 실행될 때, 특정 jar 파일을 실행하도록 하겠습니다. 

 

 

docker-compose.yml 파일 작성하기

 

이 부분에서 많은 시행착오를 겪었습니다. 우선 결과를 보고나서 하나하나 설명하도록 하겠습니다. 결과 파일은 다음과 같습니다. 

version: '3.1'

services:
  java-for-SpringBootSample:
    image: openjdk:8u212-jdk
    container_name: "java-for-SpringBootSample"
    restart: always
    command: "java -jar /usr/src/myapp/SpringBootSample-0.0.1.jar"
    ports:
      - "60380:8080"
    environment:
      - "SPRING_PROFILES_ACTIVE=log-console,log-jdbc,log-file-linux"
    volumes:
      - ~/docker/java-for-SpringBootSample/app:/usr/src/myapp
      - ~/docker/java-for-SpringBootSample/env:/root/env
      - ~/docker/java-for-SpringBootSample/log/spring:/log/spring

iamge: openjdk:8u212-jdk

이 부분은 다운로드 받은 이미지, tag 정보를 그대로 입력합니다. 다운로드 받은 이미지가 없으면 오류를 내기 때문에 정확하게 적어주는 것이 맞습니다.

 

container_name: "java-for-SpringBootSample" 

container 의 유일한 이름을 넣어줍니다. 구동되는 환경(docker)에서의 container 이름이 겹치는 경우 역시 실행되지 않으니 특수한 이름을 넣어주는 것을 권장합니다.

 

volumes: 
      - ~/docker/java-for-SpringBootSample/app:/usr/src/myapp 
      - ~/docker/java-for-SpringBootSample/env:/root/env 
      - ~/docker/java-for-SpringBootSample/log/spring:/log/spring

docker 내부의 경로와 docker base가 설치된 머신의 특정 경로를 mount 해 줍니다. 원하는 만큼 해 주면 되지만, 다수의 docker 이미지들이 root 권한으로 실행되고 있어, (이건 좀 수정해야 할듯..) 조심해야 합니다. 여기서 주목할 경로는 가장 위에 선언된 /usr/src/myapp 경로입니다. 저 경로는 제가 임의로 준 경로이고 container 외부에 있는 ......./app 폴더에 연결합니다. 그리고 나서 나중에 jar 파일을 저 경로에 두면, container 안에서 java 명령어로 해당 jar를 실행하게 합니다.

두 번째 env 경로는 제 Spring Boot 의 설정 파일이 위치하는 경로인데, 원래는 {사용자Home}/env 로 되어 있으나, openjdk container 가 root 로 구동되도록 되어 있어 이와 같이 설정 하였습니다. (상대경로를 마운트할 수 없습니다)

마지막 경로는 제가 만든 Spring Boot 의 log 경로입니다. 

 

command: "java -jar /usr/src/myapp/SpringBootSample-0.0.1.jar

이 부분이 가장 중요합니다. 우리는 java 를 Ubuntu 환경에 설치한 것이 아니라, docker container 환경 내에 설치되어 있기 때문에 docker 가 구동되는 시점에 실행될 명령어를 command 안에 적어줍니다. 글의 서두에서 밝힌 것 처럼 java 명령어를 이용하여 Spring Boot jar를 그대로 실행하려는 의도였으므로 -jar 옵션에 jar 파일을 적어줍니다. 여기서 jar파일의 경로는 위에서 설명한 volume 을 참고합니다. 

 

ports: 
      - "60380:8080" 

Spring Boot 가 사용하는 8080포트를 외부의 60380 포트에 연결합니다. 

 

environment: 
      - "SPRING_PROFILES_ACTIVE=log-console,log-jdbc,log-file-linux" 

Spring Boot 에서 사용하는 프로파일 정보입니다. 만약 위에서 설명한 command  부분에 -Dspring.profiles.active=... 등으로 설정해 두어도 됩니다만, 별도로 분리해서 구동하고 싶고, 저렇게 전역 변수처럼 설정 해 두어도 어차피 container 안에서의 변수이므로 전혀 지장이 없습니다.

 

 

실행하기

 

추후에 jenkins 와 연동하여 jar를 생성하겠지만, 여기서는 개발 PC에서 빌드한 jar를 sftp 를 이용하여 ~/docker/java-for-SpringBootSample/app 경로에 넣어두고 실행합니다. 실행 명령어는 앞서 설명한 것과 동일합니다. 

docker-compose up -d

 

Comments