ECR(Elastic Container Registry)은 Docker 컨테이너 이미지를 저장하고 관리하는 AWS의 완전 관리형 이미지 레지스트리 서비스입니다. Docker Hub와 같은 역할을 하지만, AWS 환경에 통합되어 있어 IAM 기반 접근 제어, 암호화, ECS/EKS와의 자연스러운 연동이 가능합니다.
ECR을 사용하면 이미지를 퍼블릭 인터넷의 Docker Hub에 올리지 않고 AWS 내부에서만 관리할 수 있어 보안이 강화됩니다. ECS와 Fargate에서 이미지를 pull할 때 AWS 내부 네트워크를 사용하므로 빠르고 데이터 전송 비용도 없습니다.
ECR에서 이미지는 Repository(저장소) 단위로 관리됩니다. 하나의 Repository는 하나의 애플리케이션 이미지를 여러 버전으로 저장하는 공간입니다.
ECR 계정 (123456789012.dkr.ecr.ap-northeast-2.amazonaws.com)
|
+-- Repository: my-app
| +-- Image: my-app:1.0.0
| +-- Image: my-app:1.1.0
| +-- Image: my-app:latest
|
+-- Repository: my-api
+-- Image: my-api:prod
+-- Image: my-api:staging
Repository URI는 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-app처럼 AWS 계정 ID, Region, 저장소 이름으로 구성됩니다.
ECR Repository는 프라이빗(Private)과 퍼블릭(Public) 두 종류가 있습니다. 프라이빗은 IAM 권한이 있는 주체만 접근할 수 있고, 퍼블릭은 누구나 pull할 수 있어 오픈소스 이미지 배포에 사용합니다.
ECR에 저장되는 각 Docker 이미지는 Tag로 식별됩니다.
태그(Tag): Docker 이미지의 특정 버전을 식별하는 레이블. latest, 1.0.0, prod 등이 일반적으로 사용됩니다.
latest 태그는 가장 최근에 push된 이미지를 가리키는 관례적인 이름이지만, 실무에서는 명시적인 버전 태그(예: 1.2.3, 20260619-abc1234)를 함께 사용하는 것이 권장됩니다. latest만 사용하면 어떤 버전이 실행 중인지 추적하기 어렵습니다.
ECR에 이미지를 push하고 pull하는 전체 흐름은 다음과 같습니다.
[개발자 로컬]
|
| 1. docker build -t my-app:1.0.0 .
| (로컬에서 이미지 빌드)
|
| 2. aws ecr get-login-password | docker login ...
| (ECR에 Docker 클라이언트 인증)
|
| 3. docker tag my-app:1.0.0 <URI>/my-app:1.0.0
| (ECR URI를 포함한 태그 부여)
|
| 4. docker push <URI>/my-app:1.0.0
| (ECR에 이미지 업로드)
v
[ECR Repository]
|
| 5. ECS/Fargate가 Task 실행 시 docker pull
| (AWS 내부 네트워크로 이미지 다운로드)
v
[ECS Task / Fargate Container]
# 1. ECR 로그인 (AWS CLI 필요)
aws ecr get-login-password --region ap-northeast-2 \
| docker login --username AWS \
--password-stdin 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com
# 2. 이미지 빌드
docker build -t my-app:1.0.0 .
# 3. ECR URI 태그 추가
docker tag my-app:1.0.0 \
123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-app:1.0.0
# 4. ECR에 push
docker push \
123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-app:1.0.0
ECR의 이미지 push/pull 권한은 IAM Policy로 제어합니다. ECS Task나 EC2 인스턴스가 ECR에서 이미지를 pull하려면 해당 리소스에 연결된 IAM Role에 ecr:GetDownloadUrlForLayer, ecr:BatchGetImage 등의 권한이 필요합니다.
AWS 관리형 정책인 AmazonEC2ContainerRegistryReadOnly(읽기)와 AmazonEC2ContainerRegistryPowerUser(읽기/쓰기)를 사용하면 편리합니다.
ECR은 Lifecycle Policy를 통해 오래된 이미지를 자동으로 삭제할 수 있습니다. 예를 들어 "30일 이상 된 이미지는 자동 삭제", "latest 태그 외 이미지는 10개만 유지"와 같은 규칙을 설정하면 저장소를 깔끔하게 유지하고 스토리지 비용을 절감할 수 있습니다.