본문 바로가기
Ops/Docker

Docker로 jar 서비스

by 바람냄새 2023. 8. 21.

시놀로지의 도커 패키지를 이용해서 메이븐으로 빌드한 스프링 부트 jar 파일을 서비스 해보려고 한다.

 

도커 이미지 검색

jdk17이 포함된 도커 리눅스 이미지가 필요하다.

$ sudo docker search jdk17

 

도커 이미지를 다운로드 받는다.

나는  xldevops/jdk17-lts 이미지를 받아서 했다. (나중에 다른걸 찾아서 바꿔봐야 겠다)

$ sudo docker pull xldevops/jdk17-lts

 

이미지가 다운로드 되었는지 확인해 본다.

$ sudo docker image ls

 

Dockerfile 작성

이제 실제 서비스할 jar 파일이 있는 곳에 가서 Dockerfile을 만들어 보자.

나는 시놀로지 서버에 /volume1/homes/whwnddml/docker/MyHello 에 jar파일을 위치 시켰다.

이곳에 Dockerfile을 만들것이다.

 

도커파일을 생성하여 값을 입력한다.

$vi Dockerfile

FROM xldevops/jdk17-lts
WORKDIR /app
COPY MyHello-0.0.1-SNAPSHOT.jar app.jar
RUN sudo chown app:app app.jar
RUN sudo mkdir data
RUN sudo chown app:app data
USER app
ENV JAVA_OPTS=""
RUN sudo ls -l
ENTRYPOINT ["java", "-jar", "app.jar"]

나의 경우는 시놀로지 서버의 도커에서 실행하다 보니 군더더기 항목이 좀 들어가 있다. 환경에 따라 불필요한 항목이 있을 수 있다.

한줄 한줄 설명을 달아보면.

 

FROM xldevops/jdk17-lts

=> 도커허브에서 xldevops/jdk17-lts 이미지를 다운로드 받는다. 만일 내 서버에 이미 있다면, 다운로드 받지 않는다.

 

WORKDIR /app

=> 작업디렉토리를 app폴더로 지정한다. 도커 내부의 디렉토리 이다.


COPY MyHello-0.0.1-SNAPSHOT.jar app.jar

=> 현재 서버의 폴더에 있는 MyHello-0.0.1-SNAPSHOT.jar 파일을 도커의 작업디렉토리 app 안에 app.jar 로 복사한다.

 

RUN sudo chown app:app app.jar
RUN sudo mkdir data
RUN sudo chown app:app data
USER app

=> 복사한 app.jar 파일의 소유주를 app로 변경한다. (내가 다운로드 받은 이미지는 app라는 유저를 사용하는데, jar를 복사하면 root계정으로 만들어져서 실행 시 권한 오류가 발생해서 이렇게 작업 했다.)

호스트서버와 디렉토리 공유를 위해 app내부에 data폴더를 만들어 권한을 부여 한다. 


ENV JAVA_OPTS=""
RUN sudo ls -l

=> 그냥 확인용 설정 들

 

ENTRYPOINT ["java", "-jar", "app.jar"]

=> 다 처리한 후 컨테이너가 실행될 때  jar 파일을 서비스하기 위한 java 명령어를 실행.

 

작성을 완료하였으면 파일을 저장하고 콘솔창으로 돌아온다.

 

 

도커 이미지 빌드

$sudo docker build -t myhello-app .

변경된 사항이 없어서, Using cache 로 나왔다.

여튼 마지막에  Successfully 가 보이면, Dockerfile을 이용해서 나만의  myhello-app 도커 이미지가 만들어 졌다는 의미다.

 

이미지를 확인해 보자.

$sudo docker image ls

위 처럼  myhello-app 리포지토리가 보이면 성공이다.(난 캐싱되었기 때문에 10시간 전 이미지가 조회 되었다)

 

 

도커 컨테이너 실행

이제 서비스를 실행해 볼 차례다.

jar 파일이 준비되고, 그 jar파일을 실행할 도커 이미지가 만들어 졌다.

도커를 실행하여 컨테이너에서 jar 파일을 서비스하게 된다.

$ sudo docker run -d -p 18084:8080 -v /volume1/homes/whwnddml/docker/MyHello/data:/app/data --name MyHello myhello-app:latest /bin/bash

도커 실행명령을 살표 보겠다.

sudo docker run -d -p 18084:8080 => 도커를 데몬으로 실행하고, 포트는 18084로 설정(내부포는 8080)

-v /volume1/homes/whwnddml/docker/MyHello/data:/app/data => 호스트폴더와 내부폴더 매핑(파일이 서로 공유됨)

--name MyHello myhello-app:latest /bin/bash => 컨테이너 이름을 MyHello로 설정하고, 이미지는 myhello-app를 사용, 컨테이너 실해하고 나서 쉘을 자동으로 실행함. 

 

 

 

시놀로지 도커상에도 보인다.

 

자, 이제 브라우저에서 보자.

18084 포트로 잘 서비스 되는지~

잘 된다.