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