지난학기 팀프로젝트 과제를 할 때, 필수 조건은 아니지만 서버 부분은 AWS EC2에 배포한 뒤 교수님께 제출하고자 했는데, 마감 시간의 압박과 원하는 자료를 구글링하지 못해 그냥 localhost에서 실행 할 수 있을 정도로만 github에 프로젝트 코드를 올린 뒤 제출 했었던 점이 너무나 아쉬웠다.
그 당시 배포작업에서 발생했던 문제는 다음과 같다.
// 생성 과정은 생략합니다.
프리티어를 적용 받고자 AMI 생성에서 Amazon Linux 2로 생성하고
스토리지는 최대인 30gb로 바꾸고 나머지는 기본 옵션으로 둔다.
보안 그룹은 다음과 같이 설정
이 후 인스턴스가 정상적으로 생성 및 실행이 된다.
// MacOS 기준입니다. 덧붙여 미리 pem이 발급되어 있어야 함.
Terminal에서 다음 명령어를 실행
$ chmod 600 xxx.pem // xxx는 이름
$ ssh -i [.pem 파일 디렉토리 주소] ec2-user@퍼블릭IP주소
pem 키의 권한을 수정해야 접속할 수 있다.
EC2의 퍼블릭 IP주소는 AWS Console에 있는 퍼블릭 IPv4 DNS를 복붙하면 된다.
내 terminal에서 ssh로 EC2에 접속이 완료되었다.
간단하게 컨트롤러 코드를 만들어서 테스트해보자.
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을 생성한다.
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에 로그인한 뒤 Repository>Create에서 다음과 같이 생성한다.
필자는 Macbook Pro M1 환경에서 진행중이라 빌드 플랫폼이 안맞아 오류가 생길 수 있다.
Gradle을 기준으로 하자면, 다음과 같이 빌드하면 된다.
docker build --platform amd64 --build-arg DEPENDENCY=build/dependency -t 도커허브아이디/도커허브 Repository 명 . (끝에 .까지가 명령어입니다.)
이후 push
docker push songs4805/ec2_springboot_test
다음과 같이 Repository에 올라왔다.
$ sudo yum install docker
# 위 명령어를 통해 도커를 설치해주시고 중간에 y를 눌러준다.
$ sudo systemctl start docker
# 위 명령어를 통해 도커를 실행시킨다.
$ sudo docker pull songs4805/ec2_springboot_test
# 위 명령어를 통해 도커허브에 올라간 스프링부트 도커 이미지를 pull 받는다.
$ sudo docker run -p 80:80 songs4805/ec2_springboot_test
# 해당 명령어로 80번 포트에 스프링부트를 실행한다. 아래와 같이 스프링부트가 올라가면 성공.
이 후 웹 브라우저에서 퍼블릭 IP 주소로 /hello 요청을 시도하면 Controller에 정의해둔 함수가 정상적으로 호출된다.
끄읕~!