【问题标题】:Why is Google Compute Engine not running my container?为什么 Google Compute Engine 没有运行我的容器?
【发布时间】:2020-07-12 21:24:40
【问题描述】:

我可以成功:

  • 将我的应用程序捆绑到 docker 映像中
  • 在推送到主服务器时使用 Google Cloud Build 将此映像构建到容器中
    • (此容器存储在注册表中,例如gcr.io/my-project/my-container
  • 使用 Google Cloud Run 将此容器部署到网络
  • 访问 Cloud Run 网址并查看我的网站

我现在正在尝试更复杂的构建,我认为下一步是使用 Google Compute Engine。

首先,我只是尝试部署我部署到 Cloud Run 的同一应用的单个实例:

  • 导航到Compute Engine > VM Instances
  • 输入实例名称等基本信息
  • 在“容器映像”下输入我的容器位置:gcr.io/my-project/my-container
    • (顺便说一句,我怀疑该界面未在此处为您现有的 Container Registry 项目提供选择器。)
  • 选择“允许 HTTP 流量”和“允许 HTTPS 流量”
  • 点击“创建”

GCE 需要一分钟的时间来创建它,然后它会显示绿色的复选标记和实例名称,以及“外部 IP:35.238.xxx.xxx”。我在浏览器中访问该 URL 并得到...“35.238.xxx.xxx 拒绝连接。”

为了检查,我返回 GCE 页面并选择我的实例旁边的“SSH > 在浏览器窗口中打开”,这会打开机器的一种云终端。

在此终端窗口中,键入 ps 并查看没有进程正在运行。容器DockerfileCMD yarn start:prod 结尾,所以我猜这里不会发生这种情况。

此外,我 ls 在这里和那里导航,并从我的 DockerfileWORKDIR /app 命令中看到没有 /app 目录。似乎不仅我的应用程序没有启动,而且容器没有复制到 VM 实例?

我做错了什么?

【问题讨论】:

  • 您检查过文档Deploying a container on a new VM instance 吗?我使用 Google 提供的 Nginx Docker 映像 gcr.io/cloud-marketplace/google/nginx1:latest 创建了 VM,并允许 HTTP/HTTPS 连接。我成功连接到http://EXTERNAL_IP_OF_MY_VM,发现预期的Welcome to nginx!,同时https访问不起作用(可能是因为没有配置)。
  • 要检查来自 VM 端的测试映像,我已通过 SSH 连接到它并运行命令 docker ps 以检查已部署容器的状态。此外,我已经使用命令docker attach CONTAINER_ID_NAMES 连接到容器,并且能够看到我对 NGINX Web 服务器的请求。之后我断开连接并使用命令docker exec -it CONTAINER_ID_NAMES /bin/bash 连接到容器以与之交互。
  • 1.尝试通过 http 2 访问您的应用程序。使用 docker ps 检查容器的状态。 3. 使用docker attach CONTAINER_ID_NAMES 和/或docker exec -it CONTAINER_ID_NAMES /bin/bash 连接到您的容器并检查您的应用程序的状态。 4.Check logs。不要忘记检查Limitations
  • 演示也不适合我。部署后,公网IP的网站什么都没有返回。使用gcloud 打开虚拟机控制台时,输入时显示:“错误。启动代理遇到错误。您的容器未启动。要检查代理的日志,请使用“sudo journalctl -u konlet-startup”命令。
  • 我也去了 Cloud Console 中的实例页面,点击了“stackdriver logging”。在那里,我在日志中看到了这个错误:“错误:无法启动容器:无效的参考格式”。这是用于演示的,我已按照说明进行操作。

标签: google-cloud-platform google-compute-engine


【解决方案1】:

对于遇到此问题的任何人。我遇到了同样的问题,无法弄清楚。

阅读 Serhii 的回答给了我线索。我相信截至今天(2021 年 1 月),GCP Console 用户界面有点无用。看来,如果您在创建 VM 时输入容器名称,但 WITHOUT 最后指定了一个标签,它不会抱怨也不会假定默认值,例如“最新”,它只是默默地失败。因此是虚拟机,但没有运行 docker 容器。

至少它现在对我有用,希望这对其他人有帮助。

【讨论】:

  • 我遇到了相反的问题,它默认显示“my-container:latest”(从容器注册表中选择 Deploy to GCE 时),当我删除“ :最新的"
【解决方案2】:

检查您的虚拟机是否有外部 IP 地址。

如果没有,VM 可能无法通过网络访问公共存储库,甚至无法访问 Google 容器注册表 (gcr.io),并且 docker 容器不会静默启动。

【讨论】:

  • 谢谢!我很困惑为什么我的实例启动了,但没有拉出容器
【解决方案3】:

我决定再次关注Deploying a container on a new VM instance

请在下面找到我的步骤和命令:

  1. 使用network tag http-server 创建一个运行Docker 映像gcr.io/cloud-marketplace/google/nginx1:latest 的新VM:

    $ gcloud compute instances create-with-container instance-3 --tags=http-server,https-server --container-image=gcr.io/cloud-marketplace/google/nginx1:latest
    Created [https://www.googleapis.com/compute/v1/projects/test-prj/zones/europe-west3-a/instances/instance-3].
    NAME        ZONE            MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
    instance-3  europe-west3-a  n1-standard-1               10.156.0.30  35.XXX.111.XXX  RUNNING
    
  2. create 一个新的防火墙规则:

    $ gcloud compute firewall-rules create default-allow-http --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp:80 --source-ranges=0.0.0.0/0 --target-tags=http-server
    Creating firewall...⠹
    Created [https://www.googleapis.com/compute/v1/projects/test-prj/global/firewalls/default-allow-http].                   
    Creating firewall...done.                                                                                                                            
    NAME                NETWORK  DIRECTION  PRIORITY  ALLOW   DENY  DISABLED
    default-allow-http  default  INGRESS    1000      tcp:80        False
    
  3. 检查当前的防火墙规则:

    $ nmap -Pn 35.XXX.111.XXX
    Starting Nmap 7.70 ( https://nmap.org ) at 2020-04-02 12:04 CEST
    PORT   STATE SERVICE
    ...
    80/tcp open  http
    
  4. 检查 NGINX 是否在容器中运行:

    $ curl -I http://35.XXX.111.XXX
    HTTP/1.1 200 OK
    Server: nginx/1.16.1
    ...
    
    $ curl http://35.XXX.111.XXX 
    ...
    <h1>Welcome to nginx!</h1>
    ... 
    

也可以通过网络浏览器http://35.XXX.111.XXX

  1. 检查容器状态:

    $ gcloud compute ssh instance-3
    ...
    instance-3 ~ $ docker ps
    CONTAINER ID        IMAGE                                                                COMMAND                  CREATED             STATUS              PORTS               NAMES
    ...
    a657c8871239        gcr.io/cloud-marketplace/google/nginx1:latest                        "/usr/local/bin/dock…"   14 minutes ago      Up 14 minutes                           klt-instance-3-uwtu
    
  2. 附加到容器并在单独的终端中运行curl http://35.XXX.111.XXX

    instance-3 ~ $ docker attach a657c8871239
    YY.YY.43.203 - - [02/Apr/2020:10:18:06 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.64.0" "-"
    YY.YY.43.203 - - [02/Apr/2020:10:18:07 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.64.0" "-"
    

我在查看文档时没有发现任何错误。

解决您的问题

  1. 将您的步骤和命令与我的比较。
  2. 在您的项目上按照documentation 运行测试Docker 映像。
  3. 尝试使用您的自定义图像复制来自 documentation 的步骤。

如果您仍有问题 - 使用您的所有步骤、命令和输出更新您的问题。

【讨论】:

    【解决方案4】:

    我也遇到了问题,实例正在运行,但无法拉出我的容器。

    错误:无法启动容器:来自守护程序的错误响应: {"message":"unautho rized: 您没有所需的权限 执行此操作,您可能拥有无效的凭据。到 验证您的请求,请按照以下步骤操作: https://cloud.google.com/container-registry/docs/advanced-authentication"

    我必须在 yaml 文件中添加一些 extra scopehttps://www.googleapis.com/auth/source.full_control

    steps:
    - name: gcr.io/cloud-builders/docker
      args: ['build', '-t', 'gcr.io/local-xxxxxxxxxxxxxx/apptraining', '.']
    
    - name: 'gcr.io/cloud-builders/docker'
      args: ["push", "gcr.io/local-xxxxxxxxxxxxxx/apptraining"]
    
    - name: 'gcr.io/cloud-builders/gcloud'
      args: ['compute', 'instances', 'create-with-container', 'instanceapptraining', '--machine-type=n1-standard-1', '--scopes=https://www.googleapis.com/auth/devstorage.full_control,https://www.googleapis.com/auth/trace.append,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/userinfo.email,https://www.googleapis.com/auth/bigquery,https://www.googleapis.com/auth/datastore,https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/trace.append,https://www.googleapis.com/auth/source.full_control,https://www.googleapis.com/auth/source.read_only,https://www.googleapis.com/auth/compute.readonly','--zone=us-central1-a', '--preemptible', '--container-image=gcr.io/local-xxxxxxxxxxxxxx/apptraining:latest']
    

    【讨论】:

      猜你喜欢
      • 2021-12-10
      • 2019-12-15
      • 2017-04-07
      • 2023-01-22
      • 2016-08-23
      • 2018-08-06
      • 2014-12-14
      • 1970-01-01
      • 2017-12-19
      相关资源
      最近更新 更多