본문으로 건너뛰기

[ECR] Amazon ECR 리포지토리 생성 및 이미지 푸시 가이드

Prerequisite​

본 가이드를 진행하기 전에 다음 항목이 준비되어 있어야 합니다:

  • AWS 계정 접근 권한: ECR 리포지토리를 생성할 수 있는 IAM 권한이 필요합니다.
  • Docker 설치: 로컬 환경에 Docker가 설치되어 있어야 합니다.
    • macOS: Docker Desktop 설치
    • Windows: Docker Desktop 설치
    • 설치 확인: 터미널에서 docker --version 명령어 실행
  • AWS CLI 설치 및 구성: AWS 명령줄 도구가 설치되고 자격 증명이 설정되어 있어야 합니다.
    • 설치 확인: aws --version
    • 자격 증명 설정: aws configure
  • Docker 이미지 준비: ECR에 업로드할 Docker 이미지가 로컬에 빌드되어 있거나 빌드 가능한 상태여야 합니다.

알아두기​

ECR(Elastic Container Registry)이란?

  • AWS에서 제공하는 Docker 컨테이너 이미지를 저장하고 관리하는 서비스입니다.
  • Docker Hub와 유사하지만 AWS 환경과 완벽하게 통합되어 있습니다.
  • Private 저장소로 운영되어 보안이 강화됩니다.

주요 용어

  • 리포지토리(Repository): Docker 이미지를 저장하는 공간 (예: my-app, web-server)
  • 이미지 태그(Tag): 이미지의 버전을 구분하는 레이블 (예: latest, v1.0, prod)
  • 레지스트리 URI: ECR 리포지토리의 주소 (예: 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com)

Process​

1. ECR 리포지토리 생성​

AWS 콘솔에서 ECR 리포지토리를 생성하는 단계입니다.

  1. AWS Management Console에 로그인합니다.

  2. 검색창에 **"ECR"**을 입력하거나 서비스 목록에서 Elastic Container Registry를 선택합니다.

  3. 왼쪽 메뉴에서 **프라이빗 레지스트리/리포지토리(Repositories)**를 클릭합니다.

  4. 우측 상단의 리포지토리 생성(Create repository) 버튼을 클릭합니다.

  5. 리포지토리 설정을 입력합니다:

   일반 설정

  • 리포지토리 이름(Repository name):
    • 간결한 이름을 입력합니다. 리포지토리는 네임스페이스를 지원하며, 이를 사용하여 유사한 리포지토리를 그룹화할 수 있습니다.
    • 이름은 문자로 시작해야 하며 소문자, 숫자 및 특수 문자(._-/)만 포함할 수 있습니다.
    • 최소 2자, 최대 256자까지 입력 가능합니다.
    • 예시: my-web-app, backend/api-server, frontend-app

(중요) 리포지토리 이름은 생성 후 변경할 수 없으므로 신중하게 정합니다.

이미지 태그 설정

  • 이미지 태그 변경 가능성(Tag mutability):
    • Mutable(변경 가능): 이미지 태그를 덮어쓸 수 있습니다. (기본값)
    • Immutable(변경 불가): 이미지 태그를 덮어쓸 수 없습니다. 동일한 태그로 푸시 시 에러가 발생합니다.

알아두기: 프로덕션 환경에서는 Immutable 설정을 권장하여 실수로 이미지가 덮어써지는 것을 방지할 수 있습니다.

  • 변경 가능한 태그 제외(Mutable tag exclusion) (선택사항):
    • 특정 태그 패턴을 변경 불가능하게 설정할 수 있습니다.
    • 와일드카드(*)를 사용하여 패턴을 지정합니다.
    • 예시: prod-*, release-* 등의 프로덕션 관련 태그만 보호

암호화 설정

  • 암호화 구성(Encryption configuration):
    • AES-256 (기본값, 권장): 업계 표준 Advanced Encryption Standard (AES) 암호화를 사용합니다.
    • AWS KMS: AWS Key Management Service(KMS)에 저장된 키를 사용하여 리포지토리의 이미지를 암호화합니다.

(Notice) 리포지토리 생성 후에는 암호화 설정을 변경할 수 없습니다.

이미지 스캔 설정 - deprecated

  • 푸시할 때 스캔(Scan on push):
    • 활성화 시 리포지토리에 푸시된 후 각 이미지를 자동으로 보안 취약점 스캔을 수행합니다.
    • 비활성화 시 각 이미지 스캔을 수동으로 시작해야 합니다.

(Notice) 이 설정은 deprecated(사용 중단 예정)되었으며, 레지스트리 수준 구성으로 이동되었습니다. 새로운 방식의 스캔 설정은 ECR 레지스트리 설정에서 리포지토리 필터링을 통해 구성할 수 있습니다.

  1. 하단의 리포지토리 생성(Create repository) 버튼을 클릭합니다.  
  2. 생성이 완료되면 리포지토리 목록에서 새로 생성된 리포지토리를 확인할 수 있습니다.

2. 리포지토리 URI 확인​

생성된 리포지토리의 주소를 확인하는 단계입니다.

  1. 리포지토리 목록에서 방금 생성한 리포지토리 이름을 클릭합니다.

  2. 상단의 URI 정보를 확인하고 복사합니다.

URI 형식: [AWS계정ID].dkr.ecr.[리전].amazonaws.com/[리포지토리명]

예시: 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-web-app

[스크린샷]

(Notice) 이 URI는 이미지 태그 작업과 푸시 작업에 필요하므로 메모장에 복사해 둡니다.

3. Docker 이미지 준비​

ECR에 업로드할 Docker 이미지를 준비합니다.

기존 이미지가 있는 경우

  1. 터미널에서 로컬 Docker 이미지 목록을 확인합니다.

docker images

예시 출력:

REPOSITORY TAG IMAGE ID CREATED SIZE my-app latest abc123def456 2 hours ago 500MB

새로운 이미지를 빌드하는 경우

  1. Dockerfile이 있는 디렉토리로 이동합니다.

cd /path/to/your/project

  1. Docker 이미지를 빌드합니다.

docker build -t [이미지명] .

예시:

docker build -t my-web-app .

  1. 빌드가 완료되면 이미지를 확인합니다.

docker images

4. ECR 인증 (Docker Login)​

Docker 클라이언트가 ECR에 접근할 수 있도록 인증하는 단계입니다.

  1. 터미널에서 다음 명령어를 실행하여 ECR 로그인을 수행합니다.

AWS CLI v2 사용 (권장)

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

예시:

aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com

  1. 로그인 성공 시 Login Succeeded 메시지가 출력됩니다.

(중요) 이 인증은 12시간 동안 유효하며, 만료 시 다시 로그인해야 합니다.

5. Docker 이미지 태그 지정​

로컬 이미지에 ECR 리포지토리 주소로 태그를 추가합니다.

  1. 다음 형식으로 이미지에 태그를 지정합니다.

docker tag [로컬이미지명]:[태그] [ECR리포지토리URI]:[태그]

예시:

docker tag my-web-app:latest 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-web-app:latest

버전별 태그 예시:

docker tag my-web-app:latest 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-web-app:v1.0.0

  1. 태그가 정상적으로 지정되었는지 확인합니다.

docker images

예시 출력:

REPOSITORY TAG IMAGE ID CREATED SIZE my-web-app latest abc123def456 2 hours ago 500MB 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-web-app latest abc123def456 2 hours ago 500MB

6. ECR에 이미지 푸시​

태그가 지정된 이미지를 ECR 리포지토리로 업로드합니다.

  1. 다음 명령어로 이미지를 푸시합니다.

docker push [ECR리포지토리URI]:[태그]

예시:

docker push 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-web-app:latest

  1. 푸시 진행 상황이 터미널에 표시됩니다.

The push refers to repository [123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-web-app] abc123def: Pushed 456789ghi: Pushed latest: digest: sha256:1234567890abcdef... size: 2421

(Notice) 이미지 크기에 따라 업로드 시간이 소요될 수 있습니다. 네트워크 상태를 확인하세요.

7. ECR 콘솔에서 이미지 확인​

업로드된 이미지를 AWS 콘솔에서 확인합니다.

  1. AWS 콘솔의 ECR 서비스로 돌아갑니다.

  2. 리포지토리 목록에서 해당 리포지토리를 클릭합니다.

  3. 이미지(Images) 탭에서 업로드된 이미지를 확인할 수 있습니다.

표시 정보:

  • 이미지 태그
  • 푸시된 시간
  • 이미지 크기
  • 취약점 스캔 결과 (스캔이 활성화된 경우)

8. ECR 이미지 풀(Pull) 및 실행​

ECR에 저장된 이미지를 다른 환경(다른 PC, EC2 인스턴스 등)에서 가져와 사용하는 단계입니다.

ECR 로그인

  1. 이미지를 가져올 환경에서 터미널을 열고 ECR에 로그인합니다.

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

예시:

aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com

  1. Login Succeeded 메시지가 출력되면 로그인 성공입니다.

이미지 풀(Pull)

  1. ECR 리포지토리에서 이미지를 로컬로 다운로드합니다.

docker pull [ECR리포지토리URI]:[태그]

예시:

docker pull 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-web-app:latest

  1. 다운로드가 완료되면 로컬 이미지 목록을 확인합니다.

docker images ```

예시 출력: ``` REPOSITORY TAG IMAGE ID CREATED SIZE 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-web-app latest abc123def456 2 hours ago 500MB

이미지 실행

  1. 다운로드한 이미지를 컨테이너로 실행합니다.

docker run -d -p [호스트포트]:[컨테이너포트] [ECR리포지토리URI]:[태그]

예시:

docker run -d -p 80:80 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-web-app:latest

옵션 설명:

  • -d: 백그라운드에서 컨테이너 실행 (detached mode)
  • -p 80:80: 호스트의 80번 포트를 컨테이너의 80번 포트로 연결
  1. 실행 중인 컨테이너를 확인합니다.

docker ps ```

예시 출력: ``` CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES abc123def456 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-web-app:latest "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp amazing_curie


Trouble Shooting​

no basic auth credentials​

증상: docker push 실행 시 no basic auth credentials 에러 발생

원인: ECR 로그인이 만료되었거나 로그인을 하지 않은 상태입니다.

해결 방법:

  1. ECR 로그인 명령어를 다시 실행합니다.

aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com

denied: Your authorization token has expired

증상: 이미지 푸시 중 authorization token 만료 에러 발생

원인: ECR 인증 토큰은 12시간 동안만 유효하며, 그 이후에는 재로그인이 필요합니다.

해결 방법:

  1. ECR에 다시 로그인합니다.

aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com

Repository does not exist​

증상: 이미지 푸시 시 리포지토리가 존재하지 않는다는 에러 발생

원인:

  • ECR 콘솔에서 리포지토리를 생성하지 않았습니다.
  • 리포지토리 이름이나 리전이 잘못되었습니다.

해결 방법:

  1. ECR 콘솔에서 리포지토리가 생성되어 있는지 확인합니다.
  2. 리전이 올바른지 확인합니다 (예: ap-northeast-2).
  3. 리포지토리 이름의 대소문자와 철자를 정확히 확인합니다.

​

retrying in ... seconds

증상: 이미지 푸시가 매우 느리거나 계속 재시도됩니다.

원인: 네트워크 연결이 불안정하거나 이미지 크기가 매우 큽니다.

해결 방법:

  1. 네트워크 연결 상태를 확인합니다.
  2. .dockerignore 파일을 활용하여 불필요한 파일을 제외하고 이미지 크기를 줄입니다.
  3. 안정적인 네트워크 환경에서 다시 시도합니다.

​

Cannot connect to the Docker daemon

증상: docker 명령어 실행 시 Docker daemon 연결 에러 발생

원인: Docker가 실행되고 있지 않습니다.

해결 방법:

  1. Docker Desktop을 실행합니다 (macOS/Windows).
  2. Linux의 경우 Docker 서비스를 시작합니다:

sudo systemctl start docker


또 다른 질문이 있으십니까? 문의 등록