Ops/Docker

Docker로 jar 서비스

바람냄새 2023. 8. 21. 11:40

시놀로지의 도커 패키지를 이용해서 메이븐으로 빌드한 스프링 부트 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 포트로 잘 서비스 되는지~

잘 된다.