ECR에 도커 이미지 업로드하기

KIM TAEHYUN·2023년 6월 19일
3

CICD 구축기

목록 보기
1/1
post-thumbnail

이번 포스트에서는 ECR에 스프링 부트 빌드 파일을 담은 도커 이미지를 업로드 하는 방법에 대해서 적어보고자 합니다.

ECR (Elastic Container Registry)는 말 그대로 AWS의 관리형 컨테이너 이미지 레지스트리 서비스로, IAM 자격을 가지고 있는 사용자 또는 EC2 인스턴스가 ECR에 접속하여 도커 이미지를 push 또는 pull 해올 수 있도록 하는 서비스 입니다.

밍글에서는 ECR를 ECS (Elastic Container Service)를 이용해서 서버를 배포하는 과정에서 프로젝트 빌드 파일을 담은 도커 이미지를 ECS의 FARGATE 또는 EC2 인스턴스에게 전달해주기 위해 사용할 계획입니다.

Jar 파일 생성

먼저 ECR에 container image를 올리기 위해서 docker image를 생성해야합니다. Docker image를 생성하기 위해선 로컬 환경에 docker가 설치되어 있어야하고, 아래 공식 홈페이지를 통해 docker를 다운 받을 수 있습니다.

https://docs.docker.com/desktop/install/mac-install/

먼저 image를 만들기 전, docker image에 넣어서 실행시킬 jar 파일을 만들어주어야 합니다.

여기서 jar 파일은 여러 개의 자바 클래스 파일과 클래스들이 이용하는 관련 리소스 및 메타데이터들을 하나로 모아 둔 파일로, 자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포멧입니다.

inteliJ에서 스프링 부트 프로젝트 파일 오른쪽 상단에 Gradle 메뉴를 클릭한 후 Tasks - build - bootJar를 클릭하여 프로젝트 파일에 대한 jar 파일을 생성합니다.

bootJar 명령어를 통해 생성된 자바 파일은 아래와 같이 프로젝트 파일 안에 build-libs 디렉토리에 생성됩니다.

Dockerfile 작성 및 image 생성

위와 같은 프로세스로 jar 파일이 만들어졌다면, 해당 파일을 담은 Docker Image를 생성할 차례입니다.
프로젝트 root 디렉토리 안에 Dockerfile 이라는 이름의 파일을 생성합니다. 반드시 root 디렉토리 안에 위치할 필요는 없으며 나중에 docker 파일에서 jar 파일의 경로를 작성할 때만 유의해주면 됩니다.

Dockerfile이란 Docker image를 만들기 위한 설계도 같은 파일로, Docker에서 image build시 Dockerfile에 기술된 명령어 순서대로 이미지를 docker container image를 제작합니다.

파일을 생성했다면, 아래와 같이 파일을 작성해줍니다.

FROM openjdk:11
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

Dockerfile의 각 명령어 의미는 다음과 같습니다.

  • FROM : Docker Base Image (기반이 되는 이미지, <이미지 이름>:<태그> 형식으로 설정, 프로젝트에 사용한 자바 버전에 맞게 입력해준다.)
  • ARG : 컨테이너 내에서 사용할 수 있는 변수를 지정할 수 있다.
  • COPY : 위에 선언했던 JAR_FILE 변수를 컨테이너의 app.jar로 복사한다.
  • ENTRYPOINT : 컨테이너가 시작되었을 때 스크립트 실행

이제 위 Dockerfile을 바탕으로 Docker container image를 제작해야합니다.
터미널에서 Dockerfile이 있는 디렉토리로 이동한 후, 아래와 같은 docker build 명령어를 통해 docker image를 생성합니다.

docker build -t ${원하는 이미지 이름} .

빌드가 완료되면 아래 명령어로 image가 잘 생성되었는지 확인할 수 있습니다.

docker images

만들어진 docker image가 잘 작동하는지 확인하고 싶다면, 아래 명령어로 image를 실행시켜 docker container를 로컬 환경에서 띄워볼 수 있습니다.

$ docker run -ti -p8080:8080 ${실행할 이미지 이름}

여기서 -ti 옵션을 통해 현재 터미널과 도커 컨테이너의 실행 프로세스 터미널을 연결할 수 있습니다.
-p8080:8080 은 나의 로컬 8080포트와 docker container 위에 돌아가고 있는 8080포트를 연결하겠다는 의미이며, 만약 스프링부트 프로젝트의 포트 설정을 바꾸었다면, 자신의 프로젝트에 맞는 포트번호를 설정해주어야합니다.

ECR Registry 생성

docker image를 성공적으로 생성했으면, 해당 image를 올릴 ECR Registry를 만들어주어야 합니다.
Registry 생성은 AWS 콘솔 또는 AWS CLI를 통해 생성할 수 있지만, 이 포스트에서는 콘솔을 통해 리포지토리를 생성해보려고 합니다.

사진과 같이 AWS 콘솔에서 ECR를 검색해서 들어온 다음에 리포지토리 생성 버튼을 눌러줍니다.

별다른 설정 할 것 없이 디폴트로 되어있는 설정 그대로 리포지토리 이름만 원하는 이름으로 지어준 후 생성을 마칩니다. 이때 리포지토리를 프라이빗으로 설정으로 해두었으므로 나중에 docker image를 ECR에 올릴 때 AWS Credential 설정이 필요하게 됩니다.

AWS Credential 설정

먼저 AWS Credential를 로컬에 설정하기 위해서 아래 링크의 설명을 따라 AWS CLI 툴을 설치해야합니다.
https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html

먼저 AWS Credential을 설정하기 위해 자신의 AWS 계정의 ACCESS KEY와 SECRET KEY 가 필요합니다.

사진과 같이 AWS 콘솔에서 IAM 메뉴로 이동한 다음 "사용자" 탭에 들어가 "사용자 추가"를 눌러줍니다.

첫 번째 단계에서 원하는 사용자 이름을 설정한 후 다음을 눌러줍니다.

2 단계에서 해당 사용자에 대한 권한을 설정할 수 있는데, 여기서는 편의성을 위해 모든 AWS 계정에 대한 모든 권한을 가지고 있는 Administrator Access 정책을 생성하고자하는 사용자에게 연결해주겠습니다. 좀 더 사용자 별 관리를 위한다면 해당 사용자가 접근하게 될 AWS 리소스에 대해서만 권한을 주는 것이 더 바람직한 방식입니다.

마지막으로 설정을 검토 후 사용자 생성을 눌러 IAM 사용자 생성을 완료합니다.

다음으로 생성된 사용자에 들어와서 보안자격 증명 탭으로 들어가 줍니다.

해당 탭에서 액세스 키 만들기를 클릭한 후 AWS CLI 접근용 액세스 키를 발급 받습니다. 이때 시크릿 키는 처음 발급받고 한 번만 확인할 수 있으니 확인 후 반드시 복사하여 안전한 곳에 보관하는 것을 추천합니다.

위와 같이 사용자 설정을 마쳤으면 로컬 터미널에서

aws configure

위 명령어를 실행하여 액세스 키, 시크릿 키, 리전을 설정해줍니다.

AWS Access Key ID [None]: 액세스 키를 입력한다. (IAM 생성 때 발급)
AWS Secret Access Key [None]: 시크릿 키를 입력한다. (IAM 생성 때 발급)
Default Region name [None]: Seoul 리전을 뜻하는 ap-northeast-2를 입력한다.
Default output format [None]: 비워둔다.(json, text, table을 사용할 수 있다.)

이로써 로컬에서 해당 계정으로의 접근 및 수정권한을 얻었습니다.

ECR Registry에 image push

AWS ECR에 image를 push 하기 위해서는 aws cli를 통해 ECR registry에 대한 접근 인증을 받아야 합니다.

기본적으로 인증부터 image를 올리는 과정까지의 명령어는 미리 생성해 둔 repository에 들어가 푸시 명령 보기를 클릭하면 확인할 수 있으니 먼저 참고해보는 것도 좋습니다.

먼저 ECR에 대한 접근 인증을 받기 위해서는 아래 명령어를 터미널에 입력합니다.

aws ecr get-login-password --region ${사용자 리전} | docker login --username AWS --password-stdin ${ecr url}

이후, 이전에 빌드한 도커 이미지에 아래 명령어를 통해 tag를 붙여 해당 repository에 push 할 수 있도록 해야합니다. tag에 관한 명령어는 위 푸시 명령 보기 메뉴에서 간단하게 복사할 수 있습니다.

docker tag ${위에서 생성한 도커 이미지 이름} ${ecr url} / ${ecr repository 이름}:${버전 정보}

${버전 정보} 에는 숫자 대신 latest를 붙여 가장 최근 버전을 의미하는 태그를 자동으로 붙이도록 설정할 수 있습니다.

마지막으로 아래 명령어를 실행해, 해당 이미지를 AWS ECR repository로 push 할 수 있습니다.

docker push ${ecr url} / ${ecr repository 이름} : ${버전 정보}

push가 완료되면 다음과 같이 콘솔에서 push 된 이미지 정보를 찾을 수 있습니다.

이제 이미지를 ECR에 올렸으니 이를 바탕으로 ECS에서 컨테이너를 띄워서 서버를 구동시킬 일만 남았습니다. 다음 포스트를 통해 ECS의 개념 및 구조와 도커 이미지를 바탕으로 서버를 구동시키는 작업을 정리해보겠습니다.

0개의 댓글