
你的 Docker image 到底該放哪?這篇幫你在五分鐘內做出決定,不用再糾結。
先講結論
| 你的情境 | 直接選這個 |
|---|---|
| 全在 AWS 上 | ECR |
| 全在 GCP 上 | Artifact Registry |
| 用 GitHub Actions | ghcr.io |
| 合規要求嚴、想完全掌控 | 自建 Harbor |
| 小團隊省錢 | Docker Hub Pro 或 ghcr.io 免費方案 |
| 多雲架構 | 挑一個主力雲的 Registry + 跨區複製 |
選 Registry 沒有「最好的」,只有「最適合你現在的」。很多團隊都是從 Docker Hub 開始,被 rate limit 打臉後才搬到 ECR 或 ghcr.io,等團隊長大了再考慮 Harbor。
六個選項,各自的甜蜜點在哪?
自建 Harbor — 控制狂的最愛
Harbor 是 CNCF 畢業專案,功能最完整的開源 Registry。我覺得它最大的賣點不是「免費」,而是資料完全在你手上。金融、醫療這種資料不能出特定網路邊界的產業,Harbor 幾乎是唯一選項。
內建 Trivy 掃描、Project 層級 RBAC、跨站 Replication——功能很香。但代價是你得自己維護 PostgreSQL、Redis、S3 storage,還有 HA 架構。聽起來就很累對吧?
更多 Harbor 部署細節:Harbor(自建)
AWS ECR — AWS 全家桶必備
如果你的服務跑在 ECS/EKS 上,用 ECR 就對了。IAM 認證自動搞定、同 Region pull 免費、Lifecycle Policy 幫你自動清舊 image。唯一要注意的是跨 Region 傳輸費——500MB image 在 100 個 Pod scaling 時就是 50GB 的帳單。
Google Artifact Registry — 不只是 Docker
前身是 GCR,現在升級成 Artifact Registry,支援 Docker、npm、Maven、Python。跟 GKE 的整合靠 Workload Identity 零設定就能 pull,搭配 Binary Authorization 還能強制「沒通過掃描的 image 不准部署」。
Azure ACR — 一行指令搞定 AKS 整合
az aks update --attach-acr 一行就讓 AKS 拉 ACR image。Premium 層有 Geo-replication,ACR Tasks 甚至能直接在 ACR 上 build image,不用在 CI 裝 Docker。
Docker Hub — 老牌但有 Rate Limit 的痛
你有沒有在 CI 裡看過 toomanyrequests: You have reached your pull rate limit?免費帳戶 100 pulls/6hr,CI 頻繁 pull node:20-alpine 就會中招。Docker Hub 的價值在公開 image 生態,但拿來當私有 Registry… Pro $5/月勉強可以,但認真做還是換別的吧。
GitHub Container Registry (ghcr.io) — GitHub Actions 的天生搭檔
用 GITHUB_TOKEN 就能在 Actions 裡 push/pull,不用額外設 secret。公開 image 免費無限制。如果你的 CI/CD 已經在 GitHub Actions 上,ghcr.io 是阻力最小的選擇。
三種常見部署模式
模式一:全雲端 — CI build → push 到 ECR → deploy 到 ECS。所有環節同一平台,認證自動處理,最省心。
模式二:混合架構 — 地端 build → push 到雲端 Registry → 部署到雲端。常見於 code 不能離開內網的場景,注意上傳頻寬。
模式三:多雲 — 以一個 Registry 為主,跨雲複製。複雜度最高,但避免單一供應商鎖定。
最容易踩的坑
- Docker Hub rate limit 打爆 CI:解法是做 Pull-through Cache,或把常用 base image mirror 到自己的 Registry
- image tag 格式搞混:ECR 用
123456789.dkr.ecr.region.amazonaws.com/app、ghcr.io 用ghcr.io/org/app,換 Registry 時所有 Dockerfile 的FROM和 docker-compose 的image都要改 - 跨 Region 傳輸費爆炸:啟用 ECR 的跨 Region 複製,讓各 Region 有本地副本
- ECR token 12 小時過期:大型 build 跑超過 12 小時會 push 失敗,用 credential helper 自動更新
- image 大小失控:沒做 multi-stage build,1-2GB 的 image 讓 push/pull 慢到不行。用
docker history檢查 layer 大小
實戰的 CI/CD 設定範例(GitLab CI、GitHub Actions、ECR Lifecycle Policy),我放在 下一篇。
Registry 就像停車場,重點不是它多豪華,而是離你的目的地夠不夠近。