想透過簡單的指令,快速構建並部署程式碼到 Cloud Run 嗎?使用 Cloud Run,您不必建立、管理 Kubernetes 節點,即可執行容器化應用程式、快速將容器化映像檔轉到完全託管的 Web 應用程式,該應用程式也會在具有 TLS 憑證的網域上運行,並根據請求自動擴展。
在全代管的無伺服器平台上,您可以使用自己慣用的程式語言 (如:Go、Python、Java、Node.js、NET 等) 開發及部署具備高擴充性的容器化應用程式,且所有 Google Cloud 客戶每月可發出 200 萬次免費請求。當然,您僅須支付程式碼運作期間的費用。就讓宏庭科技架構師手把手帶您深入了解 Cloud Run 該怎麼建置與自動化部署吧!
如何從 Cloud Shell Editor 連到 GCP 專案?
Step 1:首先,請點擊這邊進入 Cloud Shell Editor
Step 2:輸入下面的指令來連到專案(Project),[PROJECT_ID]請填入專案ID
gcloud config set project [PROJECT_ID]
Step 3:點擊Authorize
Step 4:設定完成後會像下面這樣,出現黃色的括弧
如何撰寫 Demo 程式?
Step 1:創建一個 helloworld 資料夾,並切換進去
mkdir helloworld
cd helloworld
Step 2:由於我們的 Demo 是要採用 GO 語言來開發,所以這邊我們需要下面的指令去初始化 go.mod 以聲明 go module
go mod init demo
demo:這個參數可以替換成你想要的命名
Step 3:接著我們需要建立我們的主程式 main.go
vi main.go
Step 4:輸入以下程式碼。這段程式碼是在創建一個基本的 Web Server,並監聽 PORT 這個環境變數定義的端口。
// Sample run-helloworld is a minimal Cloud Run service.
package main
import (
“fmt”
“log”
“net/http”
“os”
)
func main() {
log.Print(“starting server…”)
http.HandleFunc(“/”, handler)
// Determine port for HTTP service.
port := os.Getenv(“PORT”)
if port == “” {
port = “8080”
log.Printf(“defaulting to port %s”, port)
}
// Start HTTP server.
log.Printf(“listening on port %s”, port)
if err := http.ListenAndServe(“:”+port, nil); err != nil {
log.Fatal(err)
}
}
func handler(w http.ResponseWriter, r *http.Request) {
name := os.Getenv(“NAME”)
if name == “” {
name = “World”
}
fmt.Fprintf(w, “Hello %s!\n”, name)
}
如何將程式容器化並上傳到 Container Registry?
接下來我們就可以將這段程式碼打包成 container,並上傳到Container Registry之中。
Step 1:首先我們需要創建一個 Dockerfile 文件
vi Dockerfile
Step 2:貼上以下內容
# Use the offical golang image to create a binary.
# This is based on Debian and sets the GOPATH to /go.
# https://hub.docker.com/_/golang
FROM golang:1.15-buster as builder
# Create and change to the app directory.
WORKDIR /app
# Retrieve application dependencies.
# This allows the container build to reuse cached dependencies.
# Expecting to copy go.mod and if present go.sum.
COPY go.* ./
RUN go mod download
# Copy local code to the container image.
COPY . ./
# Build the binary.
RUN go build -mod=readonly -v -o server
# Use the official Debian slim image for a lean production container.
# https://hub.docker.com/_/debian
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
FROM debian:buster-slim
RUN set -x && apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
ca-certificates && \
rm -rf /var/lib/apt/lists/*
# Copy the binary to the production image from the builder stage.
COPY –from=builder /app/server /app/server
# Run the web service on container startup.
CMD [“/app/server”]
Step 3:添加一個 .dockerignore 文件,以從 container image 中排除文件
vi .dockerignore
Step 4:貼上以下內容
# The .dockerignore file excludes files from the container build process.
#
# https://docs.docker.com/engine/reference/builder/#dockerignore-file
# Exclude locally vendored dependencies.
vendor/
# Exclude “build-time” ignore files.
.dockerignore
.gcloudignore
# Exclude git history and configuration.
.gitignore
Step 5:使用 Cloud Build 來建構 container image,方法是從包含 Dockerfile 的目錄中運行下面的指令
gcloud builds submit –tag gcr.io/PROJECT-ID/helloworld
其中 PROJECT-ID 是GCP專案ID,可以透過執行gcloud config get-value project來獲得該ID
Step 6:建置成功後,我們會看到一條包含image名稱 (gcr.io/PROJECT-ID/helloworld) 的SUCCESS訊息。該image是存儲在Container Registry中,並可以根據需求重複使用。
如何部署到 Cloud Run?
Step 1:透過以下指令將剛剛建好的 image 部署到 Cloud Run 中
gcloud run deploy –image gcr.io/PROJECT-ID/helloworld –platform managed
Step 2:將 PROJECT-ID 帶入我們的GCP專案ID
Step 3:系統會提示我們輸入服務名稱:按 Enter 接受默認名稱 helloworld
Step 4:系統會提示我們輸入區域:選擇我們所要部署的區域,例如 asia-east1
Step 5:系統會提示我們「是否允許未通過身份驗證的呼叫」,這邊輸入Y
Step 6:部署完畢後,會得到 Cloud Run 的服務網址,可以在瀏覽器中開啟
現在,您已經學會如何打包一個 Container image 並將其部署到 Cloud Run 中運行了。Cloud Run 會在需要處理收到的請求時,自動橫向擴充我們的 Container image,並在需要處理的請求減少時,自動橫向限縮我們的 Container image。
想了解更多 Google Cloud 的隱藏版實用功能,請持續鎖定宏庭架構師專欄,讓您新知訊息接不完喔!