Spring Boot를 AWS EC2에 Dockerfile로 배포 테스트

지난학기 팀프로젝트 과제를 할 때, 필수 조건은 아니지만 서버 부분은 AWS EC2에 배포한 뒤 교수님께 제출하고자 했는데, 마감 시간의 압박과 원하는 자료를 구글링하지 못해 그냥 localhost에서 실행 할 수 있을 정도로만 github에 프로젝트 코드를 올린 뒤 제출 했었던 점이 너무나 아쉬웠다.

그 당시 배포작업에서 발생했던 문제는 다음과 같다.

  • Gradle 기반 Spring Project를 Maven 기반의 자료를 보고 dockerfile을 작성했던 점.
  • 내 노트북이 M1 환경이라 도커 이미지 플랫폼 관련 문제를 해결하지 못했던 점. (참고)

실행 환경

  • Macbook Pro M1(13 inch)
  • Gradle 기반 Spring Boot
  • AWS EC2 Amazon Linux 2 AMI

EC2 인스턴스 생성

// 생성 과정은 생략합니다.

프리티어를 적용 받고자 AMI 생성에서 Amazon Linux 2로 생성하고
스토리지는 최대인 30gb로 바꾸고 나머지는 기본 옵션으로 둔다.

보안 그룹은 다음과 같이 설정

이 후 인스턴스가 정상적으로 생성 및 실행이 된다.

EC2 인스턴스 접속

// MacOS 기준입니다. 덧붙여 미리 pem이 발급되어 있어야 함.

Terminal에서 다음 명령어를 실행

$ chmod 600 xxx.pem // xxx는 이름
$ ssh -i [.pem 파일 디렉토리 주소] ec2-user@퍼블릭IP주소 

pem 키의 권한을 수정해야 접속할 수 있다.

EC2의 퍼블릭 IP주소는 AWS Console에 있는 퍼블릭 IPv4 DNS를 복붙하면 된다.

내 terminal에서 ssh로 EC2에 접속이 완료되었다.

Spring Boot 애플리케이션

간단하게 컨트롤러 코드를 만들어서 테스트해보자.

package com.ramos.dockertest.Controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "testing Dockerfile...";
    }
}

이 후, application.properties를 다음과 같이 설정

server.port=80

빌드를 꼭 해야한다. 이거 안했어서 .jar 파일 못찾는다는 오류 뜨고 한참을 헤맸다.

./gradlew clean build

Dockerfile 생성


프로젝트 루트에 Dockerfile을 생성한다.

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=./build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

기본은 위와 같지만, jar 파일이 두 개가 생겨 COPY가 안된다.

일단 구체적으로 파일명을 명시해서 다음과 같이 해보았다.
// 이 부분은 아시는 분 있다면 댓글 남겨주시면 감사하겠습니다...!

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=./build/libs/dockertest-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

Docker Hub에 접속

Docker Hub에 로그인한 뒤 Repository>Create에서 다음과 같이 생성한다.

Dockerfile 빌드

필자는 Macbook Pro M1 환경에서 진행중이라 빌드 플랫폼이 안맞아 오류가 생길 수 있다.

// 참고: Docker on Mac M1 gives: "The requested image's platform (linux/amd64) does not match the detected host platform"

Gradle을 기준으로 하자면, 다음과 같이 빌드하면 된다.

docker build --platform amd64 --build-arg DEPENDENCY=build/dependency -t 도커허브아이디/도커허브 Repository 명 . (끝에 .까지가 명령어입니다.)

이후 push

docker push songs4805/ec2_springboot_test


다음과 같이 Repository에 올라왔다.

EC2 인스턴스 내에 Docker 설치

$ sudo yum install docker
# 위 명령어를 통해 도커를 설치해주시고 중간에 y를 눌러준다.

$ sudo systemctl start docker 
# 위 명령어를 통해 도커를 실행시킨다.

$ sudo docker pull songs4805/ec2_springboot_test
# 위 명령어를 통해 도커허브에 올라간 스프링부트 도커 이미지를 pull 받는다.

$ sudo sudo docker run -p 80:80 songs4805/ec2_springboot_test
# 해당 명령어로 80번 포트에 스프링부트를 실행한다. 아래와 같이 스프링부트가 올라가면 성공.

이 후 웹 브라우저에서 퍼블릭 IP 주소로 /hello 요청을 시도하면 Controller에 정의해둔 함수가 정상적으로 호출된다.

끄읕~!

References

좋은 웹페이지 즐겨찾기