작년에도 spring boot 프로젝트를 aws에 배포하여 진행했었는데
터미널을 끄면 서버가 종료되거나,
터미널 끄더라도 종료되지 않도록 백그라운드에서 실행시켜야 한다는 불편함이 있었다.
docker를 활용해서 aws에 배포해보니 의도하진 않았지만
내가 겪었던 제일 큰 불편함이 해결되었다.
가정
[1.인스턴스가 생성되어있음]
[2. Spring Boot - gradle 프로젝트임]
[3. Dokcer hub 계정이 있음]
[4. Spring Boot 3.2.3 버전 & jdk 17]
Docker 설치
ec2 터미널을 접속하여 다음 명령어 실행.
- 인스턴스에 설치한 패키지 및 패키지 캐시를 업데이트합니다.
- $ sudo yum update -y
- 최신 Docker Community Edition 패키지를 설치합니다.
- Amazon Linux 2의 경우 다음을 실행합니다.
- $ sudo amazon-linux-extras install docker
- Amazon Linux 2023의 경우 다음을 실행합니다.
- $ sudo yum install -y docker
- Amazon Linux 2의 경우 다음을 실행합니다.
- Docker 서비스를 시작합니다.
- $ sudo service docker start
- ec2-user를 사용하지 않고도 docker 명령을 실행할 수 있도록 Docker 그룹에 sudo를 추가합니다.
- $ sudo usermod -a -G docker ec2-user
- 로그아웃 후 다시 로그인해서 새 docker 그룹 권한을 취득합니다. 이를 위해 현재 SSH 터미널 창을 닫고 새 창에서 인스턴스를 다시 연결할 수 있습니다. 새 SSH 세션은 적절한 docker 그룹 권한을 가져야 합니다.
- ec2-user 없이도 sudo가 Docker 명령을 실행할 수 있는지 확인합니다.다음과 같은 출력결과를 보고 Docker가 설치 및 실행 중임을 확인할 수 있어야 합니다.
- $ docker ps

AWS SAMCLI와 함께 사용할 Docker 설치 - AWS Serverless Application Model
Linux에서 호스트 머신과 다른 명령 세트 아키텍처로 Lambda 함수를 빌드하고 실행하려면 추가로 Docker을 구성하는 단계가 있습니다. 예를 들어, arm64 기기에서 x86_64 함수를 실행하려면 다음 Docker 명
docs.aws.amazon.com
Spring Boot - Dockerfile 생성
프로젝트 루트 디렉토리에 Dockerfile을 생성한다.

FROM openjdk:17-jdk
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Dspring.profiles.active=docker", "-jar", "app.jar"]
jar 파일 생성하기
방법1) sts - Gradle Tasks에서 빌드하기

방법2) 명령어로 빌드하기(-x test => test를 skip 후 build 하라는 의미)

EC2에 Git 설치
프로젝트를 git 레포지토리에 push했다고 가정한다.
1. apt 업데이트
$ sudo yum update
2. Git 설치
$ sudo yum install git
EC2에 JDK 설치
$wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm
$sudo rpm -ivh jdk-17_linux-x64_bin.rpm
$sudo alternatives --config java
$java -version
마지막 alternatives에서 설치된 jdk17 버전을 선택해야 함
참고:https://binux.tistory.com/122
EC2에 프로젝트 빌드
$git clone [url]
$cd [프로젝트폴더]
$./gradlew build
※ 이때 permission denined될 경우
권한을 주기위해 아래 명령을 수행하여 gradlew에 대한 권한을 할당
$chmod +x ./gradlew

chmod 명령어 실행 후 gradlew 권한이 바뀌었을 확인할 수 있다.
Docker Image 생성
1. 도커 이미지 생성
Dockerfile 이 위치하는 폴더로 이동해서 명령어를 실행.
$ docker build -t [이미지명] .
※ 맨 마지막에 . 붙여야 함.
2. 도커 이미지 확인
이미지가 정상적으로 생성되었는지 이미지 리스트를 출력하여 확인.
$ docker images

3. 도커 이미지 push
$docker push [docerk계정]/[이미지명]
docker hub 사이트에서도 이미지가 올라간 것을 볼 수 있다.

4. EC2에 이미지 배포하기
docker 이미지 컨테이너화
$docker run -d -p 8080:8080 [docker계정]/[이미지명]
- -d : 백그라운드에서 실행.
- Spring Boot 의 경우 실행되면, Console 창이 나와서 다른 작업을 할 수가 없기 때문이다.
- 또한 백그라운드 실행 시 다른 작업을 할 수 있다.
- -p : 로컬의 포트로 접속시 docker의 어떤 포트와 연결 할것인지.
컨테이너 실행 확인
$docker ps

EC2 8080포트 보안그룹 추가
브라우저에 [퍼블릭주소]:8080/~~ 를 입력해서 접속하려고 하니 되지 않음.
찾아보니 8080 포트가 보안그룹에 추가되지 않아서 접근이 안된것이다.


보안그룹에 8080포트를 추가해주었다.
우선 내 노트북에서만 접근가능하도록 해주었다.
모두 접근이 가능하도록 하려면 0.0.0.0/0 을 해주면 된다.

참고
https://lucas-owner.tistory.com/48
[Docker] Docker - Spring Boot로 EC2 배포하기
Docker - Spring Boot로 EC2 배포하기 ○ 목표 - Spring Boot (server) Docker Image로 Build - Docker Hub에 Docker Image 공유(push) - EC2 Docker Image pull 및 설치 -> 한마디로 Spring Boot를 Docker를 이용하여 EC2에 간편하게 배포
lucas-owner.tistory.com
https://devfoxstar.github.io/java/springboot-docker-ec2-deploy/
스프링부트를 도커로 EC2에 배포하기 (SpringBoot, Docker, EC2)
SpringBoot + Docker + EC…
devfoxstar.github.io