[docker] spring boot 배포하기

2023. 12. 27. 22:36Docker/사용

[docker] spring boot 배포하기

 

 옛날에 친구와 같이 프로젝트를 진행할 때는 친구가 frontend, 내가 backend를 맡아서 개발을 하고 각자의 ide에서 실행시켜서 연결하면서 진행을 하였다. 다만 서버만 돌리면 되는 것을 각자의 ide를 켜고 실행하면서 메모리를 잡아먹는 것이 아까워서 방법을 찾아보았고 다음에는 docker 컨테이너를 통해 배포를 하면 된다는 생각을 하게 되었다. 적용하고자 하는 프로젝트에 적용하기 전에 기본 프로젝트에 적용하는 과정을 기록해두려고 한다.

 

과정

 

먼저 비어있는 기본 프로젝트를 생성해준다. 이때 다음 화면에서 웹 서버 유지를 위한 Spring Web을 dependencies로 추가해야 한다. 그렇지 않으면 해당 서버가 올라왔다가 바로 내려간다. 

기본 프로젝트 생성

 

프로젝트가 생성이 되면 인텔리제이의 우측 상단의 코끼리 모양의 gradle 아이콘을 눌러서 Tasks -> build -> bootJar를 눌러준다.

grade - bootJar Build와 build 폴더 생성 확인

그리고 build/libs/*.jar가 있는 경로에 Dockerfile을 만들어준다.

docker file 생성

 

Dockerfile 내부는 다음과 같이 작성해 준다.

FROM openjdk:17
ARG JAR_FILE=*.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar","/app.jar"]

  • FROM
    • 사용을 할 이미지를 작성해 준다.
    • 해당 프로젝트의 경우 아까 생성을 할 때 Java의 환경을 17 설정하였기에 openjdk : 17을 작성하였다
    • 만약에 다른 이미지를 사용한다면 해당 프로젝트에서 사용한 환경에 맞게 이미지를 작성해야 한다. 
      • 다른 이미지 혹은 버전을 다르게 사용하면 docker container의 운영이 중단된다.
  • ARG
    • 빌드 시간 동안 사용할 변수를 선언
    • JAR_FILE이라는 변수를 선언하여 사용
    • 이때 해당 값으로 *. jar 파일을 할당하는데 이는 해당 디렉터리에 있는 모든 jar파일을 의미한다. 
      • 다만 해당 build/libs/ 의 경우 내부에 build 하면서 생성한 jar파일만 존재하기에 빌드된 파일이 오게 된다
  • COPY
    • ARG에서 선언한 변수로 등록한 파일을 가져와서 app.jar이라는 이름의 파일로 복사를 하여 가져온다
  • EXPOSE
    • 컨테이너에서 노출시킬 포트를 의미한다. 
    • 기존 spring의 웹서버 포트인 8080을 컨테이너에서도 열어주기 위해 8080을 기입하였다. 
    • 다른 port번호를 입력해도 상관은 없다.
  • ENTRYPOINT
    • 컨테이너가 시작될 때 실행될 명령을 설정 
    • 내부에 작성된 명령어를 실행하면서 컨테이너가 실행될 때 자동으로 Java 애플리케이션을 실행하게 된다.

터미널에서 해당 dockerflie이 있는 경로로 이동한다. 이동한 경로에서 터미널에 위의 명령어를 입력한다. 

docker build -t springdemo ./

 

Docker의 이미지를 빌드하고 태그를 지정하는 데 사용하는 명령어이다.


  • -t 
    • 빌드된 이미지의 태그를 지정한다
    • 해당 이미지는 springdemo라는 이름을 가진 이미지가 된다
  • ./
    • 현재 Dockerfile의 위치를 지정
    • 현재 directory를 의미하고 해당 디렉터리에서 Dockerfile을 찾는다

즉 해당 명령어는 현재 디렉토리에 있는 dockerfile을 사용하여 docker 이미지를 빌드하며 해당 이미지는 springdemo라는 이름을 가진 이미지가 되는 것을 의미한다.

만들어진 이미지

이미지가 만들어진 것을 확인했으면 실행을 시킬 단계이다

 docker run -d -p 8080:8080 springdemo

 

실행을 위해서 이전의 터미널 화면에서 해당 명령어를 입력해 주면 된다.


  • docker run
    • 새로운 docker 컨테이너를 시작할 때 사용이 된다
    • -d
      •  detached mode로 백그라운드 실행을 의미한다.
  • -p 
    • 포트 매핑을 지정한다.
    • 호스트의 8080으로 접근하는 모든 트래픽을 컨테이너의 8080으로 전달한다는 의미이다. 이때 컨테이너의 8080 포트는 아까 위에서 EXPOSE로 설정해 준 포트가 들어오는 것이다
  • springdemo
    • 실행시키는 이미지의 이름

docker desktop에서 확인 가능한 실행되는 컨테이너
접속한 localhost:8080

 

 

실제 비어있는 프로젝트이기에 연결이 되면 화이트라벨 페이지가 나오는 것이 의도한 바이다.