Artifact Registry 簡介
Artifact Registry 是 Google Cloud 中專門的容器映像檔儲存庫,當時在 Artifact Registry 推出之前,己經有 Container Registry,但 Container Registry 只支援 Docker 映像檔,並且功能較為簡單,也沒有細緻的權限管理機制,所以 Google 在 2020 年推出 Artifact Registry,作為 Container Registry 的全面升級。
Artifact Registry 除了 Docker 映像外,還支援 Maven Artifacts(Java)、Npm Packages、Python Packages、Helm Charts 等等。
建立容器映像檔示範
準備 Nodejs 程式檔案
接著我們就開始打造一個容器映像檔,並上傳到 Artifact Registry 吧!
首先我們一樣開啟 Cloud Shell,建立一個資料夾例如 nodejs01,然後先建立第一個檔案 server.js
var http = require('http');
var handleRequest = function(request, response) {
response.writeHead(200);
response.end("Hello World from Dongdong Nodejs!!");
}
var www = http.createServer(handleRequest);
www.listen(8080);
然後測試程式能否運作,輸入 node server.js,可以點擊預覽網頁的按鈕,看看網頁是否秀出內容:

準備 Dockerfile
如果確認沒問題,再按下 ctrl + C 取回游標,接著準備第二個檔案 Dockerfile 內容如下:
FROM node:6.9.2
EXPOSE 8080
COPY server.js .
CMD node server.js
Dockerfile 是說明檔,告訴 Docker 要如何打包這個 Image,包含這個容器使用什麼程式語言、對外開放哪個 Port、程式的檔案在哪裡、用什麼指令來跑程式等等。
現在我們已經準備好兩個檔案如下:

建立 Artifact Registry 存放區
接著我們回到 Google Cloud Console,去 Artifact Registry 建立一個存放區:

我們命名「nodejs-1」,格式選擇 Docker,Region 選在 asia-east1,再按下「建立」。 完成之後就會看到它顯示在存放區的列表:

取得憑證
點擊「設定操作說明」,它會開啟一個視窗,並提供一個 gcloud 指令,把它複製起來,這樣之後才能從 Cloud Shell 直接推送映像檔上去:

直接將指令貼到 Cloud Shell 並執行,等它完成即可,你會看到它說 gcloud credentials 註冊成功:

建立 Docker 容器映像檔
接下來準備 Docker image 的完整名稱,它同時也是存放在 Artifact Registry 的路徑,格式如下:
[位置]/[project-id]/[repo_name]/[image_name]:v1
我的映像檔名字就像這樣:
asia-east1-docker.pkg.dev/dong-dong-gcp-2-bigquery/nodejs-1/nodejs-web:v1
準備好之後,就執行以下指令:
docker build -t [位置]/[project-id]/[repo_name]/[image_name]:v1
我的範例指令:
docker build -t asia-east1-docker.pkg.dev/dong-dong-gcp-2-bigquery/nodejs-1/nodejs-web:v1 .
你注意指令最後有一個句點,代表要把當前資料夾 (nodejs01) 內的檔案都打包進這個映像檔。

測試 Docker Image 運作
我們再直接使用 Image 跑一次容器,確認應用程式正常
docker run -d -p [port]:[port] [位置]/[project-id]/[repo_name]/[image_name]:v1
我的範例指令:
docker run -d -p 8080:8080 asia-east1-docker.pkg.dev/dong-dong-gcp-2-bigquery/nodejs-1/nodejs-web:v1
參數 -d ,指的是背景執行
參數 -p 8080:8080 ,指的是把主機的 8080 Port 所有流量轉發到 web 這個Container 的 8080 Port

然後我們點擊 Cloud Shell 視窗右上角的預覽按鈕,可以看到網頁已經正常顯示:

停止 Docker 應用程式
確認無誤的話,我們要停止 Container 運作之前,要先查詢目前正在運作 Container 的 ID:
docker ps
取得 ID 之後,停止指定的 Container
docker stop [container-id]

推送 Docker Image 到 Artifact Registry
現在就可以正式 Push Docker Image 到 Artifact Registry 了,執行以下指令:
docker push [位置]/[project-id]/[repo_name]/[image_name]:v1
我的範例指令:
docker push asia-east1-docker.pkg.dev/dong-dong-gcp-2-bigquery/nodejs-1/nodejs-web:v1

我們看到映像檔已經推上去了,我們可以回到 Console 上按重新整理:

現在我們有一個映像檔在上面,之後就可以部署到 Cloud Run 或 Google Kubernetes Engine 囉!
影片版教學: