Docker + EC2로 SpringBoot 프로젝트 배포하기

변현섭·2023년 12월 30일
0

Spring 잡학사전

목록 보기
10/10
post-thumbnail

이번 포스팅에서는 SpringBoot로 작성된 서버 파일을 Docker를 이용해 배포하는 방법에 대해 알아보도록 하겠습니다. Docker의 기본 개념이나 명령어는 이미 잘 알고 있다는 가정 하에 포스팅을 작성하였으니, 이해가 잘 안 되신다면 아래의 포스팅을 먼저 읽어주시기 바랍니다.
>> 도커란 무엇인가

1. SpringBoot 프로젝트를 Docker Image로 만들기

1) JAR 파일 생성하기

스프링부트 프로젝트를 이미지로 만들기 위해선, 먼저 프로젝트를 JAR 파일로 변환해야 한다. JAR 파일을 생성하는 방법은 아래와 같다.

① IntelliJ 우측의 Grade을 클릭한 후, Tasks > build > bootJar을 클릭한다.

② 아래와 같이 build > libs에 jar 파일이 생성되는 것을 확인할 수 있다.

2) Dockerfile 스크립트 만들기

방금 생성한 JAR 파일을 기반으로 이미지를 생성할 것이다. 도커 이미지를 생성하는 방법에는 두 가지가 있는데, 여기서는 Dockerfile 스크립트로 이미지를 만드는 방법을 사용할 것이다.

① JAR 파일과 동일한 위치(build > libs)에 Dockerfile이라는 이름의 파일을 생성한다.

② Dockerfile 스크립트에 아래의 내용을 입력한다.

FROM openjdk:17
ARG JAR_FILE=*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
  • FROM openjdk:17
    • 기본 이미지로 openjdk:17을 사용할 것임을 의미한다.
    • SpringBoot의 버전이 3.x.x인 경우, openjdk의 버전이 반드시 17 이상이어야 한다.
  • ARG
    • 컨테이너 내에서 사용할 변수를 지정한다.
    • 변수에는 현재 디렉토리(build > libs)에 위치한 jar 파일이 저장된다.
  • COPY ${JAR_FILE} app.jar
    • JAR_FILE 변수를 컨테이너 경로로 복사한다.
    • 결과적으로, app.jar 파일이 포함된 컨테이너를 생성할 수 있는 이미지가 만들어진다.
  • ENTRYPOINT: 컨테이너가 시작될 때, 실행할 스크립트를 지정한다.

3) Dockerfile 실행하기

① Docker Desktop을 실행한다.

② IntelliJ 터미널에 아래의 명령을 입력한다.

cd build/libs
docker build -t {도커 허브 ID}/{레포지토리 이름:버전} {Dockerfile 경로}

  • 참고로 도커 허브 ID란, 도커 허브에서 사용하는 본인의 계정 이름을 말하는 것이다.

③ 이미지가 잘 생성되었는지 확인해보자.

docker image ls

2. SpringBoot 프로젝트 배포하기

1) DockerHub에 이미지 Push 하기

SpringBoot 프로젝트를 이미지로 만들었으니, 이제 이미지로 컨테이너를 만들어 실행만 하면 된다. 다만, 그전에 어떠한 환경에서도 이미지에 쉽게 접근할 수 있도록 DockerHub에 이미지를 Push 해야 한다.

현재 이미지에는 민감 데이터(yml 파일 등)가 포함되어 있으므로, Private Repository에 Push 하기로 하자.

① DockerHub에서 Repositories > Create repository 버튼을 클릭한다.

② Private Repository를 생성한다.

  • Repository의 이름은 Dockerfile 스크립트로 생성한 이미지의 레포지토리 주소와 같아야 한다.

③ 도커에 로그인하기 위해 IntelliJ 터미널에 아래의 내용을 입력한다.

  • Username에는 본인의 이메일을 입력하면 된다.
  • Password에는 본인이 설정한 비밀번호를 입력하면 된다.
docker login

④ 로컬 이미지 이름 그대로 Push 할 것이기 때문에, 태그를 부여하는 과정은 생략하기로 한다.

⑤ 아래의 명령을 입력하여 이미지를 DockerHub에 업로드할 수 있다.

  • 이미지 이름은 반드시 {도커 허브 ID}/{프라이빗 레포지토리 이름:버전}이어야 한다.
docker push {이미지 이름}

⑥ Dockerhub의 Repositories에서 방금 업로드한 이미지를 확인할 수 있다.

2) EC2에서 Docker로 서버 배포하기

Putty를 이용해 EC2에 원격 접속한다. EC2 생성 밎 원격 접속에 대해서는, 아래의 포스팅을 참고하기 바란다.
>> EC2 생성 및 원격 접속

① Putty에 아래의 명령을 입력하여 EC2에 Docker를 설치하자.

  • 아래는 Ubuyntu 22.04 버전에 Docker를 설치하는 방법이다.
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get install docker-ce docker-ce-cli containerd.io

② 아래의 명령을 입력해 Docker가 잘 실행되고 있는지 확인할 수 있다.

sudo systemctl status docker

③ User가 곧 root가 아닌 경우, 권한이 없다는 이유로 Docker가 실행되지 않는다. 따라서 아래의 명령을 입력해주어야 한다.

  • 아래의 명령을 모두 입력한 후 Putty를 재실행하거나, Duplicated Session으로 다시 열어야 한다.
sudo usermod -aG docker $USER
sudo service docker restart
sudo systemctl restart docker
sudo chown root:docker /var/run/docker.sock

④ Docker에 로그인한다.

docker login

⑤ Dockerhub에 업로드한 이미지를 가져오자.

docker pull {이미지 이름}
docker image ls

⑥ 가져온 이미지를 이용해 컨테이너를 생성 및 실행한다.

docker run -i -t -p 8080:8080 {이미지 이름} &
// 또는 docker run -dit -p 8080:8080 {이미지 이름}
docker ps

⑦ API가 정상적으로 실행되는 것을 확인할 수 있다.

  • 당연한 이야기일 수도 있지만, 윈도우의 Docker Desktop을 끄거나 Putty를 끄더라도 여전히 서버가 정상적으로 동작한다.

⑧ 서버를 종료하고 싶다면, 컨테이너를 종료하고 삭제하면 된다.

docker stop {컨테이너 ID}
docker rm {컨테이너 ID}
docker rmi {이미지 ID}
profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글