Google 云部署容器 VM "Command" 选项

Google Cloud Deploying Containers VM "Command" option

我想在 Google 云上创建一个虚拟机,运行 是我的 docker 容器。我的图像在 Google 的 Artifact Registry 中,我可以将它部署到 VM,但它不允许网络请求,即使是在本地(我尝试从本地 SSH curl 并且它赢了' 工作)。该容器是一个简单的 Node.js 应用程序,可以 returns 对任何请求“你好”。

我认为问题出在我创建容器/运行 图像时指定端口。在我的本地命令行上创建容器时,我只需使用 -p 运算符将端口发布到容器。但是由于 Google 的 VM 从 Artifact Registry 获取图像并在构建 VM 时自动创建一个容器,因此我没有步骤 运行 -p 标记。

我认为解决方案可能与 Cloud Console 中的“命令”选项有关(见下文),但 docs 看起来这与应用程序的“入口点”有关而不是创建容器的选项。如何在将图像部署到 Google 云 VM 时自定义容器创建以允许发布端口?

编辑:日志

好的,日志比我想象的更有趣。 我是对的,最初创建了一个 docker 容器。

但是这个容器很快就被删除了,新的容器出现了,它的 ID 不同,并且经常重新启动。

编辑 2:

Docker 文件:

FROM node:latest
WORKDIR /untitled
COPY package.json .
RUN npm install
EXPOSE 3000
COPY . ./
CMD node server.js

我的项目名为“无标题”。这是一个测试图像,只是为了让一切正常。

实际的Node.js代码是这样的:

const express = require("express");

const app = express();

const port = process.env.PORT || 3000;

app.get('/', (req, res) => {
    res.send("Hi there!")
})

app.listen(port, () => console.log("Listening On Port 3000"))

而我的Package.json是

{
  "name": "untitled",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.2"
  }
}

我确定我正在做的事情有问题,但我怀疑它是源代码——当我 运行 一个本地 docker 容器时它不会退出。

IIRC 使用 gcloud compute create-with-container 将容器绑定到主机的网络。因此,容器公开的任何端口应该在主机上的(相同)端口上可用。

您能否确认您的容器在 VM 上 运行? SSH 登录,然后 docker container ls(就像在本地一样)。

能否提供有关 curl 命令和响应的更多信息。

您应该能够 sudo journalctl VM 检查其启动并确定它在启动容器时遇到的任何问题。您可能需要具体查看 konlet-startupdocker 单元,例如sudo journalctl --unit=konlet-startup 观察它是否启动了一个容器(希望是你的容器 [ID])。

另一件事是 ss 虚拟机的(tcp 侦听)端口。其中之一应与您的容器匹配:

sudo ss --tcp --listening --processes
更新
PROJECT=...
ZONE=...

gcloud compute instances create-with-container test \
--container-image=gcr.io/kuar-demo/kuard-amd64:blue \
--image-family=cos-stable \
--image-project=cos-cloud \
--machine-type=f1-micro \
--zone=${ZONE} \
--project=${PROJECT}

gcloud compute ssh ${INSTANCE} \
--zone=${ZONE} \
--project=${PROJECT}

在虚拟机上:

docker container ls --format="{{.ID}}\t{{.Image}}"
521d11ace93b    gcr.io/kuar-demo/kuard-amd64:blue
11ae194b354e    gcr.io/stackdriver-agents/stackdriver-logging-agent:1.8.9

curl \
--silent \
--output /dev/null \
--write-out '%{response_code}' \
localhost:8080
200 # Success

# Matches `kuard` container
sudo journalctl --unit=konlet-startup
Starting a container with ID: 521d11ace93b...

# http-alt == 8080
sudo ss --tcp --listening --processes
Local Address:Port         Process                              
*:http-alt                 users:(("kuard",pid=893,fd=3))

# Using pid from ss command
ps aux | grep 893
893  /kuard