AWS

[AWS] EC2 Linux 에 Dokcer 설치 & Spring Boot 배포

DEV_HEO 2024. 3. 13. 22:58
320x100

작년에도 spring boot 프로젝트를 aws에 배포하여 진행했었는데

터미널을 끄면 서버가 종료되거나,

터미널 끄더라도 종료되지 않도록 백그라운드에서 실행시켜야 한다는 불편함이 있었다.

 

docker를 활용해서 aws에 배포해보니 의도하진 않았지만

내가 겪었던 제일 큰 불편함이 해결되었다.


가정

[1.인스턴스가 생성되어있음]

[2. Spring Boot - gradle 프로젝트임]

[3. Dokcer hub 계정이 있음]

[4. Spring Boot 3.2.3 버전 & jdk 17]


Docker 설치

 

ec2 터미널을 접속하여 다음 명령어 실행.

  1. 인스턴스에 설치한 패키지 및 패키지 캐시를 업데이트합니다.
    • $ sudo yum update -y
  2. 최신 Docker Community Edition 패키지를 설치합니다.
    • Amazon Linux 2의 경우 다음을 실행합니다.
      • $ sudo amazon-linux-extras install docker
    • Amazon Linux 2023의 경우 다음을 실행합니다.
      • $ sudo yum install -y docker
  3. Docker 서비스를 시작합니다.
    • $ sudo service docker start
  4. ec2-user를 사용하지 않고도 docker 명령을 실행할 수 있도록 Docker 그룹에 sudo를 추가합니다.
    • $ sudo usermod -a -G docker ec2-user
  5. 로그아웃 후 다시 로그인해서 새 docker 그룹 권한을 취득합니다. 이를 위해 현재 SSH 터미널 창을 닫고 새 창에서 인스턴스를 다시 연결할 수 있습니다. 새 SSH 세션은 적절한 docker 그룹 권한을 가져야 합니다.
  6. ec2-user 없이도 sudo가 Docker 명령을 실행할 수 있는지 확인합니다.다음과 같은 출력결과를 보고 Docker가 설치 및 실행 중임을 확인할 수 있어야 합니다.
    • $ docker ps

 

 

https://docs.aws.amazon.com/ko_kr/serverless-application-model/latest/developerguide/install-docker.html

 

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

 

320x100