dev_eun

[Spring Boot 배포 with AWS ECS] ① Dockerfile 작성, Docker 이미지 빌드, ECR 업로드 본문

Cloud/AWS

[Spring Boot 배포 with AWS ECS] ① Dockerfile 작성, Docker 이미지 빌드, ECR 업로드

_eun 2024. 1. 30. 14:46

Spring Boot 배포 with AWS ECS 시리즈

1. (현재글) Dockerfile 작성, Docker 이미지 빌드, ECR 업로드

2. AWS 로드 밸런서(Load Balancer) 및 대상 그룹(Target Group) 설정

3. ECS 태스크 정의, 클러스터, 서비스, 태스크 설정

4. 가비아 도메인을 컨테이너로 연결 및 HTTPS 적용

5. Github Action을 통해 CD 구축하기

 

 

안녕하세요.

AWS의 ECS 서비스를 처음 써보면서 삽질을 오래 해서 지친 사람입니다 🫠

저같은 사람들이 한 명쯤 있을까 하여 시리즈를 작성하게 되었습니다. 혹시 잘못된 부분이나 추가하면 좋을 내용 등 피드백이 있다면 코멘트 주시면 감사합니다.

 


 

 

먼저 아래 요소들을 전제로 Docker 이미지 빌드 및 업로드 해보겠습니다.

1. 빌드가 가능한 상태의 Spring 애플리케이션 프로젝트가 존재

2. 자신의 컴퓨터에 Docker 설치 완료

3. AWS 계정 존재

참고로 저의 Docker 버전은 24.0.6 입니다.(2023.12.05.)

Dockerfile 작성

Dockerfile은 Docker Container를 어떻게 만들어야 하는지 작성해놓은 설명서같은 것입니다.

docker build 명령어를 입력하면, docker는 명령어의 루트 디렉토리에 있는 Dockerfile를 참고해서 이미지를 빌드합니다.

Dockerfile은 INSTRUCTION(지시어)와 arguments(인자)로 구성된 문장으로 구성되어 있습니다.

INSTRUCTION arguments

지시어는 대소문자를 구분하지 않지만, 대문자로 작성하는 것이 관례입니다.

Docker는 이 Dockerfile에 존재하는 지시어들을 작성된 순서대로 실행합니다.

저는 아래와 같이 작성하였습니다.

FROM eclipse-temurin:17-jdk-alpine
ARG JAR_FILE=/build/libs/*-SNAPSHOT.jar
COPY ${JAR_FILE} ecs-test.jar
ENTRYPOINT ["java","-jar","/ecs-test.jar"]

 

- FROM <이미지>:<태그>

FROM 지시어는 새로운 빌드 단계를 초기화하고, 뒤에 있을 지시어를 위해서 Base Image(Dockerfile에 지정된 부모 이미지가 없는 이미지)를 세팅합니다.

제가 작성한 인자는 eclipse-temurin의 17-jdk-alpine 태그를 가진 이미지입니다. Docker Hub에서 퍼블릭 이미지를 확인할 수 있습니다. (참고)

이 값은 각자 프로젝트의 JDK 버전에 맞춰서 세팅해주셔야 합니다.

- ARG <name>=<value>

ARG는 docker build 명령어를 통해서 사용자가 전달할 수 있는 변수를 정의합니다. 이 변수는 빌드타임에 사용할 수 있고, --build-arg <name>=<value>를 전달하지 않을 경우 디폴트 값으로 쓰입니다.

- COPY <src>=<dest>

파일로부터 새로운 파일이나 디렉토리를 복사해서, 컨테이너 내부 파일 시스템에서 path에 복사한 것들을 추가하는 지시어입니다.

이미 빌드되어 있는 파일의 경로인 ${JAR_FILE}을 컨테이너 내부에 ecs-test.jar로 복사합니다. 이름을 자유롭게 변경해주세요.

가 "/"로 끝날 경우 디렉토리로 인식되는 점을 주의해주세요.

- ENTRYPOINT ["java","-jar","/note-quest-api.jar"]

실행파일로 실행할 컨테이너를 구성할 수 있는 지시어입니다.

빌드된 jar 파일을 실제로 실행할 때 사용하는 명령어들을 리스트 형태로 ENTRYPOINT 지시어의 인수로 작성합니다.

docker run 커맨드를 사용하면 ENTRYPOINT로 작성했던 명령어를 실행하여 컨테이너를 구성합니다.

 

 

Docker Image 빌드

아래 명령어를 입력하여 이미지를 빌드해주세요.

$ docker build --platform linux/amd64 -t ecs-test .

그리고 아래 명령어를 사용하면 ecs-test 이름의 이미지가 생성된 것을 확인할 수 있습니다.

$ docker images

 

ECR에 이미지 업로드

이제 ECR에 이미지를 업로드 해봅시다.

 

ECR의 공식 명칭은 Elastic Container Registry로, AWS에서 제공하는 Docker Hub 같은 컨테이너 리포지토리입니다.

Public Registry 사용할 경우에는 무료이고, Private Registry를 사용할 경우 데이터 송신 크기에 따라 요금이 부과됩니다.

특별히 설정할 것은 없으니 어떠한 레지스트리든 하나 생성해주세요. 저는 private repository를 사용할 예정입니다.

 

생성 후 해당 레포지토리로 들어가보면 "푸시 명령 보기"이 있습니다.

 

여기서 이미지를 푸시할 수 있는 명령어를 확인할 수 있습니다.

 

이 명령어들을 실행하려면 먼저 AWS CLI가 설치되어 있고, 자격증명이 완료되어야 합니다. 관련해서 아래 글을 참조해주세요.

 

AWS CLI 자격증명하기

AWS CLI를 사용하기 위해선 최초 한 번 자격 증명을 해주어야 합니다. AWS CLI 설치 먼저, AWS CLI는 공식 홈페이지에서 다운 받아 설치할 수 있습니다. https://aws.amazon.com/ko/cli/ Command Line Interface - AWS CLI

ttalkisyrup.tistory.com

 

 

첫 번째 명령어는 본인의 자격증명을 통해 AWS 리포지토리에 로그인 하는 명령어입니다. 그대로 복사하셔서 터미널에서 실행해주세요.

 

두 번째 명령어는 아까 빌드 했으니 생략합니다.

 

세 번째는 태그를 붙이는 명령어입니다. 아래와 같이 구성되어 있으니, 각자 앞에서 설정한 이름대로 실행해주세요.

$ docker tag <이미지이름>:latest <ECR레포지토리>/<이미지이름>:latest

 

저는 ecs-test로 이미지 이름을 세팅하였으니 아래와 같은 명령어로 실행합니다.

$ docker tag ecs-test:latest <ECR레포지토리>/<이미지이름>:latest

 

마지막으로 네 번째 명령어를 실행합니다. 세 번째 명령어에서 가장 마지막 인자를 그대로 push해주시면 됩니다.

성공적으로 완료가 되었다면, ECR에서 업로드된 이미지를 확인하실 수 있습니다.

728x90