Spring Boot Project, 배포하기 with Docker

Jihu Kim·2024년 2월 17일
post-thumbnail

Spring Boot Project를 배포해보자.

환경에 따라 배포 방법이 다르니, 자신의 환경에 맞는 배포방법으로 배포를 진행해야한다.

나의 환경은 이러하다.

  • Window
  • gradle
  • Spring Boot
  • java 11
  • EC2: Ubuntu

EC2 서버와 Local에 Docker를 설치하고 Local에서 프로젝트 .jar 파일을 실행하는 이미지를 만들어 Docker Hub에 업로드하고 EC2 서버에서 받아와 실행하는 방식으로 배포를 진행할 것이다.

※Local도 Docker가 설치되어 있어야한다. (+Docker Hub 회원가입)
Local Docker설치 참고 블로그

  • 배포 순서: EC2 인스턴스(서버) 생성 -> EC2 인스턴스(서버)에 Docker 설치 -> 설정 파일 추가(Dockerfile,build.gradle) -> 빌드하여 jar 파일 생성 -> jar 파일을 이미지로 생성 & 만든 이미지를 docker hub에 push -> EC2 서버에서 다운로드

    	※데이터베이스를 사용하는 환경이라면 추가로 해주어야하는 작업이 있으니, 목차를 참고

EC2 인스턴스 생성

AWS EC2(Amazon Web Services Elastic Compute Cloud)는 아마존 웹 서비스에서 제공하는 클라우드 컴퓨팅 플랫폼입니다. 사용자는 EC2를 통해 가상 컴퓨터(인스턴스라고 부릅니다)를 빌려 사용할 수 있으며, 이를 통해 사용자의 컴퓨팅 용량을 쉽게 확장하거나 축소할 수 있습니다.

서버 이름을 지정해주고, Ubuntu를 선택해준다.

프리티어를 선택해준다. (다른 것을 선택하면 요금이 발생할 수 있다)

키 페어 생성을 클릭하고, .ppk를 선택한다. (생성된 키를 읽어버리지 않는 곳에 잘 보관해주어야한다)

보안그룹을 선택해준다. (인바운드 규칙에 내가 사용할 포트를 추가해주어야 한다. 이 부분 때문에 오류가 나서 시간이 오래걸렸다.. 잘 확인하도록 하자)

스토리지를 선택해준다. (프리티어는 30GB까지 가능하다)

인스턴스 시작버튼 클릭시 인스턴스가 생성된다.

탄력적 IP 할당받기 (IP의 변경이 일어나면 안될 경우 설정 해줘야 한다)

탄력적 IP와 인스턴스 연결하기 (연결할 인스턴스를 선택한다)

EC2 인스턴스를 만들고, 탄력적 IP와 연결까지 진행했다.
이제, 할당받은 탄력적 IP인 3.36.220.171로 접속해 진행하면 된다. (Window환경인 나는 PuTTY를 활용해 해당 IP에 접속을 해주겠다)


EC2 인스턴스에 Docker 설치

window는 리눅스 SSH 접속 툴이 필요하다.
PuTTY를 사용해서 진행해보자.

PuTTY 다운로드 참고 블로그

PuTTY로 EC2 인스턴스에 접속

Host Name에 탄력적 IP주소 입력

SSH -> Credentials로 가서 키 파일(.ppk) 입력

login as: ubuntu를 입력한 후 인스턴스에 접속

EC2 인스턴스에 Docker 설치

EC2 서버에 Docker 설치 참고 블로그


설정파일 추가(Dockerfile,build.gradle)

.jar파일을 빌드하기 전 기본적인 설정을 추가해주어야 한다.

Dockerfile

.jar파일을 생성하면 생기는 build->libs폴더에 Dockerfile을 생성한 후 해당 파일에 코드를 작성해주어야한다.

root 경로에 Dockerfile을 넣을 경우에는 JAR파일 경로를 수정해주어야 함 : ARG JAR_FILE=build/libs/*.jar

build.gradle

build.gradle에 해당 코드를 추가해주어야 된다고 한다. (기본.jarplain.jar 파일 두개가 생성돼 오류가 발생할 수 있다)


.jar 파일 생성

intelliJ의 우측 Gradle 탭에서 bootJar를 선택한다.

build->libs.jar파일이 생긴 것을 확인할 수 있다.


Docker Image 생성 및 Hub에 Push(Backend)

Docker Image 생성

Docker에 로그인을 한다. (docker login을 입력하면, Docker 아이디와 비밀번호를 입력하라고 뜰 것이다)

Dockerfile의 경로로 이동한 후, docker build -t {도커계정이름}/{이미지이름} {파일경로}를 입력한다.

docker images를 입력해 생성된 image를 보거나, Docker Desktop을 통해서 생성된 image를 확인할 수 있다.

Docker Hub에 Push

로컬에서 진행하는 경우에는 Docker Hub에 Push하지 않고, 바로 아래의 Docker 컨테이너 생성 단계를 진행하면 된다.

docker push {도커계정이름}/{이미지이름}을 입력해 Docker Hub에 Push할 수 있다.

Docker Desktop을 통해서 Hub에 Push가 제대로 되었는지 확인하자.


EC2 서버에서 다운로드

PuTTY로 EC2 서버에 접속해준 다음, Docker에 로그인을 진행한다.

Docker Container 생성

sudo docker run --name {사용할 컨테이너 이름} -d -p 8080:8080 {도커계정 이름}/{이미지 이름}

  • -d : 백그라운드 실행
  • -p : 연결할 포트 설정

docker ps를 통해서 실행되고있는 컨테이너를 확인할 수 있다.

데이터베이스를 사용하지 않는 환경이라면 여기까지 해주면 배포가 완료된다. 데이터베이스를 사용하고 있는 환경이라면? 추가적인 작업이 필요하다.


데이터베이스를 사용하고 있는 환경이라면?(DB Docker Container 생성)

DB관련 설정 변경(application.properties)

스프링부트 프로젝트의 application.properties에 DB관련 설정에 변경해주어야할 부분이 있다.
spring.datasource.url=jdbc:mariadb://localhost:3306/springboot_study 에서 localhost를 mariadb로 바꿔준다.

spring.datasource.url=jdbc:mariadb://mariadb:3306/springboot_study

docker pull mariadb

mariadb는 회사에서 구현해놓은 이미지가 있어, pull해서 사용가능하다. (MariaDB 이미지를 찾아 Docker 환경으로 다운로드)

sudo docker pull mariadb:latest

docker network create

새로운 Docker 네트워크를 생성하는데 사용된다.

sudo docker network create {네트워크이름}

jihu라는 이름의 네트워크 생성한 예시

docker network에 연결(Backend Container와 DB Container)

MariaDB 컨테이너 생성하고, Docker Network에 연결

sudo docker run -d -p 3306:3306 --env MARIADB_ROOT_PASSWORD={비밀번호} --network {네트워크이름} --name {컨테이너이름} mariadb:latest
만약에 Local에서 3306포트를 사용중이라면 host 포트는 다른 포트로 연결해야 한다.

빌드한 Backend 이미지로 컨테이너 생성하고, Docker Network에 연결

sudo docker run -d -p 8080:8080 --network {네트워크이름} --name {컨테이너이름} {도커계정이름}/{이미지이름}

실행중인 컨테이너 확인

배포 확인

아래 이미지처럼 뜬다면 배포가 잘 진행된거다.

Postman으로 해당 url로 요청을 보내 잘 동작하는지 확인해보자.

데이터베이스와 연동되는지 확인해보자.


정리

AWS의 EC2 서비스를 사용해 가상 컴퓨터를 빌려 서버(인스턴스)를 생성했고 해당 서버에 Spring Boot 프로젝트를 배포해보았다.

  1. 외부에서 고정된 주소로 엑세스하기 위해 인스턴스에 탄력적 IP 주소(고정된 공인 IP 주소)를 할당하였다.

  2. JAR파일을 EC2 인스턴스로 업로드하고 프로젝트를 실행시켜 내장된 톰캣 서버를 실행하는 것으로 배포할 수 있었지만, Docker 이미지를 생성하고 컨테이너를 실행하는 과정으로 배포를 했다. Docker 이미지를 생성해 배포하는 것에는 여러가지 장점이 있다. 경량화를 할 수 있으며, 자동화와 같은 장점을 가진다.

  3. 다음으로 MSA 구조를 채택하는 프로젝트에서 Eureka 서버와 같은 서비스 디스커버리 서버를 활용하는 경우가 많다. 이러한 경우 유레카 서버를 배포하고, 마이크로 서비스를 유레카 서버에 등록하고, 마이크로 서비스를 배포하는 과정 등을 거쳐야 한다. Eureka 서버를 채택하는 프로젝트의 배포과정은 다음에 알아보도록 하자.

profile
Jihukimme

0개의 댓글