cover

你的 Docker image 到底該放哪?這篇幫你在五分鐘內做出決定,不用再糾結。

先講結論

你的情境直接選這個
全在 AWS 上ECR
全在 GCP 上Artifact Registry
用 GitHub Actionsghcr.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 就像停車場,重點不是它多豪華,而是離你的目的地夠不夠近。