Docker

3. 스프링부트 -> 도커 이미지 -> 도커허브

1. 개요

이번 스프링부트로 간단한 프로젝트를 만들고

이를 도커 이미지로 만드는 두가지 방식으로 이미지를 만들어서 실행해보고

도커 이미지를 개인 도커 허브 리포지토리에 올리기까지 해보겠습니다.

 

2. 스프링부트 프로젝트

start.spring.io/

스프링부트 스타터 페이지에서 프로젝트를 하나 만들어 줍니다. 

project -> gradle project

language -> java

Packaging -> Jar

Java -> 8

로 선택하시고 

의존성읜 web만 추가해줍니다.

Project Metadata은 원하시는 데로 작성하시고 인텔리제이로 해당 프로젝트를 열어줍니다.

 

컨트롤러 디렉토리를 하나 만들어서 간단한 RestController를 만들어줍니다.

 

여유되시면 test도 ? ㅎ

 

2. 도커 이미지 만들기

스프링부트에서 도커 이미지를 만드는 방식은 2가지를 설명해보려고 합니다.

 

1. dockerfile을 작성한 뒤 docker을 통해서 빌드

from : 생성할 이미지의 베이스가 될 이미지로 openjdk 8버전을 선택

label : 관리자를 제 닉으로 설정

expose : 8080포트를 노출시킨다고 설정합니다. 이를 통해서 차후 docker run에서 포트를 연결할 수 있습니다.

ARG : 환경변수로 gradle에서 빌드하였을때 떨어지는 jar의 위치를 잡아줍니다.

COPY : 잡아준 jar를 복사합니다.

ENTRYPOINT : 컨테이너가 시작되었을 때 스크립트 혹은 명령을 실행하게 됩니다 여기서는 java -jar /app.jar가 됩니다.

(CMD로도 실행시킬수 있지만 ENTRYPOINT셸 없이 바로 실행이 가능해서 사용했습니다.)

dockerfile의 arg 부분을 보면 gradle은 build/lib에 메이븐은 target 안에 생기게 되는데 이를 맞춰서 설정해주어야한다.

 

이미지를 만들기 이전에 gradle의 build를 통해서 jar 파일을 만들어줍니다.

bootjar명령어도 가능하지만 저는 clean build를 사용하였습니다.

dockerfile을 기준으로 빌드를 해줍니다.

$ docker build -t [도커 이미지 이름] [도커파일 위치]

 

저는 dockerfile의 위치한 곳으로 이동해서 아래 명령어를 사용했습니다. (. 이 도커 파일 위치)

$ docker build -t demo/springboot-docker .

이미지를 보시면 아시겠지만 demp/springboot-docker 만생긴게 아니라 베이스 이미지로 설정했던 openjdk 이미지까지 설치된것을 볼 수 있습니다.

 

이제 만들었던 이미지를 통해서 실행시키고 접속하면 정상적으로 작동이 됩니다.

 

위의 dockerfile에 작성된 내용은 jar파일 하나를 묶었기 때문에 변경이 일어나는 경우 전체를 다시 다운받아야한다는 단점이 있습니다.

앞선 포스팅(wellbell.tistory.com/118)에서 docker layer라는 개념을 가볍게 셜명했는데 위의 경우는 jar 하나를 layer로 

잡았기 때문입니다.

이 layer를 분리해서 최적화하는 방법이 있습니다 . 이는 링크로 대체하겠습니다 .perfectacle.github.io/2019/04/16/spring-boot-docker-image-optimization/

 

2. 스프링부트 2.3 이상 버전부터 gradle의 bootBuildImage를 사용

스프링부트 2.3부터는 dokcerfile 없이도 gradle의 bootBuildImage을 통해서 이미지를 만들수 있는데 

이 경우 docker가 깔려 있어야합니다. 안깔려있으면 에러가 발생합니다.

저는 window에 도커를 설치하기 보다 이전에 도커를 설치했던 vm을 사용했습니다.

(깃허브에 리포지토리를 하나 파서 연결하고 push한뒤 vm에서 clone하였습니다.)

 

빌드 명령어를 사용하기 이전에 확인해야하는게 있습니다.

gradlew의 권한으로 실행권한이 빠져있다면 chmod +x gradlew를 통해서 실행권한을 주셔야 합니다.

리눅스 파일권한이 궁금하시다면 링크

wellbell.tistory.com/25?category=990088

 

권한을 주고 나서 아래의 명령어를 실행시킵니다.

./gradlew bootBuildImage --imageName=[원하는 이미지명]

빌드가 성공하면 도커이미지가 생성되어있는것을 확인할 수 있습니다.

 

해당 도커 이미지로 실행시키면 정상적으로 작동하는 것을 확인할 수 있습니다.

 

3. 도커허브에 이미지 올리기

이제 작업한 이미지를 도커 허브에 올려봅시다.

 

일단 로그인을 먼저 진행합니다.

로그인 명령어를 치고 아이디와 비밀번호를 입력하면 로그인이 됩니다.

$ docker login

만약 도커허브 아이디가 없다면 만드셔야합니다.

 

허브의 리포지 토리 명명 규칙은 위와 같습니다.

맞추기 위해서 계정명/이미지명으로 이미지를 명을 변경한 뒤 아래의 명령어를 통해서 push하면된다.

$ docker image tag [이전 명] [변경 명]

$ docker push [계정명]/[이미지 명]:[tag 명] # tag생략시 latest가 기본값

'Docker' 카테고리의 다른 글

2. 도커 설치와 각종 명령어  (0) 2021.04.05
1. 도커 간단한 개념  (0) 2021.04.05