🖥 Backend

백엔드 탐험기 2 - AWS 인스턴스에 Docker로 Spring Project 배포하기

date
Jul 31, 2023
slug
how-to-deploy-spring-project-on-aws-instance
author
status
Public
tags
AWS
CI/CD
summary
type
Post
thumbnail
aws_logo_smile_1200x630.png
category
🖥 Backend
updatedAt
Aug 2, 2023 07:18 PM

첫 프로젝트 배포 해보기!

오늘은 탐험기 1에서 생성한 AWS 인스턴스에 Docker를 사용하여 프로젝트를 올려보도록 하겠습니다! CI/CD 환경 구축을 연습하는 차원에서 진행하는 실습인 만큼 최대한 자세히 포스팅해보도록 하겠습니다.
 

내 프로젝트와 RDS 연결하기

먼저 프로젝트 수준 build.gradle 의 dependencies 에 다음과 같이 runtimeOnly ‘mysql-connector-java’를 추가해줍니다. MySQL8.0.31 버전이상부터는 runtimeOnly 'com.mysql:mysql-connector-j' 사용해야하는데 저는 아니기 때문에 아래와 같이 추가하였습니다.
notion image
그 후 application.yml 파일을 다음과 같이 수정해줍니다. 혹시 driver-class-name에서 문제가 생긴다면 dependencies 에서 ‘…-java:버전명시’ 로 수정하면 해결됩니다!
spring:
  datasource:
    url: jdbc:mysql://{엔드포인트}:3306/{사용할 데이터베이스 이름}?serverTimezone=Asia/Seoul
    username: {my username}
    password: {my password}
    driver-class-name: com.mysql.cj.jdbc.Driver
그 후에 이렇게 빌드에 성공하고 나면 배포 준비는 끝났습니다. 저는 테스트 코드가 있어서 테스트 코드가 성공해야만 빌드가 성공하는데 다행이군요…ㅎㅎ
notion image
지금은 기존 프로젝트의 yml파일을 직접 수정했지만 추후 개발/운영환경도 분리해야할 텐데 다른 포스팅으로 다뤄보도록 하겠습니다.

Docker 설치 후 도커 파일을 Docker Hub 에 업로드 하기

도커가 설치되어 있다면 (도커가 없으신 분들은 먼저 각자 운영체제에 맞는 도커를 설치해주세요) 도커허브에 가입하신 뒤 레포지토리를 하나 만들어줍니다.
notion image
그 후 아래 처럼 프로젝트 루트 폴더에 Dockerfile이라는 이름의 파일을 생성해주시고
notion image
파일에 아래와 같이 작성해주세요
FROM openjdk:17
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
이 프로젝트는 jdk 17을 기준으로 제작되었으므로 openjdk:17을 베이스 이미지를 기반으로 dockerfile을 작성합니다. build/libs에 존재하는 jar 파일을 복사하여 app.jar파일을 컨테이너에 생성해 준 후 jar 파일을 실행해줍니다. 이 때 COPY를 하는 이유는 도커파일을 수정할 때 마다 COPY 부분의 이미지만 수정되면 커밋 후의 용량이 크게 변하지 않기 때문입니다.
 
그 후 도커파일이 존재하는 경로로 이동해주신 뒤 아래 명령어를 터미널에 입력해서 로그인 해주신 후
docker login
아래 명령어로 도커이미지를 빌드해줍시다.
docker build -t {계정명}/{리포지토리명}:{태그(0.0.1)} {도커파일 경로} 
# 저의 경우 docker build -t sungkyum/jpashop:0.0.1 .
이렇게 도커 데스크탑에서 이미지를 확인할 수 있다면 성공입니다.
notion image
도커 데스크탑이 없다면 아래와 같은 명령어를 사용해서 확인하셔도 됩니다.
docker images
그 후 아래와 같이 작성하여 도커 허브 레포지토리에 이미지를 업로드 합니다.
docker push {도커 이미지명 + 태그}
# 저의 경우 docker push sungkyum/jpashop:0.0.1
성공했네요!
notion image
 

AWS 인스턴스에 도커 이미지로 프로젝트 실행

이제 마지막 입니다! 아래 명령어로 다시 인스턴스에 접근해주신 후
ssh -i {pem키 경로} ubuntu@{인스턴스 ip}
공식문서를 보며 인스턴스에 도커를 설치해줍니다
다 설치 하셨으면 아래 명령어로 설치가 잘 되었는지 확인해봅시다.
sudo docker --version
잘 설치 되었다면 아래와 같이 로그인해주신 후
sudo docker login
아까 올린 이미지 파일을 내려받습니다.
sudo docker pull {이미지명 + 태그}
성공했네요!
notion image
마지막으로 아래 명령어로 도커 컨테이너의 8080포트를 로컬의 8080포트와 포트 포워딩을 해주고 도커를 백그라운드로 실행하게 되면?
docker run -i -t -p 8080:8080 {도커이미지}
짠 성공입니다!
notion image
 

마무리

처음으로 프로젝트를 도커로 말아보고 파일을 업로드하는 과정을 실행해보았습니다. 중간중간 막히는 부분들이 있었지만 수많은 자료들은 저를 배신하지 않는 군요. 역시 앞서가신 많은 분들의 실행착오가 있었

Reference