直接從 Artifact Registry Pull Docker Hub

如果是沿著網路資訊學習 Container 跟 Docker 的話,應該有八成第一次 Push Image 就是到 Docker Hub,今天就要記錄從 Google Artifact Registry (GAR) 直接 Pull Docker Hub,雖然直接使用 gcloud CLI Push 到 GAR 也不慢就是了。

Reference: https://cloud.google.com/artifact-registry/docs/repositories/create-dockerhub-remote-repository#console_1

Why using Google Artifact Registry

首先,這個就是個「大平台」Google Cloud Platform,如果之後要拓展其他雲端應用很方便;接著他有伺服器在 Taiwan (asia-east1),速度肯定超爆快,而且投資台灣一定要支持的吧!想去 Google 工作嗚嗚嗚;然後,部署會用到的幾的應用如這篇的 Google Artifact Registry、Cloud Run、Compute Engine 都有提供「永久免費」額度,絕對香,是三個 Main IaaS 最有誠意的。

Free Tier

  • Compute Engine
    • 每個月免費在 us-west1、us-central1、us-east1 建立一個 e2-micro instance,有 30GB 的免費空間,中文版的說可以在幾個限定區有 5GB 的免費 snapshot 備份,但實測是沒有,雖然但是我常態 4 個快照每個月也只需要不用 $5 NTD,可能平常多看地板走路就有了。可能會有網路流量費用,從北美到台灣,我的部落格的話每個月大概是 $0.001 NTD(??Google 是有沒有要賺錢)
  • Cloud Run
    • 200 萬次 Request
    • 360,000 GB-秒的記憶體和 180,000 vCPU-秒的運算時間
    • 免費從北美流出 1GB,但如果把 Region 設在 Taiwan 就不會算到
  • Artifact Registry
    • 每個月 500MB 容量,我實測如果你 Dockerfile 不是整個 COPY . . ,大概可以放個兩三個,而且他會壓縮,我筆電上 Docker Desktop 顯示最大的 412MB,但到了 GAR 剩下 260MB,另外一個 300MB 直接 Push 上去的大概剩下 75MB

Steps to Pull Docker Hub into GAR

  1. 確認你的 Docker Hub 有 Image
  2. 新增 Docker Hub Access Token for GAR
  3. 在 GCP 上進入 GAR 新增一個 Docker Remote Repository
  4. 將上上一步驟 Token 儲存到 Secret Manager 並開放 GAR 權限
  5. 打開 Cloud Shell Docker Pull

確認你的 Docker Hub 有 Image

廢話,假設我之前 Push 到 Docker Hub 的 Image 根據 Docker 命名規則是 gabriel/my-image(username/image_name)。

新增 Docker Hub Access Token for GAR

進到 Docker Hub 後點擊你的頭像,My Account >> Security >> New Access Token,就是下圖右上那個藍藍的按鈕,設定為 Read-only 就可以了,新增的 Token 關掉就無法再看到了,記得要先 Copy 起來後面會用到。

進入 Google Artifact registry 新增一個 Docker Remote Repository

這邊遠端存放區驗證模式就放入你的 Docker Hub username,然後點進去 Secret Manager 儲存剛剛的 Token(看下一步,弄好了之後回來選擇你的密鑰之後建立就可以),這樣才可以直接在 Cloud Shell Pull。

將上上一步驟 Token 儲存到 Secret Manager 並開放 GAR 權限

如果沒有啟動 API 要啟動。建立密鑰,然後

接著處理這個密鑰的權限,請點擊新增主體之後,把下面這個的 [PROJECT-NUMBER] 替換成你要用的 Project Number(不是 Project ID,可以在 Dashboard 查到)作為主體,如果 GCP 查不到主體的話會顯示紅色的,接著指派角色:Secret Manager 密鑰存取者

Reference: Grant the Artifact Registry service account access to your secret

service-[PROJECT-NUMBER]@gcp-sa-artifactregistry.iam.gserviceaccount.com

打開 Cloud Shell Docker Pull

設定好之後就可以直接從 Cloud Shell 輸入 docker pull 指令了!使用前請記得根據指示(Use “gcloud config set project [PROJECT_ID]” to change to a different project.)輸入 Project ID 選擇專案。之後唯一要注意的只有要符合 GCR 的格式了。

稍微解釋一下,前面的部分一直到 REPOSITORY-NAME 的部分可以直接在存放區複製,後面的 Image 就是,以我的為例:Docker Remote Repository 存放區在台灣(asia-east1-docker.pkg.dev),接著 PROJECT-ID 是 Gabriel ,再來 REPOSITORY-NAME 是我設定的 repo,最後加上剛剛說我在 Docker Hub 上的 Image name 是 gabriel/my-image,所以我的指令就是 docker pull asia-east1-docker.pkg.dev/Gabriel/repo/gabriel/my-image

Reference: Pull an image into your remote repository(如果跟我一樣直接使用 Cloud Shell 就不用 gcloud auth login)

docker pull asia-east1-docker.pkg.dev/PROJECT-ID/REPOSITORY-NAME/IMAGE:[TAG]

看看下圖這邊有個複製按鈕。

完成了就可以在 Cloud Run 輕鬆部署了!可喜可賀!