코딩스토리

Spring 프로젝트로 Docker Image 만들기 본문

Spring/Spring 공부

Spring 프로젝트로 Docker Image 만들기

kimtaehyun98 2022. 7. 27. 14:48

현재 진행 중인 프로젝트에서 Cloud Run을 사용하여 서버를 배포하려고 한다.

Cloud run은 앞선 포스팅에서 설명했듯이 컨테이너 기반의 Instance를 서버리스 형태로 실행하게 된다. 

자세한 설명은 아래의 포스팅에!

https://kimtaehyun98.tistory.com/149

 

Cloud Run에 Pub/Sub 사용하기 듀토리얼

# 해당 포스팅은 GCP 공식 문서 내용을 바탕으로 작성된 글입니다. https://cloud.google.com/run/docs/tutorials/pubsub?hl=ko#run-clone-sample-repository-java Cloud Run에 Pub/Sub 사용 튜토리얼  | Cloud R..

kimtaehyun98.tistory.com

 

그렇기 때문에 Docker image를 생성하여 배포해야 한다.

 

차근차근 Docker Image를 생성해보자.

(물론 Docker 설치는 필수! 🙃)

 

1. DockerFile 생성

 

1) build -> jar 파일 생성

 

 

boot.jar 실행하면 아래와 같이 build 폴더에 libs가 생긴다.

 

이때 libs 폴더 안의 jar 파일의 위치를 기억해두자.

 

2) Dockerfile 만들기

 

스프링 공식 문서에 아래와 같이 써져 있다.

https://spring.io/guides/topicals/spring-boot-docker/

 

쉽게 말하면 Dockerfile을 보고 build 하겠다는 말이다.

 

각 명령어에 대한 설명은 아래와 같다.

 

FROM : Docker Image 생성 시에 기반이 되는 이미지. (JDK)

ARG : 컨테이너 내에서 사용하는 변수를 지정한다. (즉, JAR_FILE이란 변수를 선언하고 초기화시켜주는 과정)

COPY : JAR_FILE을 컨테이너 내부의 app.jar로 복사한다.

ENTRYPOINT : 컨테이너 시작 시에 실행되는 스크립트 (Spring이므로 Java를 실행하는 코드)

 

위의 명령어들은 가장 기본적인 것들이고 그 외의 추가적인 명령어는 아래의 공식 reference에 들어가 보면 찾을 수 있다.

https://docs.docker.com/engine/reference/builder/

 

Dockerfile reference

 

docs.docker.com

 

위에서 FROM 부분에 jdk가 들어간다.

 

이때 jdk는 자신의 프로젝트에 맞게 쓰면 된다.

 

나는 jdk17을 쓰고 있고, 구글에 docker jdk 17 이런 식으로 검색하면 찾을 수 있다.

 

이때 뒤에 alpine이 붙는 것들을 확인할 수 있다.

alpine은 기본 이미지에 비해 불필요한 라이브러리 등이 포함되어 있지 않기 때문에 경량화되었고, 보안이 강화되었다고 한다.

중요한 건 경량화인데 이 부분 때문에 주로 사용한다.

(실제로 그냥 openjdk 17 치면 COMPRESSED SIZE가 200MB 이상임을 확인할 수 있다.)

 

자신의 프로젝트 jdk를 확인하는 방법은 Intellij 기준 File -> Project Structure -> Modules에 가보면 확인 가능하다.

 

 

3) docker build

bulild 명령어는 아래와 같다.

 

docker build -t "내가 생성할 Docker 이미지 이름" "프로젝트 내의 Dockerfile 위치"

 

(-t 명령어는 docker 이미지 이름 지정할 수 있게 해준다.)

 

이때 반드시 Dockerfile과 jar가 같은 경로에 있어야 한다!

(나는 libs 폴더에 들어가 생성된 jar 파일을 Dockerfile이 있는 곳으로 옮겨 주었다.)

이제 build를 해보자.

 

나 같은 경우에는 아래와 같이 build하였다.

docker build -t kimtaehyun98/conopotserver ./docker --platform linux/x86_64
// 여기서 ./는 현재 dir 위치이고 나는 root dir 밑에 docker 폴더를 만들어서 관리하기 때문에 위와 같이 입력
// 뒤에 platform을 명시해 준 이유는 M1 맥북 이슈로 빌드에 실패함!

 

참고로 docker 이미지 이름 부분을 소문자로만 작성해야 한다. 그렇지 않으면 아래와 같은 에러를 만날 수 있다.

 

또 자신이 M1 맥북이라면 위의 코드처럼 꼭 platform을 넣어주어야 한다. 안그러면 아래와 같은 오류를 만나게 된다.

(M1 칩이 아직도 이렇게 에러가 많은데 M2 칩은... 🤬)

 

이렇게 위의 명령어에 맞게 치면 build가 완료된다.

 

image가 생성되었는지 확인하려면 아래의 명령어를 입력해보면 된다.

docker images

 

생각보다 용량이 많이 크다 😭

 

 

4) docker run

 

빌드가 완료되었으면 이제 실행시켜보자.

 

docker run -p 8080:8080 kimtaehyun98/conopotserver

// docker run -p "외부 포트번호":"컨테이너 내부 포트번호" "이미지 이름"
// 외부 포트번호는 사용하고 있지 않은 포트 번호를 쓰면 되고, 나는 Spring 프로젝트이기 때문에
// 8080 포트로 통일시켜주었다.

 

Spring Application이 잘 실행되고 있음을 확인할 수 있다.

 

실제로 해당 서버에 접속해보자. (이렇게 테스트를 위한 Controller 하나 쯤 만들어두면 참 좋은 것 같다..!)

 

잘 실행되고 있음을 확인할 수 있다.

 

중지시키고 싶다면 docker app 들어가면 현재 실행되고 있는 container가 뜬다. 여기서 중지시키면 된다.

 

 

뭔가 내가 Docker를 언젠간 써보겠다고 막연히 생각은 했지만 실제 쓸 날이 이렇게 빨리 다가올진 몰랐다ㅎ..

 

또 제대로 Docker를 이해하기 보단 독학으로 조금씩 배워가고 있는 느낌이어서 뭔가 아쉬운 느낌이 든다ㅠㅠ

 

다음 포스팅에 Cloud Run에 배포하는 글을 쓴 뒤 Docker를 제대로 공부해볼까 생각중이다 😆

 

'Spring > Spring 공부' 카테고리의 다른 글

Spring 컨테이너와 Dependency Injection  (0) 2022.01.23
HttpMessageConverter  (0) 2022.01.16
REST API  (1) 2022.01.16
좋은 객체지향 설계의 5가지 원칙 - SOLID  (2) 2021.07.08
Comments