您可以在虚拟机上运行单个容器,也可以在托管式实例组 (MIG) 中的每个虚拟机上运行单个容器。为此,您可以在创建虚拟机实例或实例模板时指定容器映像和配置参数。
本文档介绍了在 Compute Engine 实例上运行容器的配置选项。
准备工作
- 如果您不熟悉容器,请参阅 Compute Engine 上的容器。
- 如果您对 Docker 不熟悉,请参阅 Docker 文档。
- 阅读在 Compute Engine 上部署容器。
- 
  
  如果您尚未设置身份验证,请进行设置。身份验证用于验证您的身份,以便访问 Google Cloud 服务和 API。如需从本地开发环境运行代码或示例,您可以通过选择以下选项之一向 Compute Engine 进行身份验证:
  
   
   
     
   
  
   
   
     
   
  
   
   
     
   
  
 
 
 
  
    
      Select the tab for how you plan to use the samples on this page: ConsoleWhen you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication. gcloud- 
 
 
  
  
   
   
  
   
   
  
   
   
     
   
  
  
   
   
  
   
   
  
   
   
  
 
 
   
   
      安装 Google Cloud CLI。 安装完成后,运行以下命令来初始化 Google Cloud CLI: gcloud init如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。 
- Set a default region and zone.
 创建要用于在虚拟机和 MIG 上部署容器的实例或实例模板时,请使用 Google Cloud 控制台或 Google Cloud CLI 指定容器配置。 以下部分介绍如何在虚拟机实例上配置容器,但您也可以在创建实例模板时配置以下选项。使用 Google Cloud 控制台或 Google Cloud CLI 在实例模板中配置虚拟机实例的选项。 您可以使用 docker run命令在运行 Container-Optimized OS 的虚拟机实例上配置容器,也可以在启动脚本中指定docker run命令来创建和配置虚拟机。如需了解详情,请参阅使用启动脚本在虚拟机上部署容器。指定重启政策您可以设置重启政策,以指定是否在退出时重启容器。默认政策是始终重启。您还可以将政策设置为失败时重启或设置为永不重启。 docker run使用 docker run命令的--restart标志。 重复尝试重启容器的操作由默认的 Docker 行为确定(如--restart参考文档中所指定)。控制台- 转到创建实例页面。 
- 在容器部分中,点击部署容器。 
- 在配置容器页面上,执行以下操作: - 指定容器映像名称。
- 在重启政策部分中,选择容器的重启政策。
- 如需确认容器详细信息,请点击选择。
 
- 继续虚拟机创建过程。 
 gcloud使用 --container-restart-policy标志可为容器指定重启政策:- always(默认)
- on-failure
- never
 以下示例启动了一个采用 on-failure重启政策的容器,这意味着仅当容器退出代码非零时才会重启:gcloud compute instances create-with-container busybox-vm \ --container-image docker.io/busybox:1.27 \ --container-restart-policy on-failure 如需为虚拟机上运行的容器指定重启策略,可将 gcloud compute instances update-container命令与--container-restart-policy标志结合使用。在特权模式下运行容器您可以在特权模式下运行容器,以允许其访问主机上的所有设备。默认情况下,容器以“非特权”模式运行,不能访问任何设备。 docker run使用 docker run命令的--privileged标志。如需了解详情,请参阅运行时特权和 Linux 功能。控制台- 转到创建实例页面。 
- 在容器部分中,点击部署容器。 
- 在配置容器页面上,执行以下操作: - 指定容器映像名称。
- 选择以特权模式运行。
- 如需确认容器详细信息,请点击选择。
 
- 继续虚拟机创建过程。 
 gcloud使用 --container-privileged标志可运行具有运行时特权的容器。以下示例将以特权模式启动 busybox 容器:gcloud compute instances create-with-container busybox-vm \ --container-image docker.io/busybox:1.27 \ --container-privileged 使用带有 --container-privileged标志的gcloud compute instances update-container命令可更新虚拟机上的容器。使用--no-container-privileged标志可关闭特权模式。在容器运行时中为 STDIN 分配缓冲区您可以在容器运行时中为 STDIN分配缓冲区,以使STDIN数据流在容器中保持打开状态。如果不进行这项设置,则从容器中的STDIN执行读取操作时始终会导致EOF。为了在容器中建立交互式 shell,并让容器能够从管道接收其标准输入,需要分配伪 TTY,同时确保 STDIN保持打开状态。docker run使用 docker run命令的--interactive(-i) 标志。如需了解详情,请参阅--interactive标志的文档。控制台- 转到创建实例页面。 
- 在容器部分中,点击部署容器。 
- 在配置容器页面上,执行以下操作: - 指定容器映像名称。
- 选择为 STDIN 分配一个缓冲区。
- 如需确认容器详细信息,请点击选择。
 
- 继续虚拟机创建过程。 
 gcloud使用 --container-stdin标志可为容器运行时中的STDIN分配缓冲区。以下示例将启动一个容器并使其STDIN保持打开状态:gcloud compute instances create-with-container busybox-vm \ --container-image docker.io/busybox:1.27 \ --container-stdin 使用带有 --container-stdin标志的gcloud compute instances update-container命令可更新虚拟机上的容器。使用--no-container-stdin标志可关闭为STDIN分配的缓冲区。分配伪 TTY为了在容器中建立交互式 shell(同时为 STDIN 分配缓冲区),需要为容器分配伪 TTY。 docker run使用 docker run命令的--tty (-t)标志。如需了解详情,请参阅--tty标志。控制台- 转到创建实例页面。 
- 在容器部分中,点击部署容器。 
- 在配置容器页面上,执行以下操作: - 指定容器映像名称。
- 选择分配一个伪 TTY。
- 如需确认容器详细信息,请点击选择。
 
- 继续虚拟机创建过程。 
 gcloud使用 --container-tty标志可分配伪 TTY。以下示例将启动一个容器并分配伪 TTY:gcloud compute instances create-with-container busybox-vm \ --container-image docker.io/busybox:1.27 \ --container-stdin \ --container-tty 使用带有 --container-tty标志的gcloud compute instances update-container命令可更新虚拟机上的容器。使用--no-container-tty标志可不分配伪 TTY。替换容器启动时要执行的默认命令容器映像的 ENTRYPOINT可指定容器启动时要运行的可执行文件,并允许您运行容器,就像容器是该二进制文件一样。您可以替换容器映像的 ENTRYPOINT命令。docker run使用 docker run命令的--entrypoint标志(仅命令,不带参数)。了解ENTRYPOINT和--entrypoint标志。控制台- 转到创建实例页面。 
- 在容器部分中,点击部署容器。 
- 在配置容器页面上,执行以下操作: - 指定容器映像名称。
- 在命令字段中,输入一个不带参数的可执行命令,例如 uptime。
- 如需确认容器详细信息,请点击选择。
 
- 继续虚拟机创建过程。 
 gcloud使用 --container-command标志可替换容器映像ENTRYPOINT。以下示例将在 busybox 容器中运行uptime命令,以显示自上次启动以来的时间:gcloud compute instances create-with-container busybox-vm \ --container-image docker.io/busybox:1.27 \ --container-command "uptime" 使用带有 --container-command标志的gcloud compute instances update-container命令可更新虚拟机上容器的命令。将 --clear-container-command标志与update-container命令结合使用可清除已更新容器的默认命令。将参数传递给容器 ENTRYPOINT 命令您可以将参数传递给(附加到)容器的 ENTRYPOINT命令,或替换容器的默认CMD命令。控制台- 转到创建实例页面。 
- 在容器部分中,点击部署容器。 
- 在配置容器页面上,执行以下操作: - 指定容器映像名称。
- 在参数部分中,点击添加参数。
- 在每个框中输入一个命令参数。
- 如需确认容器详细信息,请点击选择。
 
- 继续虚拟机创建过程。 
 gcloud使用 --container-arg标志将参数传递给容器映像的ENTRYPOINT命令。为每个参数使用单独的标志。以下示例将在已设置为自动运行 busybox 的容器中运行带有 -c 'ls -l'参数的/bin/ash命令:gcloud compute instances create-with-container busybox-vm \ --container-image docker.io/busybox:1.27 \ --container-command "/bin/ash" \ --container-arg="-c" \ --container-arg="ls -l" 使用带有 --container-arg标志的gcloud compute instances update-container命令可更新在虚拟机上运行的容器的命令参数。该更新操作会将整个参数列表替换为新列表。将 --clear-container-args标志与update-container命令结合使用可从容器声明中移除所有参数。配置日志驱动程序选项如果需要配置日志驱动程序选项,则可以创建虚拟机启动脚本,以使用所需的日志记录选项更新 Docker 配置文件。这些选项适用于在虚拟机上运行且未指定日志驱动程序选项的所有容器。 例如,以下启动脚本会设置多个选项(包括用于限制容器日志大小的选项),然后重启虚拟机上的 Docker: cat <<EOF > /etc/docker/daemon.json { "live-restore": true, "storage-driver": "overlay2", "log-opts": { "max-size": "10m" } } EOF systemctl restart docker设置环境变量您可以在容器中设置环境变量。如果 KEY多次重复,则仅采用KEY的最后一个值。docker run使用 docker run命令的--env标志。了解 Docker 引擎如何允许设置环境变量。控制台- 转到创建实例页面。 
- 在容器部分中,点击部署容器。 
- 在配置容器页面上,执行以下操作: - 指定容器映像名称。
- 在环境变量部分中,点击添加变量。
- 根据需要添加或移除环境变量,每行一个。
- 如需确认容器详细信息,请点击选择。
 
- 继续虚拟机创建过程。 
 gcloud使用 --container-env标志可在容器中设置环境变量。以下示例将设置三个环境变量:HOME、MODE和OWNER:gcloud compute instances create-with-container busybox-vm \ --container-image docker.io/busybox:1.27 \ --container-env HOME=/home,MODE=test,OWNER=admin 使用 --container-env-file标志可在本地文件中设置环境变量。以下示例将在env.txt文件中设置两个环境变量:gcloud compute instances create-with-container busybox-vm \ --container-image docker.io/busybox:1.27 \ --container-env-file ./env.txt env.txt文件的内容为:# this is a comment HOME=/home MODE=test OWNER=admin使用带有 --container-env或--container-env-file标志的gcloud compute instances update-container命令可更新虚拟机上容器的环境变量。这将更新虚拟机实例的容器声明中存在的所有变量。系统会添加容器声明中不包含的变量。使用 --remove-container-env标志可在更新虚拟机上的容器时移除环境变量。以下示例将移除名为MODE和OWNER的环境变量:gcloud compute instances update-container busybox-vm \ --remove-container-env MODE,OWNER 如果指定的环境变量不存在,系统会以静默方式忽略该变量。 将主机目录装载为数据卷您可以将主机虚拟机中的目录装载到容器中。 docker run将 --volume标志和--mount标志与docker run命令的挂载type=bind搭配使用。了解 Docker 引擎如何将主机目录装载为数据卷。控制台- 转到创建实例页面。 
- 在容器部分中,点击部署容器。 
- 在配置容器页面上,执行以下操作: - 指定容器映像名称。
- 在卷装载部分中,点击添加卷。
- 从卷类型列表中,选择目录,然后执行以下操作: - 在装载路径字段中,指定容器目录结构中装载主机目录的装载路径。
- 在主机路径字段中,指定要装载的主机目录的主机路径。
- 在模式列表中,指定是以读/写模式还是只读模式装载目录。
 
- 如需确认容器详细信息,请点击选择。 
 
- 继续虚拟机创建过程。 
 gcloud使用 --container-mount-host-path标志可将主机虚拟机目录装载到容器中。以下示例会以读/写模式将主机目录/tmp装载到位于/logs的容器中:gcloud compute instances create-with-container busybox-vm \ --container-image docker.io/busybox:1.27 \ --container-mount-host-path mount-path=/logs,host-path=/tmp,mode=rw 指定 mode=ro可以只读模式装载主机目录。使用带有 --container-mount-host-path标志的gcloud compute instances update-container命令可更新容器上的主机目录装载。使用--remove-container-mounts标志可移除具有指定装载路径的卷装载。以下示例将移除具有mount-path=/logs的主机路径装载:gcloud compute instances update-container busybox-vm \ --remove-container-mounts /logs 如果所指定的装载路径不存在,系统会以静默方式忽略该路径。 将 tmpfs 文件系统装载为数据卷您可以将空的 tmpfs 文件系统装载到容器中。 空 tmpfs 文件系统类似于使用 medium:Memory的 Google Kubernetes EngineEmptyDir卷。在 Docker 中,tmpfs数据会在容器重启时删除,而在 Compute Engine 容器上装载tmpfs时,卷及其数据在容器重启后仍将保留,只有在虚拟机重启后才会删除。控制台- 转到创建实例页面。 
- 在容器部分中,点击部署容器。 
- 在配置容器页面上,执行以下操作: - 指定容器映像名称。
- 在卷装载部分中,点击添加卷。
- 从卷类型列表中,选择 TmpFS。
- 在装载路径字段中,指定容器目录结构中装载 TmpFS 卷的装载路径。
- 在模式列表中,指定是以读/写模式还是只读模式装载 TmpFS 卷。
- 如需确认容器详细信息,请点击选择。
 
- 继续虚拟机创建过程。 
 gcloud使用 --container-mount-tmpfs标志可将空的tmpfs文件系统装载到容器中。以下示例会以读/写模式将/cache文件系统装载到位于tmpfs的容器中:gcloud compute instances create-with-container busybox-vm \ --container-image docker.io/busybox:1.27 \ --container-mount-tmpfs mount-path=/cache 使用带有 --container-mount-tmpfs标志的gcloud compute instances update-container命令可更新容器上的tmpfs装载。使用--remove-container-mounts标志可在更新时移除具有指定装载路径的tmpfs装载。以下示例将移除具有mount-path=/cache的tmpfs装载:gcloud compute instances update-container busybox-vm \ --remove-container-mounts /cache 如果所指定的装载路径不存在,系统会以静默方式忽略该路径。 将永久性磁盘装载为数据卷使用 Container-Optimized OS 69 或更高版本,您可以将永久性磁盘从主机虚拟机装载到容器。 前提条件- 磁盘必须使用 ext4文件系统或不使用任何文件系统。在没有初始文件系统的情况下,容器启动代理会将磁盘的格式设置为ext4,并且仅支持读/写挂接和装载。
- 磁盘必须挂接到虚拟机。
- 无分区设备和分区均受支持。对于分区装载,磁盘不能为空;它必须包含现有的分区表。 
 控制台- 转到创建实例页面。 
- 在容器部分中,点击部署容器。 
- 在配置容器页面上,执行以下操作: - 指定容器映像名称。
- 在卷装载部分中,点击添加卷。
- 从卷类型列表中,选择磁盘。
- 在装载路径字段中,指定容器目录结构中装载永久性磁盘的路径。
- 从磁盘名称列表中,选择要装载的现有磁盘。
- 在分区字段中,指定要在磁盘具有分区表时装载的分区编号。如果磁盘没有分区,请将此字段留空。
- 在模式列表中,指定是以读/写模式还是只读模式装载目录。
- 如需确认容器详细信息,请点击选择。
 
- 继续虚拟机创建过程。 
 gcloud使用 gcloud compute instances create-with-container命令或带有--container-mount-disk标志的gcloud compute instances update-container命令可将永久性磁盘装载到容器中。以下示例会将两个磁盘( my-data-disk和my-scratch-disk)装载到位于/disks/data-disk和/disks/scratch-disk装载路径的容器中。gcloud compute instances create-with-container busybox-vm \ --disk name=my-data-disk \ --create-disk name=my-scratch-disk,auto-delete=yes,image=ubuntu-1710-artful-v20180315,image-project=ubuntu-os-cloud \ --container-image docker.io/busybox:1.27 \ --container-mount-disk mount-path="/disks/data-disk",name=my-data-disk,mode=ro \ --container-mount-disk mount-path="/disks/scratch-disk",name=my-scratch-disk 请注意, --disk标志用于挂接my-data-disk,--create-disk标志用于创建和挂接my-scatch-disk,--container-mount-disk标志用于将已挂接的磁盘装载到容器。由于没有为my-scratch-disk指定mode,因此在默认情况下,磁盘会以读/写模式装载到容器中。使用带有 --container-mount-disk标志的gcloud compute instances update-container命令可装载其他已挂接的磁盘或修改现有的磁盘装载。使用 --remove-container-mounts标志可移除具有指定装载路径的磁盘卷装载。以下示例会将my-data-disk的装载模式更改为读/写,并移除具有mount-path="/disks/scratch-disk"的磁盘装载。gcloud compute instances update-container busybox-vm \ --container-mount-disk mount-path="/disks/data-disk",name=my-data-disk,mode=rw \ --remove-container-mounts "/disks/scratch-disk" 如果您传递给 --remove-container-mounts标志的装载路径不存在,系统会以静默方式忽略该路径。发布容器端口具有容器的虚拟机使用主机网络模式,在此模式下,容器可共享主机网络栈,并且主机的所有接口都可供容器使用。 容器端口与主机虚拟机端口具有一对一映射。例如,容器端口 80 会映射到主机虚拟机端口 80。Compute Engine 不支持端口发布 ( -p) 标志,并且您无需指定该标志即可实现映射。如需发布容器的端口,请配置防火墙规则以允许访问主机虚拟机的端口。根据防火墙规则,容器的相应端口自动可访问。 示例:为 NGINX 容器发布端口 80 docker run使用 docker run命令时,配置--network="host"标志。详细了解容器网络设置和主机模式。gcloud以下示例展示了如何创建具有 NGINX 容器的虚拟机实例并允许流量传输到容器的端口 80。 - 创建具有 NGINX 容器的虚拟机实例: - gcloud compute instances create-with-container nginx-vm \ --container-image gcr.io/cloud-marketplace/google/nginx1:1.15 \ --tags http-server - 容器可共享主机虚拟机的网络堆栈,并且容器的端口 80 会发布到主机虚拟机的端口 80。 - http-server代码用作下一步中创建的防火墙规则的目标代码。
- 创建防火墙规则可启用与虚拟机实例的端口 80 的连接。以下防火墙规则允许使用 - http-server标志建立与虚拟机实例的 HTTP 连接。- gcloud compute firewall-rules create allow-http \ --allow tcp:80 --target-tags http-server - 容器会自动开始在端口 80 上接收流量。您无需执行任何其他配置。 - 您可以为主机虚拟机协议:端口组合创建防火墙规则,其中协议为 - tcp或- udp。这些规则将实际管理从虚拟机外部访问相应容器端口的权限。
 后续步骤如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。 最后更新时间 (UTC):2025-10-19。 -