Duoyun Cloud
返回博客
tutorials2026-04-17

GCP Cloud Run容器部署教程

GCPCloud Run容器部署

GCP Cloud Run容器部署教程

Google Cloud Run 是 GCP 提供的全托管无服务器容器运行平台,它让你无需管理任何基础设施即可运行容器化应用。Cloud Run 结合了容器的灵活性和无服务器的便捷性,是现代云原生应用的理想选择。本教程将带你从零开始,完成一个容器化应用到 Cloud Run 的全流程部署。

Cloud Run 核心概念

Cloud Run 基于 Knative 开源框架构建,提供以下核心特性:

  • 全托管:Google 负责底层基础设施、安全补丁和运行时维护
  • 自动扩缩:从零到数千个实例自动扩缩,空闲时缩容到零
  • 按用量计费:仅按实际处理的请求数和 CPU/内存使用量付费
  • 容器原生:支持任何语言、任何框架,只要能打包成容器即可
  • HTTPS 默认:自动配置 SSL 证书和自定义域名

Cloud Run 定价

| 资源项 | 免费额度 | 超出后价格 | |--------|----------|------------| | vCPU | 每月 2 个 vCPU-秒/秒 | $0.00004000/vCPU-秒 | | 内存 | 每月 1 GB-秒/秒 | $0.00000475/GB-秒 | | 请求 | 每月 200 万次 | $0.40/百万次 | | 网络(出站) | 每月 5GB(北美) | $0.08/GB |

环境准备

# 安装 Google Cloud SDK
curl https://sdk.cloud.google.com | bash

# 初始化并登录
gcloud init

# 启用必要 API
gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com \
  containerregistry.googleapis.com

示例应用:Go 语言 Web 服务

我们使用 Go 语言构建一个简单的 Web API 服务。创建项目目录并添加以下文件:

// main.go
package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "os"
)

type Response struct {
    Message   string `json:"message"`
    Hostname  string `json:"hostname"`
    Version   string `json:"version"`
}

func handler(w http.ResponseWriter, r *http.Request) {
    hostname, _ := os.Hostname()
    resp := Response{
        Message:  "Hello from Cloud Run!",
        Hostname: hostname,
        Version:  "1.0.0",
    }
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(resp)
}

func healthHandler(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    fmt.Fprint(w, "OK")
}

func main() {
    http.HandleFunc("/", handler)
    http.HandleFunc("/health", healthHandler)
    port := os.Getenv("PORT")
    if port == "" {
        port = "8080"
    }
    log.Printf("Server starting on port %s", port)
    log.Fatal(http.ListenAndServe(":"+port, nil))
}

创建 Dockerfile

# Dockerfile
# 构建阶段
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o server main.go

# 运行阶段
FROM alpine:3.19
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/server .
EXPOSE 8080
CMD ["./server"]

方式一:使用 Cloud Build 一键部署

Cloud Run 最便捷的部署方式是使用 Cloud Build 的自动构建和部署流程:

# 一键构建并部署
gcloud run deploy my-service \
  --source . \
  --region us-central1 \
  --allow-unauthenticated \
  --cpu 1 \
  --memory 512Mi \
  --min-instances 0 \
  --max-instances 100 \
  --set-env-vars "VERSION=1.0.0"

此命令会自动完成:源码构建 → Docker 镜像创建 → 推送到 Artifact Registry → 部署到 Cloud Run。

方式二:手动构建并部署

如果需要更多控制权,可以分步操作:

# 1. 构建 Docker 镜像
docker build -t us-central1-docker.pkg.dev/$(gcloud config get-value project)/my-repo/my-service:v1 .

# 2. 推送到 Artifact Registry
docker push us-central1-docker.pkg.dev/$(gcloud config get-value project)/my-repo/my-service:v1

# 3. 部署到 Cloud Run
gcloud run deploy my-service \
  --image us-central1-docker.pkg.dev/$(gcloud config get-value project)/my-repo/my-service:v1 \
  --region us-central1 \
  --allow-unauthenticated \
  --cpu 1 \
  --memory 512Mi \
  --port 8080

配置自动扩缩容

Cloud Run 的自动扩缩容是其核心优势之一:

gcloud run services update my-service \
  --region us-central1 \
  --min-instances 1 \
  --max-instances 50 \
  --concurrency 80 \
  --cpu-throttling

| 参数 | 说明 | 推荐值 | |------|------|--------| | --min-instances | 最小实例数,设为1避免冷启动 | 0(省钱)/ 1(低延迟) | | --max-instances | 最大实例数,防止无限扩容 | 10-100 视业务而定 | | --concurrency | 每实例最大并发请求数 | 80(默认)/ 1000(I/O密集) | | --cpu-throttling | CPU 在无请求时是否节流 | 启用(省钱)/ 禁用(CPU密集) |

配置自定义域名和 HTTPS

# 映射自定义域名
gcloud run domain-mappings create \
  --service my-service \
  --domain api.example.com \
  --region us-central1

# 验证域名所有权后,Cloud Run 自动配置托管 SSL 证书

持续部署(CI/CD)配置

推荐使用 Cloud Build Triggers 实现自动化部署:

# cloudbuild.yaml
steps:
  # 构建镜像
  - name: 'gcr.io/cloud-builders/docker'
    args: ['build', '-t', 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/my-service:$COMMIT_SHA', '.']

  # 推送镜像
  - name: 'gcr.io/cloud-builders/docker'
    args: ['push', 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/my-service:$COMMIT_SHA']

  # 部署到 Cloud Run
  - name: 'gcr.io/cloud-builders/gcloud'
    args:
      - 'run'
      - 'deploy'
      - 'my-service'
      - '--image=us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/my-service:$COMMIT_SHA'
      - '--region=us-central1'
      - '--platform=managed'

images:
  - 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/my-service:$COMMIT_SHA'

安全最佳实践

  1. 使用 Artifact Registry 而非 Container Registry(更安全、区域化)
  2. 最小权限原则:Cloud Run 服务账号仅授予必要权限
  3. Secret Manager 集成:敏感配置使用 Secret Manager 挂载
# 挂载 Secret
gcloud run services update my-service \
  --update-secrets=DB_PASSWORD=my-secret:latest
  1. VPC Connector:访问 VPC 内资源(如 Cloud SQL)时配置 Serverless VPC Access
  2. IAM 认证:内部服务关闭 --allow-unauthenticated,使用 IAM 控制访问

监控与可观测性

Cloud Run 自动集成 GCP 的可观测性套件:

  • Cloud Logging:容器 stdout/stderr 自动收集
  • Cloud Monitoring:请求延迟、错误率、实例数等指标
  • Cloud Trace:分布式追踪,需在代码中集成
// 添加 OpenTelemetry 追踪
import (
    "go.opentelemetry.io/otel"
    "go.opentelemetry.io/otel/exporters/trace/jaeger"
)

func initTracer() {
    exporter, _ := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint("http://localhost:14268/api/traces")))
    tp := tracesdk.NewTracerProvider(tracesdk.WithBatcher(exporter))
    otel.SetTracerProvider(tp)
}

Cloud Run vs 其他容器部署方式

| 特性 | Cloud Run | GKE | Compute Engine | |------|-----------|-----|----------------| | 管理开销 | 零 | 中 | 高 | | 自动扩缩 | 自动(到0) | 需配置 HPA | 需自行实现 | | 冷启动 | 有(~1-3秒) | 无 | 无 | | 网络控制 | 有限 | 完全 | 完全 | | 最长请求时间 | 60分钟 | 无限制 | 无限制 | | 按用量计费 | 是 | 按节点 | 按实例 |

总结

GCP Cloud Run 为容器化应用提供了极致的部署便捷性,特别适合 API 服务、Web 应用和事件驱动型工作负载。从零到上线只需一条命令,自动扩缩容让你无需担心流量波动。

通过多云平台购买 GCP 资源,可享受合作伙伴专属折扣和专业技术支持,最高节省 20% 的云服务开支。立即访问 duoyun.io 了解详情。

需要专业云服务咨询?

我们的云架构师团队免费为你定制最优方案

免费咨询

相关文章

news

GCP Next 2026大会亮点回顾

2026-04-23
optimization

GCP承诺使用折扣CUD详解

2026-04-22
news

各大云厂商新一代GPU实例对比

2026-04-21