AWS EC2에 Docker를 사용하여 Spring Boot 프로젝트 호스팅하기

박수민·2024년 4월 2일
2

SpringBoot프로젝트에 호스팅하기

1. SpringBoot프로젝트에 Dockerfile 생성하기

스프링 부트 프로젝트 하위에 Dockerfile이라는 파일을 생성합니다. 이 파일은 도커 이미지를 빌드할 때 필요한 커맨드를 가지고 있습니다.

  • 1
    FROM openjdk:17-jdk-slim
    ADD /build/libs/*.jar app.jar
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  • 2
    FROM openjdk:17
    COPY build/libs/{생성된 파일}.jar {사용할 이름}.jar
    ENTRYPOINT ["java","-jar","/{사용할 이름}.jar"]

2. gradle 빌드

프로젝트 파일을 빌드를 해준다.
Mac , Android Studio 환경에서 터미널로 앱 빌드를 하고 싶으면

./gradlew build

위와 같은 명령어로 빌드를 실행할 수 있다.

bash: ./gradlew: Permission denied

그러나 위와 같이 Permission denied 가 발생하면

chmod +x gradlew  

⚠️ chmod +x gradlew 를 터미널에 입력 한 후, 다시 ./gradlew build 를 실행하면 빌드가 되는 것을 확인 할 수 있다.
(gradlew 빌드 실패시 명령창에 나온 주소 클릭하면 원인을 알 수 있어 원인제거 하면 빌드 성공)

그러면 libs에 jar파일이 두개 생성됨을 알 수 있다.(아래 사진 참고)

3. 도커 허브

  • 1) 로그인 후 Repositories > Create Repository 로 들어가서 도커 레포지토리를 생성합니다.

  • 2) 아래 명령어를 통해 dockerfile -> docker image 로 빌드를 진행합니다.
    애플 M1의 경우 도커 이미지로 빌드할 때 --platform 옵션을 사용해야 한다.
    이 문제는 깃허브에 자세히 나와있다.

// gradle
docker build --build-arg DEPENDENCY=build/dependency -t 도커허브 ID/Repository --platform linux/amd64 .

// maven
docker build -t 도커허브 ID/Repository --platform linux/amd64 .

  • 3)docker image 파일을 Docker Hub에 push를 해줍니다.
    • push 명령어는 docker hub의 Repository에 보면 확인할 수 있다.
docker push 도커허브 ID/Repository

혹시 denied: requested access to the resource is denied 라는 문구가 나오면 로그인을 해주어야 한다.

dokcer login

도커 아이디로 로그인에 성공하면 다시 푸시 명령어를 입력한다.

docker login 명령어를 통해 로그인을 한 뒤 다시 push하면 정상적으로 push가 되고, docker hub의 Repository에

새로운 TAG(latest)가 생성된 걸 확인할 수 있습니다.

4. AWS EC2 생성하기

5. RDS 생성하기

  • 아래 링크로 RDS 생성 및 세팅하는 과정을 거쳤다. 다른 부분이 있다면 디폴프 값으로 설정해주었다.

    (MYSQL연결이 확인하고 싶다면 끝까지 진행하면되고 아니라면 4번까지 따라 해보면 된다.)
    추가로 EC2에서 MYSQL이 설치가 문제가 생긴다면

sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
sudo yum update

후에 아래 두개 중 하나의 명령어로 mysql을 설치하면 된다.

sudo yum -y install mysql-community-server
sudo yum install mysql

추가적으로 문제가 생긴다면 로그에서 버전을 다시 확인해보면된다.

mysql80-community-release-el9-5.noarch.rpm

6. SpringBoot에 Mysql연결 설정

프로젝트의 application.properties를 yml파일로 바꿔서 사용해도 된다.

  • properties를 안쓰고 yml을 쓰는 이유는 중복성을 제거해주고, 들여쓰기를 통해서 가독성을 높여준다고 한다.

src/main/resources/application.(properties 또는 yml)

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://{RDS Endpoint}:3306/example?serverTimezone=UTC&characterEncoding=UTF-8
    username: {rds.username}
    password: {rds.password}
  • driver-class-name
    com.mysql.jdbc.Driver와 com.mysql.cj.jdbc.Driver 두가지가 있습니다.
    전자는 Deprecated이므로 com.mysql.cj.jdbc.Driver를 사용하도록 합니다.

  • url
    localhost:3306/example (example은 database를 의미합니다.)

    serverTimezone=UTC

    • URL 쿼리 스트링에 serverTimezone을 작성해줘야 에러가 발생하지 않으므로, 꼭 작성하도록 합니다.

RDS > database > {생성한 이름}
생성했던 RDS로 들어가면 Connectivity & security쪽에 Endpoint & port가 나와있다.
username 과 password는 rds생성할 때 작성했던걸 이용하면 된다.

7. EC2 인스턴스에 Docker 설치

터미널로 들어가거나

ssh -i {키페어 이름}.pem ec2-user@{퍼블릭 IPv4 DNS}"

권한오류가 발생한다면 키페어를 생성한 위치로 들어가서 명령어를 입력해주면된다.

chmod 400 {키 페어 이름}.pem

EC2 인스턴스로 연결해서 진행하면 됩니다.

도커 설치

sudo yum install docker
## yum 안되면 apt 로 설치 하기 

설치 후 도커 실행 명령어를 입력합니다.

sudo systemctl start docker

docker가 정상적으로 동작하고있는지 확인합니다.

systemctl status docker

도커 허브에 존재하는 이미지에 도커 이미지 파일 Pull

sudo docker pull 도커허브 ID/Repository

도커 이미지를 통해 스프링 부트 애플리케이션 배포(실행)합니다.

sudo docker run -p 8080:8080 도커허브 ID/Repository 

포트가 이미 할당되어 있어서 에러가 발생한다면 해당 포트를 사용 중인지 확인하여 강제 종료시켜준다.

lsof -i :포트번호  # 해당 포트 번호 (해당 포트번호 사용 중인지 확인)
kill -9 [PID] # 강제종료 시켜주기

다시 도커 이미지를 통해 스프링 부트 애플리케이션 배포(실행)합니다.

+ 추가

프로젝트 내부에서 데이터베이스 연결을 확인하고 실행하는지 확인하고 싶다면.
데이터 베이스를 추가하면된다. (5번 RDS 링크로 돌아가기)
1. mysql 추가 host쪽에 RDS Endpoint사용한다.

2. RDS의 username과 password입력한다.
3. database부분에 RDS DB이름을 넣어주면된다.

  • 참조 본문 링크

0개의 댓글