文章详情

GCP 300刀赠金 GCP谷歌云部署Docker容器

谷歌云GCP2026-04-17 19:24:37AWS免实名账号出售

各位正在为「本地跑得好好的 Docker,一上云就变哑巴」而挠头的朋友们,欢迎来到本场不卖课、不画饼、不甩术语的 GCP 实战小课堂——《GCP 谷歌云部署 Docker 容器》。本文不是官方文档的中文翻译,而是我用三台崩溃过的 Cloud Run 实例、两次被拒的 IAM 权限申请、以及一次深夜对着 gcloud run deploy 报错反复念咒语换参数后,亲手攒出来的「人话部署流水账」。

一、别急着敲 docker build,先让 GCP 认你这个「自家人」

很多人第一步就栽在「我账号明明登录了,为啥 gcloud 命令说『You do not currently have an active account』?」——恭喜,你中了 GCP 的经典温柔陷阱:它不看你浏览器里登没登录 Gmail,只认 gcloud auth login 这个「叩门砖」。

打开终端,老老实实执行:

gcloud auth login
gcloud config set project YOUR-PROJECT-ID

注意!YOUR-PROJECT-ID 不是项目名称,是那个带短横线的 ID(比如 my-awesome-app-412839),在控制台「项目设置」里才能看见。输错?后面所有命令都会返回「Project not found」,然后你一边查文档一边怀疑人生。

二、开服务?不是点「启用」就完事,得挑对「命定之选」

GCP 不是阿里云那种「一键全开」风格。你要手动激活几个关键服务,而且顺序还有讲究:

  • Cloud Build API:帮你远程构建镜像(不用本地推)
  • Artifact Registry API:你的私有镜像仓库(别再用 Docker Hub 公开裸奔了)
  • Cloud Run Admin API:不然部署时会报「Permission denied on service run.googleapis.com」

别信控制台右上角那个「一键启用全部推荐 API」——它可能漏掉 Artifact Registry。老办法:进「API 和服务 → 库」,挨个搜、挨个点「启用」。启用后等 30 秒再操作,GCP 的服务启动像泡方便面,得等水开。

三、权限?不是给项目 Owner 就万事大吉

你给了自己项目 Owner 角色,但 Cloud Run 部署时仍报:
ERROR: (gcloud.run.deploy) PERMISSION_DENIED: Permission 'run.services.create' denied on resource 'projects/xxx/locations/us-central1'

别慌,这不是你权限不够,是你没给服务账户加权。Cloud Run 默认用的是 [email protected] 这个账户(名字长得像乱码,但它真在后台替你干活)。去「IAM 和管理 → IAM」,找到它,点击「编辑成员」,添加角色:
✅ Cloud Run Admin
✅ Artifact Registry Reader(拉镜像用)
✅ Storage Object Admin(Cloud Build 构建时读写缓存)

加完别忘了点保存。十分钟后你再试,世界突然安静了——因为权限终于通了。

四、镜像别往 Docker Hub 丢,GCP 自家仓库更香更安全

先建一个区域级仓库(推荐 us-central1,便宜又快):

gcloud artifacts repositories create my-repo \
    --repository-format=docker \
    --location=us-central1 \
    --description="My app's private Docker repo"

然后配置本地 Docker 使用它:

gcloud auth configure-docker us-central1-docker.pkg.dev

这步做完,你的 docker push 才能真正把镜像送进 GCP 的保险柜。镜像名长这样:
us-central1-docker.pkg.dev/YOUR-PROJECT-ID/my-repo/my-app:v1.2

记住:每次改版本号,必须重新 push;不 push,Cloud Run 就只能对着空气 deploy。

五、Cloud Run 部署?别只 copy-paste 示例命令

最简部署命令如下(请按需替换):

gcloud run deploy my-app \
    --image=us-central1-docker.pkg.dev/YOUR-PROJECT-ID/my-repo/my-app:v1.2 \
    --platform=managed \
    --region=us-central1 \
    --allow-unauthenticated \
    --port=8080 \
    --cpu=1 \
    --memory=512Mi

重点解释几个易翻车参数:

  • GCP 300刀赠金 --allow-unauthenticated:不开它,访问会跳 Google 登录页(适合内部工具);开了它,全世界都能 curl 你服务(上线前务必确认!)
  • --port=8080:必须和你 Dockerfile 中 EXPOSE 及应用实际监听端口严格一致。Node.js 写 app.listen(3000) 却填 --port=8080?直接 502。
  • --cpu=1:免费层只支持 1 vCPU;想升 2 核?记得改配额(「IAM 和管理 → 配额」里搜「Cloud Run CPU」)

六、部署完打不开?别急着删服务,先看三处日志

Cloud Run 控制台右上角有个「日志」按钮,点进去看三条关键流:

  1. Container Runtime Logs:你的应用启动日志(如 Server listening on port 8080 出没出现?没出现?八成是 CMD 没跑起来)
  2. System Logs:GCP 的系统反馈(如 Container failed to start… Readiness probe failed)
  3. Build Logs(如果用了 Cloud Build):看看是不是 RUN npm install 时网络超时了

我曾因 Dockerfile 里写了 CMD ["npm", "start"],但 package.json 没配 "start": "node server.js",导致容器启动即退出——日志里就一行 npm ERR! missing script: start,安静得让人心疼。

七、Bonus:一条命令自动构建+部署(懒人福音)

不想本地 build 再 push?用 Cloud Build 一条龙:

gcloud builds submit \
    --pack=image=us-central1-docker.pkg.dev/YOUR-PROJECT-ID/my-repo/my-app:v1.3 \
    --project=YOUR-PROJECT-ID

它会自动识别 Dockerfile、构建、推送到 Artifact Registry,然后你再 gcloud run deploy 就行。省下 3 分钟,多喝半杯咖啡。

最后说句掏心窝子的

GCP 部署 Docker,本质不是技术难题,而是「和平台建立信任关系」的过程:它要你明示身份(auth)、明确权限(IAM)、指定地盘(repo)、说清规则(deploy flags)。每一步拒绝,都是它在问:「你是谁?你想干啥?你有证吗?」答对了,它立刻笑脸相迎;答错一个字,就给你甩个看不懂的错误码。

所以别怕报错。把错误消息复制进控制台搜索框,点开第一个「排查」链接;把日志里最后一行红字圈出来,去 GitHub 上搜;实在卡死,就删掉当前服务,新建一个同名服务重来——Cloud Run 创建/删除秒级完成,成本几乎为零。

毕竟,我们不是在征服云,是在学着跟它好好说话。

——写于又一次成功 curl 通 https://my-app-xxxxx-uc.a.run.app 后,凌晨 1:23,咖啡见底。

Telegram售前客服
客服ID
@cloudcup
联系
Telegram售后客服
客服ID
@yanhuacloud
联系