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-startup
和 docker
单元,例如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
我想在 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-startup
和 docker
单元,例如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