[AWS] RDS, ECR, EKS를 활용한 애플리케이션 배포(2): Docker 이미지 빌드하여 ECR에 업로드하기

728x90
반응형

Docker 이미지 빌드하여 ECR에 업로드하기

지난 글: [AWS] RDS, ECR, EKS를 활용한 애플리케이션 배포(1): AWS RDS와 Bastion Host로 데이터베이스 환경 구축하기

지난 글에 이어서, 서버 애플리케이션의 도커 이미지를 빌드하여 ECR에 업로드하는 과정을 살펴보겠습니다.
과정은 간단하게, 프로젝트를 빌드하여 정상적으로 빌드되는지 확인 후, Dockerfile을 작성하고 도커 이미지를 빌드하여 ECR 레지스트리에 푸시하는 것입니다.
여기에서 서버 애플리케이션은 Spring Boot 3.4.0 버전으로 작성하였으며, 데이터베이스와 연동한 간단한 API가 구현되어 있습니다.


1. Spring Boot 애플리케이션 연결하기

깃허브 실습 레포: https://github.com/bestlalala/EKS-Postgre-SpringBoot.git

  • Laungage: Java 17
  • Framework: 3.4.0
  • Type: Gradle - Groovy
  • Project SDK: JDK 17

Dependencies

Lombok
Spring Boot DevTools
Spring Data JPA
PostgreSQL Driver
Spring Web

 

1) 프로젝트 빌드를 위한 환경변수 설정하기

Spring Boot 환경변수 설정 방법: .env, dotenv, application-test.yaml

 

Spring Boot 환경변수 설정 방법: .env, dotenv, application-test.yaml

Spring Boot Application 환경변수 설정하기애플리케이션을 배포하기 위해서는 소스 코드를 빌드해야 하는데, 이때 데이터베이스 연결 정보와 같은 부분들은 깃허브에 절대 올리면 안 되기 때문에, 따

ynslee627.tistory.com

 

2) API 테스트

서버 애플리케이션을 실행한다.

브라우저, Postman API 또는 Selenium 같은 도구를 이용해서 응답이 잘 오는지 확인한다.


2. Docker 이미지 빌드하여 ECR에 업로드하기

현재 프로젝트를 EKS(EKS 클러스터)에 배포하려면 프로젝트를 Docker 이미지로 만들고 이를 Amazon ECR(Elastic Container Registry)에 업로드하는 과정이 필요하다. 

 

💡  도커 이미지가 필요한가?

1. EKS는 컨테이너 기반 플랫폼이다.

EKS는 쿠버네티스를 기반으로 한 서비스로, 컨테이너 이미지를 사용하여 애플리케이션을 배포한다. 따라서 애플리케이션을 컨테이너 이미지로 변환해야 쿠버네티스에서 실행할 수 있다.

2. Amazon ECR은 컨테이너 이미지를 저장하고 관리하는 데 사용된다.

Amazon ECR은 AWS의 관리형 컨테이너 레지스트리 서비스로, EKS에서 이미지를 가져오는 데 사용된다. 이미지를 ECR에 저장하면 EKS가 이를 바로 참조할 수 있다.


1) 프로젝트 빌드

먼저, 프로젝트를 빌드하여 빌드가 성공적으로 되는지 확인한다.

🤔 도커 이미지를 만들기 전에 프로젝트 빌드를 하는 이유는?

애플리케이션 코드가 정상적으로 빌드되고 실행 가능한 상태인지 확인하고, 실행 가능한 파일(JAR/WAR 등)이 도커 이미지에 포함될 수 있도록 하기 위해서이다. 또한, 빌드 과정에서 의존성 문제나 빌드 오류를 사전에 예방하고, 최적화된 실행 파일을 생성하는 것도 중요한 이유이다.

빌드를 하기 전에 먼저 Test를 하는데, Test 과정에서 데이터베이스 테스트를 하기 때문에 이 단계에서도 데이터베이스에 접속할 수 있어야 한다. 테스트를 통과하기 위한 데이터가 준비되어 있어야 하기 때문에 데이터베이스 접속 코드가 없다면 빌드가 실패한다.

 

빌드 시 수행하는 사항은 다음과 같다:

  • 의존성 라이브러리를 다운로드
  • 프로그램을 컴파일
  • 테스트 프로그램 컴파일
  • 테스트 실행
  • 프로그램 실행을 위한 아카이브 파일(JAR, WAR 등, 테스트 부분은 제거) 생성

프로젝트 빌드 명령어

./gradlew clean build

 

2) ECR 레포지토리 생성

AWS 관리 콘솔에서 ECR 레포지토리를 생성한다: k8s/backend-app

 

3) 도커 이미지 빌드 & Amazon ECR에 업로드

AWS CLI를 사용하여 ECR에 도커 이미지를 업로드해야 한다.

Dockerfile 작성

이미지 빌드를 위한 도커 파일을 작성한다: Dockerfile

FROM amazoncorretto:17

ARG JAR_FILE=build/libs/*.jar

COPY ${JAR_FILE} app.jar

ENTRYPOINT ["java", "-jar", "app.jar"]

 

ECR 페이지에서 레포지토리 선택 후 푸시 명령 보기를 선택하면, ECR에 로그인부터 이미지 빌드, ECR에 업로드하는 코드까지 모두 볼 수 있다.

@warning
Apple M1칩은 docker build 명령어로 빌드하면 오류가 나기 때문에,
이미지 빌드할 때 docker buildx 명령어를 사용해야 한다.
<오류가 발생하는 이유>
EKS에서는 주로 x86_64 아키텍처의 인스턴스를 사용하지만, M1 맥은 ARM 아키텍처이기 때문이다.
이 경우 EKS에서 실행되지 않을 수 있다. 따라서 EKS 클러스터의 아키텍처에 맞게 이미지를 다시 빌드해야 한다.

ECR 로그인

aws ecr get-login-password --region <리전> | docker login --username AWS --password-stdin <계정 ID>.dkr.ecr.<리전>.amazonaws.com

계정번호를 숨기기 위해 명령어 뒷부분 자름

 

이미지 빌드

M1 칩에서는 플랫폼 호환성을 위해 docker buildx 명령어를 사용해 빌드하는 것이 좋다.

이미지 이름이 <ECR 레포지토리 URI>:태그 형식으로 만들어져야 한다.

그 이유는, 이미지는 해당 URI으로 태깅해야 ECR에서 어느 레포지토리에 이미지를 저장할지 알 수 있기 때문이다.
또한, 태그를 추가하여 동일한 레포지토리의 여러 버전의 이미지를 저장하고 관리할 수 있다.

따라서 ECR의 정확한 연동과 이미지 버전 관리를 위해 필수적이다.

docker build -t 이미지이름 .

 

Apple M1칩의 경우, 다음 명령어로 도커 이미지를 빌드하고나서 바로 ECR에 푸시한다.

# M1칩의 경우
docker buildx build --platform linux/amd64 \
-t <레포지토리 URI>:<태그> \
--push .

docker buildx 명령어는 docker build 명령어와는 다르게 기본적으로 이미지를 로컬에 저장하지 않는다.
결과 이미지를 명시적으로 푸시하거나 로드해야 저장된다. 명시하지 않으면 결과는 캐시에만 남고 경고 메시지가 뜬다.

이미지를 저장하려면 아래 두 가지 옵션 중 하나를 사용하면 된다.

  • --load: 로컬 Docker 데몬에 저장
  • --push: 레지스트리에 푸시

docker build 명령어를 사용하는 경우에는, 아래와 같은 과정으로 ECR에 푸시한다.

도커 이미지 빌드 → 이미지 태깅 → ECR에 푸시

이미지 태깅

빌드된 이미지를 ECR URI에 맞게 태그를 지정한다.

docker tag 이미지ID <ECR 레지스트리 URI>:<태그>

도커 이미지 확인

빌드된 도커 이미지를 확인하려면 다음 명령어를 실행한다.

docker images

ECR에 푸시

이미지를 ECR로 푸시한다.

docker push <레포지토리 URI>:<태그>

 

ECR 레지스트리 확인

ECR 레지스트리를 확인해보면, 다음과 같이 도커 이미지가 잘 업로드된 것을 확인할 수 있다.


이어서 다음 글에서는 EKS 클러스터에 API 애플리케이션 배포하는 과정을 살펴보겠습니다.

728x90
반응형