본문 바로가기
infra

스프링부트 프로젝트를 도커를 이용하여 배포해 보자!

by kdozlo 2023. 12. 29.

도커란

  • 어플리케이션을 패키징 할 수 있는 툴
  • 컨테이너에 어플리케이션, 시스템 툴, 환경 설정, dependancy들을 하나로 묶어 어디에서나 쉽게 배포하고 안정적인 구동을 할 수 있도록 도와줌

Docker Object

  • Image
    • Docker Container를 만들기 위한 읽기 전용 템플릿
    • 이미지는 몇 가지의 추가적인 사용자 정의와 함께 다른 이미지를 기반으로 한다.
    • 타인이 만들어서 레지스트리에 게시한 이미지를 사용하거나, 직접 이미지를 만들 수 있다. 이미지를 빌드하기 위해서는 Dockerfile를 이용하여 이미지를 만들고 실행하는데 필요한 단계를 정의해야 한다.
  • Dockerfile
    • 이미지에 레이어를 만든다.
    • Dockerfile 변경하고 이미지를 재빌드하면 변경된 레이어만 다시 빌드된다. 이는 다른 가상화 기술과 비교했을때 이미지를 가볍고 작고 빠르게 만들 수 있음을 의미한다.
    • 지시어

  • Container
    • 이미지의 실행 가능한 인스턴스
    • Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동, 삭제 할 수 있다.
    • 하나 이상의 네트워크에 연결하거나 스토리지에 연결하는거 가능
    • 현재 상태를 기반으로 새로운 이미지를 만들 수 있다.
    docker run 명령어
    • docker의 이미지를 기반으로 컨테이너를 생성하는 명령어
    • 옵션

스프링부트 프로젝트 도커로 배포하기

1. Jar 파일 생성

  • 인텔리제이 우측의 Gradle로 들어가서 Tasks/build/bootJar를 이용하여 Jar파일 생성하기

  • Jar 파일은 build/libs 디렉토리에 생성된다.

2. 원하는 위치에 Dockerfile 생성 - 보통 프로젝트 디렉토리(**최상위 루트 프로젝트 경로)**에 생성한다.

FROM openjdk:11
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
  • FROM - 베이스 이미지를 지정하는 지시어로 현재 프로젝트는 openjdk11를 이용했기 때문에 위와 같이 작성한다.
  • ARG - 변수를 선언하는 키워드로 현재 Jar파일의 경로를 저장했다.
  • COPY - 이미지 생성 시 파일 복사, ${JAR_FILE}로 위에서 선언한 변수를 이용하여 컨테이너에 Jar 파일을 복사하여 app.jar파일을 만든다.
    • COPY를 하는 이유 - 도커 파일을 수정할 때 마다 COPY 부분의 이미지만 수정되면 커밋 후의 용량이 크게 변하지 않기 때문.
  • ENTRYPOINT -컨테이너의 어플 지정(컨테이너 시작할 때 실행할 명령어), Jar 파일을 실행하도록 한다.

 

3. dockerfile 실행하기

  • dockerfile이 있는 디렉토리로 이동하여 실행하기.
docker build --tag <도커계정명>/<이름>:<버전> .

  • 도커 계정명을 작성하는 이유는 dockerhub에 push할 때 계정이름이 이미지에 작성되어야 하기 때문이다. 마지막에 .은 현재 디렉토리에 dockerfile이 있기 때문이다.

 

4. 이미지 생성 여부 확인

  • 터미널을 통한 확인
docker images

  • docker desktop을 통한 확인

 

5. DockerHub로 Push

  • 앞서 만든 이미지로 컨테이너를 실행해도 되지만 다른 서버 환경에서도 이 이미지를 pull받기 위해 DockerHub에 push한다.
docker push <작성자명/이름:버전>

 

 

6. DockerHub에서 Pull

  • 앞서 push한 이미지를 DockerHub로 부터 pull 받는다.
docker pull <작성자명/이름:버전>

 

7. 이미지를 통해 컨테이너 생성하기

  • docker run 명령어로 이미지를 실행하여 컨테이너 생성
docker run -i -t -p 8080:8080 <도커이미지>
  • -i
    • 컨테이너와 상호적인 모드로 실행 → 포준입력(stdin)을 열어놓는다.
  • -t
    • TTY(터미널)을 할당하며, 터미널 입력을 받을 수 있게 한다.
    • 이 옵션을 안 사용하면 명령 입력은 가능하지만 shell에 표시는 안된다.
  • -p 8080:8080
    • 호스트(사용자)의 8080포트를 컨테이너의 8080 포트로 매핑
    • 호스트와 컨테이너 간의 포트 포워딩 설정

 

참고

https://velog.io/@hanblueblue/Docker-Basic

 

[번역] Docker (1) Basic

docker-Get started 공식 도큐먼트를 번역하고 정리합니다.

velog.io

https://be-developer.tistory.com/18

 

[Docker] 도커란 무엇인가? 도커 한방 정리!

[Docker] 도커란 무엇인가? 도커 한방 정리! 우리 회사는 하드웨어 중심의 IoT 회사. 전체적으로 나이가 많고 (40대 이상) 개발 연구소장님이 하드웨어 부장님이라 굉장히 기술이 올드하다... 서버는

be-developer.tistory.com

https://velog.io/@xeonu/SpringBoot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-docker%EB%A1%9C-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0

 

SpringBoot 프로젝트 docker로 배포하기

우분투 서버에 스프링부트 프로젝트 도커로 배포해보기.

velog.io

https://bio-info.tistory.com/136

 

[Docker] docker run 명령어 개념 [주요 옵션 설명]

Contents 1. docker run 명령어 docker run은 docker의 이미지를 기반으로, 컨테이너를 생성하는 명령어입니다. 옵션에 따라 컨테이너를 바로 실행시킬 수도 있습니다. 기본적인 명령어 형식은 아래와 같습

bio-info.tistory.com