配置选项以运行容器

创建要用于在虚拟机和代管式实例组 (MIG) 上部署容器的实例或实例模板时,请使用 Google Cloud Console 或 gcloud 命令行工具指定容器配置。

以下部分介绍如何配置虚拟机实例的选项,但您也可以在创建实例模板时配置以下选项。使用 Google Cloud Console 或 gcloud 命令行工具在实例模板中配置虚拟机实例的选项。

控制台

  1. 在 Google Cloud Console 中,转到创建实例模板页面。

    转到创建实例模板

  2. 容器下,选中将一个容器映像部署到此虚拟机实例复选框,然后展开高级容器选项

gcloud

  1. gcloud 命令行工具中,使用 gcloud compute instance-templates create-with-container 命令,如以下示例所示。

准备工作

指定重启政策

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

控制台

  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. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到虚拟机实例

  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 数据流在容器中保持打开状态。如果不进行这项设置,则从容器中的 STDIN 执行读取操作时始终会导致 EOF

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

控制台

  1. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到虚拟机实例

  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. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到虚拟机实例

  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. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到虚拟机实例

  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. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到虚拟机实例

  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. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到虚拟机实例

  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. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到虚拟机实例

  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. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到虚拟机实例

  2. 点击创建实例按钮以创建实例。

  3. 容器部分下,选择部署容器映像

  4. 点击高级容器选项

  5. Tmpfs 装载下,点击添加卷

  6. 指定装载路径,即您要在其中装载 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=/cachetmpfs 装载:

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

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

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

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

前提条件

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

控制台

  1. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到虚拟机实例

  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.15 \
     --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。这些规则将实际管理从虚拟机外部访问相应容器端口的权限。

后续步骤