AWS ECR로 Docker 이미지 관리하기: 완벽 가이드

2023. 10. 27. 22:58·AWS/ECS, ECR
반응형

Docker 이미지를 관리해 주는 DockerHub의 AWS버전인 ECR(Elastic Container Registry)을 생성해 보자

 

 

1. ECR 생성하기


1-1. ECR생성페이지 이동

  • ECR 리포지토리를 생성하기 위해서 AWS의 ECR 페이지로 이동 (웹 검색으로 들어와도 된다.)

ECR 리포지토리 생성하기

 

1-2. ECR 리포지토리 생성버튼 클릭

  • 프라이빗으로 선택하고 간단하게 리포지토리 이름을 작성해 준다.

리포지토리 생성
리포지토리 생성

 

1-3. 리포지토리 생성하기

  • 다 작성하고 하단의 "리포지토리 생성" 버튼을 클릭한다.

이미지 스캔 설정
리포지토리 생성2

 

1-4. ECR 생성완료

ECR 생성완료
ECR 생성완료

 


 

2. ECR에 이미지 push하기 (dockerfile 이용, ARM(애플 M1) 아키텍처 제외버전)


2-1. 우측 상단에 “푸시 명령 보기” 버튼을 클릭한다.

 

푸시 명령 보기
푸시 명령 보기

 

2-2. 아래와 같이 푸시 명령 정보가 나온다.

푸시 명령 정보
푸시 명령 정보

 

2-3. 우선 명령어들을 입력하기 위해 AWS의 CLI를 설치한다.

https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html

 

Install or update the latest version of the AWS CLI - AWS Command Line Interface

When updating from a previous version, the unzip command prompts to overwrite existing files. To skip these prompts, such as with script automation, use the -u update flag for unzip. This flag automatically updates existing files and creates new ones as ne

docs.aws.amazon.com

  • 위의 링크로 들어가서 아래의 가이드를 보면서 설치하면 된다. (금방 된다)

AWS CLI 설치 가이드
AWS CLI 설치 가이드

 

  • 설치를 했다면 아래의 두 명령어를 입력해서 확인한다.
which aws
aws --version

aws cli 설치 확인
aws cli 설치 확인

 

2-4. 이제 이미지 build를 위해 미리 작성한 dockerfile경로로 이동한다.

  • 스프링 부트 프로젝트를 기준으로 dockerfile은 root경로에 만들어 두었다.

프로젝트 root경로
프로젝트 root경로

 

  • dockerfile의 내용은 다음과 같다. ECR은 AWS의 서비스이므로 jdk도 Amazon에서 만든 corretto를 사용했다.
# Use Amazon Corretto 17 as the base image
FROM amazoncorretto:17-al2-jdk

# Make port 8081 available to the world outside this container
EXPOSE 8081

# Specify the built JAR file path and add it to the container as member-api.jar
ARG JAR_FILE=build/libs/member-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} member-api.jar

# Run the JAR file
ENTRYPOINT ["java", "-jar", "/member-api.jar"]

dockerfile 내용
dockerfile 내용

 

2-5. docker 설치하기 (docker가 설치되어있어야 빌드가 가능하다.)

  • 빌드하기 전에 macOS라면 docker desktop을 설치한 후 실행하도록 하자
  • window도 docker desktop을 설치하면 된다. Linux 환경은 명령어로 설치하도록 하자

docker desktop
docker desktop

 

2-6. AWS CLI명령어 사용(위에 있던 푸시 명령을 차례차례 입력한다.)

  • 첫 번째 명령어를 입력한다. (AWS CLI명령어로 ECR에 로그인을 하는 과정)
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 473709498430.dkr.ecr.ap-northeast-2.amazonaws.com
  • 여기서 아래와 같은 오류가 발생했다. 인증이 안된다는 것이다. 에러코드는 다음과 같다.
Unable to locate credentials. You can configure credentials by running "aws configure".
Error: Cannot perform an interactive login from a non TTY device

aws cli 인증 에러
aws cli 인증 에러

 

2-7. 해결방법

  • AWS CLI에서 aws configure 명령을 실행하면, 이러한 자격 증명을 설정 파일에 저장할 수 있다. 이후에 AWS CLI를 사용하여 서비스에 요청을 보낼 때 이 설정 파일의 정보를 사용한다. 이 정보들은 일반적으로 ~/.aws/credentials 파일에 저장된다.
  • 아래와 같이 aws configure를 명령어로 입력하면 AWS의 credentials 입력정보가 나오니 본인의 정보를 입력하면 된다.
# AWS CLI에서 자격 증명을 설정하는 예시
$ aws configure
AWS Access Key ID [None]: (여기에 Access Key ID 입력)
AWS Secret Access Key [None]: (여기에 Secret Access Key 입력)
Default region name [None]: (기본 리전 설정, 예: us-east-1)
Default output format [None]: (출력 형식 설정, 예: json)
  • 간단히 말하면, AWS Access Key ID는 고유한 사용자 ID와 같은 것이고, Secret Access Key는 그 ID의 패스워드와 같다. 두 개가 항상 함께 사용되어야 한다.

 

2-8. 내용 입력하기

  • 위에서 알려준대로 aws configure 명령어를 입력하고 내 IAM계정의 ID, Key 그리고 Region코드와 format인 json을 입력했다.
  • region을 적을때는 웬만하면 직접 타이핑해서 적어주도록 하자 복사했더니 다음 format 설정을 할 때 계속 오류가 발생했다.

aws configure
aws configure

 

2-9. 명령어 다시 입력하기

  • 다시 첫번째 명령어를 입력했더니 이번에는 성공했다. (로그인 성공)

Login Succeded
Login Succeded

 

2-10. 두 번째 명령을 사용하여 도커 이미지를 빌드한다.

  • 도커 파일을 처음부터 새로 빌드하는 방법에 대한 자세한 내용은 여기  지침을 참조해라. 이미지를 이미 빌드한 경우에는 이 단계를 건너뛸 수 있다.
docker build -t recipia-repository .
  • 아래와 같은 오류가 발생할 수도 있는데 이 오류는 docker-desktop을 실행시키지 않고 명령어를 입력해서 그렇다. (도커설치 필수)

docker daemon error
docker daemon error

 

  • docker desktop을 실행한 후 다시 명령어를 쳤더니 이번에는 Dockerfile에서 에러가 발생함 (jdk 설치에러)
    • 이 오류는 위의 내용을 그대로 따라왔다면 발생하지 않을 것이다. jdk17을 alpine버전으로 적어줬는데 없는 버전이라고 나와서 amazoncoretto로 변경했다. (혹시 없는 jdk를 잘못 적어서 오류가 발생하면 이렇게 나올 것이다.)
=> ERROR [internal] load metadata for docker.io/library/openjdk:17-jdk-alpine                                                      2.4s
------
 > [internal] load metadata for docker.io/library/openjdk:17-jdk-alpine:
------
Dockerfile:2
--------------------
   1 |     # Use OpenJDK 17 as the base image
   2 | >>> FROM openjdk:17-jdk-alpine
   3 |     
   4 |     # Make port 8081 available to the world outside this container
--------------------
ERROR: failed to solve: openjdk:17-jdk-alpine: no match for platform in manifest sha256:4b6abae565492dbe9e7a894137c966a7485154238902f2f25e9dbd9784383d81: not found

jdk17 alpine error
jdk17 alpine error

 

2-11. JDK를 AWS의 amazon corretto 17로 변경해서 해결했다.

# Use Amazon Corretto 17 as the base image
FROM amazoncorretto:17-al2-jdk

jdk amazoncorretto:17
jdk amazoncorretto:17

 

2-12. 드디어 빌드에 성공했다. 아래와 같이 나왔다.

=> [2/2] ADD build/libs/member-0.0.1-SNAPSHOT.jar member-api.jar                                                                   0.4s
 => exporting to image                                                                                                              0.2s
 => => exporting layers                                                                                                             0.2s
 => => writing image sha256:73fa77654cbf3390f31726f2a5be64b6d38d8c64a39d5e44e17b0588eba21f9b                                        0.0s
 => => naming to docker.io/library/recipia-repository

 

2-13. 이제 docker image가 잘 생성되었는지 확인하는 작업을 한다.

docker image build
docker image build

 

2-14. 세 번째 명령어를 입력한다. (완성된 이미지에 "이미지 태그"를 지정해서 ECR에 푸시)

  • 여기서 ECR에 이미지를 푸시할 때 내가 구분하길 원하는 태그를 이 명령어에 지정해서 푸시하면 ecr에도 "이미지 태그"가 생긴다.
  • 이 명령어는 "푸시 명령어"에 작성된 걸 복사해서 적절히 수정해 주면 된다.

 

docker tag recipia-repository:latest {내 ecr 리포지토리 URI}:{ecr 리포지토리 tag}

ecr docker image push
ecr docker image push

 

  • ECR에 이미지 push를 성공하면 아래와 같이 나온다.

ECR 푸시완료
ECR 푸시완료

 

  • 이제 ECR 리포지토리에 들어오면 아래와 같이 올라온 이미지가 있다.

ECR repository
ECR repository

 

 

 

지금까지 ECS를 사용하기 위해 ECR을 만드는 과정을 알아봤다.
ECR은 DockerHub와 같은 역할을 하는 저장소인데 AWS에는 생각보다 편리한 기능을 많이 제공하는 것 같다.
특히 ECR, ECS는 같은 아마존의 시스템이라 서로 잘 호환되다 보니 AWS의 CodePipe를 활용해서 CI/CD를 구축할 생각이라면 DockerHub를 사용하는 것보다 ECR을 사용하는 것이 더 효율적이고 편리한 것 같다.



2023.10.27 - [AWS] - Amazon Linux - EC2 인스턴스 요약에서 연결 버튼으로 접속할때 오류


 

Amazon Linux - EC2 인스턴스 요약에서 연결 버튼으로 접속할때 오류

코딩은 글쓰기라고 생각한다. 꾸준히 기록하며 내 개발 실력을 키울것이다.

curiousjinan.tistory.com

2023.10.27 - [AWS] - AWS ECS를 위한 ALB세팅: 실전 예제와 함께

 

AWS ECS를 위한 ALB세팅: 실전 예제와 함께

코딩은 글쓰기라고 생각한다. 꾸준히 기록하며 내 개발 실력을 키울것이다.

curiousjinan.tistory.com

 

반응형

'AWS > ECS, ECR' 카테고리의 다른 글

AWS ECS와 ALB: 동적 포트 vs 명시적 포트 설정의 EC2 DNS 접속 이슈  (1) 2023.10.31
AWS - ALB를 적용시킨 ECS의 동적 포트 할당관계 동작원리  (1) 2023.10.30
AWS - ALB(로드 밸런서)없이 ECS 생성하기  (1) 2023.10.28
AWS EC2를 사용하는 ECS 클러스터 생성 및 사용  (1) 2023.10.28
AWS ECS를 위한 ALB세팅: 실전 예제와 함께  (0) 2023.10.27
'AWS/ECS, ECR' 카테고리의 다른 글
  • AWS - ALB를 적용시킨 ECS의 동적 포트 할당관계 동작원리
  • AWS - ALB(로드 밸런서)없이 ECS 생성하기
  • AWS EC2를 사용하는 ECS 클러스터 생성 및 사용
  • AWS ECS를 위한 ALB세팅: 실전 예제와 함께
Stark97
Stark97
문의사항 또는 커피챗 요청은 링크드인 메신저를 보내주세요! : https://www.linkedin.com/in/writedev/
  • Stark97
    오늘도 개발중입니다
    Stark97
  • 전체
    오늘
    어제
    • 분류 전체보기 (240)
      • 개발지식 (20)
        • 스레드(Thread) (8)
        • WEB, DB, GIT (3)
        • 디자인패턴 (8)
      • JAVA (21)
      • Spring (88)
        • Spring 기초 지식 (35)
        • Spring 설정 (6)
        • JPA (7)
        • Spring Security (17)
        • Spring에서 Java 활용하기 (8)
        • 테스트 코드 (15)
      • 아키텍처 (5)
      • MSA (14)
      • DDD (7)
      • gRPC (9)
      • Apache Kafka (18)
      • DevOps (23)
        • nGrinder (4)
        • Docker (1)
        • k8s (1)
        • 테라폼(Terraform) (12)
      • AWS (32)
        • ECS, ECR (14)
        • EC2 (2)
        • CodePipeline, CICD (8)
        • SNS, SQS (5)
        • RDS (2)
      • notion&obsidian (3)
  • 링크

    • notion기록
    • 깃허브
    • 링크드인
  • hELLO· Designed By정상우.v4.10.0
Stark97
AWS ECR로 Docker 이미지 관리하기: 완벽 가이드
상단으로

티스토리툴바