Docker Hub free tier rate limit 100 pulls/6h, team 5 người hết hạn mức trong 2 ngày đầu sprint. ECR giải quyết vấn đề đó, nhưng còn quan trọng hơn: IAM native, scan CVE mỗi lần push, và không có pull limit.

Mình từng dùng Docker Hub cho team nhỏ, đến khi rate limit bắt đầu thì mới cuống chuyển qua ECR. Cái hay của ECR là bạn không cần đổi workflow nhiều – docker login có AWS CLI handle, push/pull vẫn như cũ.

Vì sao chọn ECR thay vì Docker Hub

ECR = Docker Hub private trên AWS. Tích hợp IAM, scan CVE tự động, không rate limit.


  flowchart LR
    Dev["docker push"] --> ECR["ECR"]
    ECR --> Scan["Scan on push<br/>Basic: free · Enhanced: Inspector"]
    ECR --> ECS["ECS Fargate"]
    ECR --> Lambda["Lambda container"]
    ECR --> Replica["Cross-region replication"]
aws ecr create-repository --repository-name myapp-api \
  --image-tag-mutability IMMUTABLE --image-scanning-configuration scanOnPush=true

aws ecr get-login-password | docker login --username AWS --password-stdin \
  123456789012.dkr.ecr.ap-southeast-1.amazonaws.com

docker tag myapp-api:latest 123456789012.dkr.ecr.ap-southeast-1.amazonaws.com/myapp-api:v1.0.0
docker push 123456789012.dkr.ecr.ap-southeast-1.amazonaws.com/myapp-api:v1.0.0

IMMUTABLE tag – reproducible deploy

  • IMMUTABLE tag: không push đè – reproducible deploy

Scan on push

  • Scan on push: Basic (free, scan 1 lần) hoặc Enhanced (Inspector, continuous)

Lifecycle policy – dọn image cũ tự động

  • Lifecycle policy: giữ tối đa N images, auto cleanup

Pull-through cache – tránh Docker Hub rate limit

  • Pull-through cache: cache Docker Hub, tránh rate limit

ECR không phải là Docker Hub thay thế, nó là Docker Hub không có pull limit và có IAM. Nếu bạn đã trên AWS, đây là lựa chọn mặc định.

Bài sau: Phần 21: ECS Fargate – container không cần quản lý server