SpringBoot 프로젝트 Doker로 배포하기

2025. 4. 1. 21:36AWS

 

이번에는 백엔드를 배포해보겠습니다. 오랜만에 도커를 이용해서 배포하는데요 약간 가물가물합니다,,

그래도 배포하는건 재밌기 때문에 호다닥 해보겠습니다.

 

1. EC2 생성

2025.03.05 - [AWS] - 스프링부트 jar 파일생성 후 EC2 SSH로 배포하는 방법

 

스프링부트 jar 파일생성 후 EC2 SSH로 배포하는 방법

오늘은 제가 만들고 있는 스프링부트 프로젝트를 배포해보도록 하겠습니다!단계는 크게 1. jar파일 생성하기 2. AWS EC2에 배포하기 로 나뉜다. jar 파일이란?JAR(Java ARchive) 파일은 Java에서 사용되는

1000end.tistory.com

 

지난번에 이미 배포를 해봐서 이번 프로젝트에 대한 EC2는 만들어져있다.

EC2생성에 대한 방법은 위에 글을 참고해주길 바란다.

 

 

2. EC2 인스턴스에 도커 설치

sudo apt-get update && \
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo apt-key fingerprint 0EBFCD88 && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
sudo apt-get update && \
sudo apt-get install -y docker-ce && \
sudo usermod -aG docker ubuntu && \
newgrp docker && \
sudo curl -L "https://github.com/docker/compose/releases/download/2.27.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-compose && \
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

 

위 명령어를 입력해서 인스턴스에 도커를 설치해준다.

사실 저 명령어는 도커와 도커컴포즈를 같이 설치하는 명령어인데 나중에 사용할 수도 있어서 같이 설치해주었다.

설치를 다 해준 후 버전확인을 통해 설치가 잘되었는지 확인까지 해주면 완료

 

 

3. AWS ECR 설치하기

AWS ECR은 Docker 컨테이너 이미지 저장소 서비스이다. 쉽게 말하면 도커허브 같은 이미지 저장소인데 AWS에서 사용가능 하다고 보면된다. 그러면 왜 도커허브를 쓰지 이걸 쓰냐고 물어보는 분이 있을 것이다. 배포할 때 AWS를 많이 사용하는데 이 AWS의 여러 기능과 연동이 쉽기 때문이다.

 

$ sudo apt install unzip
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
$ aws --version # 잘 출력된다면 정상 설치된 상태

 

EC2 인스턴스에 위 명령어를 입력해서 AWS ECR을 설치해준다.

 

$ brew install awscli
$ aws --version # 잘 출력된다면 정상 설치된 상태

 

EC2 인스턴스가 아닌 내 컴퓨터의 CLI에서도 사용하기 위해 위 명령어를 이용해 설치해준다.

이 명령어는 맥 전용이니 다른 OS를 사용중이라면 찾아보길 바란다.

 

4. IAM 사용자/액세스키 생성 

2025.02.19 - [AWS] - AWS S3에 이미지 저장하기 - 2. IAM 사용자 생성 및 권한 설정하기

 

AWS S3에 이미지 저장하기 - 2. IAM 사용자 생성 및 권한 설정하기

https://1000end.tistory.com/8 - 1.  AWS S3 버킷만들기 1편에서 버킷을 다 만들어봤습니다. 이어서 설명해 보겠습니다! 그 다음으로 S3에 파일을 업로드하려면 IAM 사용자의 권한이 필요하기 때문에 사용

1000end.tistory.com

 

권한을 줄 IAM 사용자를 만들어야 한다. 이번에도 이전 글로 대체한다,,😅 (코쓱머쓱)

나는 이전에 만들었던 사용자에 권한만 추가해주기로 했다.

AmazonEC2ContainerRegistryFullAccess 권한을 추가해주자

 

그리고 액세스키도 만들어준다. 역시 이전 글에 내가 아주 자세하게 써놨다!

 

$ aws configure
AWS Access Key ID [********************]: {액세스 키 ID}
AWS Secret Access Key [********************]: {시크릿 액세스 키}
Default region name [ap-northeast-2]: ap-northeast-2
Default output format [None]:

 

그리고 내 컴퓨터와 EC2인스턴스에 aws configure을 통해 인증 정보를 입력해준다.

Default output format은 그냥 엔터로 넘어가도 된다.

 

 

5. ECR 프라이빗 리포지토리 생성

 

AWS ECR로 들어와서 리포지토리를 생성해준다.

하나의 리포지토리에 하나의 이미지 종류만 저장하고 관리하는 편이다.

 

 

생성한 리포지토리로 들어가서 푸시명령보기를 선택하면 이미지를 인증하고 리포지토리에 푸시하는 명령어가 단계별로 나와있다.

이걸 순서대로 내 컴퓨터의 CLI에 입력해준다.

 

1번은 사용자 로그인을 하는 것이다.

3번은 우리가 지정한 이름의 이미지를 다른 이름으로 변경하는 명령어이다. 그렇게 바꿔야만 ECR에 올릴 수 있기때문

4번은 ECR에 우리 이미지를 push하는 명령어다.

 

 

명령어를 다 입력하고 새로고침 해주면 이렇게 ECR에 이미지가 성공적으로 올라와있다.

 

docker pull {이미지 URL}

 

이미지를 올리면 내 컴퓨터에 이미 이미지 pull 받아져있는 상태가 된다.

하지만 잘 받아지는지 확인하고 싶으니 기존 이미지는 지워주고 위 명령어를 입력해서 테스트해보자

나는 잘 받아졌다!

 

 

6. Dokerfile 생성

# 빌드 과정
FROM openjdk:17-jdk-slim AS builder

WORKDIR /app

# xargs가 필요하므로 필수 유틸 설치
RUN apt-get update && apt-get install -y findutils

COPY . .

RUN ./gradlew build -x test --no-daemon

# 이미지 생성 과정
FROM eclipse-temurin:17-jre

WORKDIR /app

COPY --from=builder /app/build/libs/*SNAPSHOT.jar app.jar

COPY --from=builder /app/src/main/resources/application-dev.yml application.yml

ENTRYPOINT ["java", "-jar", "app.jar", "--spring.config.location=file:/app/application.yml"]

 

이제 진짜 도커파일을 만들어서 이미지로 올려줄 차례. 그 첫번째로 Dokerfile을 생성해준다. 나는 위와 같이 생성해 주었다.

 

그리고 다시 푸시명령 4단계를 똑같이 실행해준다.

 

 

그럼 이미지가 새로운 최신버전으로 생성되었다.

 

 

7.  EC2 인스턴스에서 이미지 pull 받아서 실행

docker pull {이미지 URL}

 

EC2 인스턴스로 가서 푸시명령 1번인 사용자로그인을 해주고 우리가 만든 이미지를 pull 해준다.

그리고 docker run 으로 실행해주면 아래와 같이 오류가 나타난다.

 

WARNING: The requested image's platform (linux/arm64/v8) does not match the detected 
host platform (linux/amd64/v3) and no specific platform was requested

 

이 오류는 CPU 아키텍쳐 환경이 달라서 나타나는 에러이다.

주로 맥북 M1,M2,M3 에러 나는 에러인데 이미지를 빌드한 환경과 이미지를 실행시키는 환경의 CPU 아키텍쳐가 같아야 하는데 그러지 않은게 원인이다.

 

 $ docker build --platform linux/amd64 -t petlog .

 

일단 내 컴퓨터로 가서 빌드와 사용자 로그인을 다시 해주자.

그리고 푸시 명령 2번을 실행 시 위 명령어 처럼 플랫폼을 지정해주는 명령어로 수정해서 입력하자.

설명을 하자면 linux/amd64 환경에 맞게 빌드하라는 뜻이다.

그리고 푸시 명령 3,4번을 똑같이 이어서 마저 해주면 된다.

 

$ docker run -d -p 8080:8080 {이미지 ID}

 

그리고 다시 EC2 인스턴스로 가서 이미지를 pull 해주고 실행시켜준다.

그럼 이렇게 잘 실행된다!

 

EC2 인스턴스의 왼쪽 하단에 있는 PublicIPs 주소:포트번호 로 들어가면 이렇게 배포가 잘되어 접속이 가능하다.

health Check 컨트롤러라도 하나 만들어놔야겠다 500에러 뜨니까 에러가 난것 같고 그러네..!

 

여튼 성공!