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