配置运行容器时的选项

创建用于在 Compute Engine 上运行容器的实例或实例模板时,请使用 Google Cloud Console 或 gcloud 命令行工具指定容器配置。

准备工作

指定重启政策

您可以设置重启政策,以指定是否在退出时重启容器。默认政策是始终重启。您还可以将政策设置为失败时重启或设置为永不重启。

控制台

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击创建实例按钮以创建新实例。
  3. 容器部分下,指定所需的重启政策。

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 标志结合使用。

在特权模式下运行容器

您可以在特权模式下运行容器,以允许其访问主机上的所有设备。默认情况下,容器以“非特权”模式运行,不能访问任何设备。

控制台

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击创建实例按钮以创建新实例。
  3. 容器部分下,勾选部署容器映像。
  4. 点击高级容器选项
  5. 勾选以特权模式运行

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 执行读取操作时始终会导致 EOF

为了在容器中建立交互式 shell,并让容器能够从管道接收其标准输入,需要分配伪 TTY,同时确保 STDIN 保持打开状态。

控制台

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击创建实例按钮以创建新实例。
  3. 容器部分下,勾选部署容器映像。
  4. 点击高级容器选项
  5. 勾选为 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。

控制台

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击创建实例按钮以创建新实例。
  3. 容器部分下,勾选部署容器映像。
  4. 点击高级容器选项
  5. 勾选分配一个伪 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 命令。

控制台

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击创建实例按钮以创建新实例。
  3. 容器部分下,勾选部署容器映像。
  4. 点击高级容器选项
  5. 命令框中,输入一个不带参数的可执行命令,例如 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 命令。

控制台

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击创建实例按钮以创建新实例。
  3. 容器部分下,勾选部署容器映像。
  4. 点击高级容器选项
  5. 命令参数下,点击添加参数。
  6. 在每个框中输入一个命令参数。

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 命令结合使用可从容器声明中移除所有参数。

设置环境变量

您可以在容器中设置环境变量。如果 [KEY] 多次重复,则仅采用 [KEY] 的最后一个值。

控制台

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击创建实例按钮以创建新实例。
  3. 容器部分下,勾选部署容器映像。
  4. 点击高级容器选项
  5. 环境变量下,点击添加变量。
  6. 根据需要添加或移除环境变量,每行一个。

gcloud

使用 --container-env 标志可在容器中设置环境变量。以下示例将设置三个环境变量:HOMEMODEOWNER

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 标志可在更新虚拟机上的容器时移除环境变量。以下示例将移除名为 MODEOWNER 的环境变量:

gcloud compute instances update-container busybox-vm \
    --remove-container-env MODE,OWNER

如果指定的环境变量不存在,系统会以静默方式忽略该变量。

将主机目录装载为数据卷

您可以将主机虚拟机中的目录装载到容器中。

控制台

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击创建实例按钮以创建新实例。
  3. 容器部分下,勾选部署容器映像。
  4. 点击高级容器选项
  5. 主机目录装载下,点击添加卷。
  6. 指定以下各项:

    • 装载路径。要装载主机目录的容器目录结构中的路径。
    • 主机路径。要装载的主机目录的路径。
    • 是以读/写模式还是只读模式装载目录。

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 文件系统装载到容器中。

控制台

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击创建实例按钮以创建新实例。
  3. 容器部分下,勾选部署容器映像。
  4. 点击高级容器选项
  5. Tmpfs 装载下,点击添加卷。
  6. 指定装载路径,即您要在其中装载 tmpfs 卷的容器目录结构内的路径。系统以读/写模式装载 tmpfs 卷。

gcloud

使用 --container-mount-tmpfs 标志可将空的 tmpfs 文件系统装载到容器中。以下示例会以读/写模式将 tmpfs 文件系统装载到 /cache 容器中:

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=/cachetmpfs 装载:

gcloud compute instances update-container busybox-vm \
    --remove-container-mounts /cache

如果所指定的装载路径不存在,系统会以静默方式忽略该路径。

将永久性磁盘装载为数据卷

使用 Container-Optimized OS 69 或更高版本,您可以将永久性磁盘从主机虚拟机装载到容器。

前提条件

  • 磁盘必须使用 ext4 文件系统或不使用任何文件系统。在没有初始文件系统的情况下,容器启动代理会将磁盘的格式设置为 ext4,并且仅支持读/写挂接和装载。
  • 磁盘必须挂接到虚拟机。
  • 无分区设备和分区均受支持。对于分区装载,磁盘不能为空;它必须包含现有的分区表。

控制台

  1. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击创建实例按钮以创建新实例。
  3. 容器部分下,勾选部署容器映像。
  4. 点击高级容器选项
  5. 卷装载下,点击添加卷。
  6. 卷类型下,选择 Disk
  7. 指定装载路径,即您要在其中装载永久性磁盘的容器目录结构内的路径。
  8. 磁盘名称下,选择要装载的现有磁盘,或者选择挂接新磁盘。
  9. 如果磁盘具有分区表,请指定要装载的分区的编号。 如果磁盘未分区,请将此字段留空。
  10. 指定是以读/写模式还是只读模式装载目录。

gcloud

使用 gcloud compute instances create-with-container 命令或带有 --container-mount-disk 标志的 gcloud compute instances update-container 命令可将永久性磁盘装载到容器中。

以下示例会将两个磁盘(my-data-diskmy-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

以下示例展示了如何创建具有 NGINX 容器的虚拟机实例并允许流量传输到容器的端口 80。

  1. 创建具有 NGINX 容器的虚拟机实例:

    gcloud compute instances create-with-container nginx-vm \
        --container-image gcr.io/cloud-marketplace/google/nginx1:1.12 \
        --tags http-server
    

    容器可共享主机虚拟机的网络堆栈,并且容器的端口 80 会发布到主机虚拟机的端口 80。http-server 代码用作下一步中创建的防火墙规则的目标代码。

  2. 创建防火墙规则可启用与虚拟机实例的端口 80 的连接。以下防火墙规则允许使用 http-server 标志建立与虚拟机实例的 HTTP 连接。

    gcloud compute firewall-rules create allow-http \
        --allow tcp:80 --target-tags http-server
    

    容器会自动开始在端口 80 上接收流量。您无需执行任何其他配置。

    您可以为主机虚拟机协议:端口组合创建防火墙规则,其中协议为 tcpudp。这些规则将实际管理从虚拟机外部访问相应容器端口的权限。

反馈和问题

我们欢迎您提出反馈和问题!请联系“在 Compute Engine 上运行容器”团队,向他们提出问题、报告问题以及请求新功能。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档