配置选项以运行容器


准备工作

  • 如果您不熟悉容器,请参阅 Compute Engine 上的容器
  • 如果您对 Docker 不熟悉,请参阅 Docker 文档
  • 阅读在 Compute Engine 上部署容器
  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

创建要用于在虚拟机和 MIG 上部署容器的实例或实例模板时,请使用 Google Cloud 控制台或 Google Cloud CLI 指定容器配置。

以下部分介绍如何配置虚拟机实例的选项,但您也可以在创建实例模板时配置以下选项。可以使用 Google Cloud 控制台或 Google Cloud CLI 在实例模板中配置虚拟机实例的选项。

控制台

  1. 转到创建实例模板页面。

    转到创建实例模板

  2. 容器部分中,选中将一个容器映像部署到此虚拟机实例 (Deploy a container image to this VM instance) 复选框,然后展开高级容器选项

gcloud

  1. 在 Google Cloud CLI 中,使用 gcloud compute instance-templates create-with-container 命令,如以下示例所示。

指定重启政策

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

控制台

  1. 转到创建实例页面。

    转到“创建实例”

  2. 容器部分中,点击部署容器

  3. 配置容器页面上,执行以下操作:

    1. 指定容器映像名称。
    2. 重启政策部分中,选择容器的重启政策。
    3. 如需确认容器详细信息,请点击选择
  4. 继续虚拟机创建过程。

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. 配置容器页面上,执行以下操作:

    1. 指定容器映像名称。
    2. 选择以特权模式运行
    3. 如需确认容器详细信息,请点击选择
  4. 继续虚拟机创建过程。

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. 转到创建实例页面。

    转到“创建实例”

  2. 容器部分中,点击部署容器

  3. 配置容器页面上,执行以下操作:

    1. 指定容器映像名称。
    2. 选择为 STDIN 分配一个缓冲区
    3. 如需确认容器详细信息,请点击选择
  4. 继续虚拟机创建过程。

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. 配置容器页面上,执行以下操作:

    1. 指定容器映像名称。
    2. 选择分配一个伪 TTY
    3. 如需确认容器详细信息,请点击选择
  4. 继续虚拟机创建过程。

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. 配置容器页面上,执行以下操作:

    1. 指定容器映像名称。
    2. 命令字段中,输入一个不带参数的可执行命令,例如 uptime
    3. 如需确认容器详细信息,请点击选择
  4. 继续虚拟机创建过程。

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. 配置容器页面上,执行以下操作:

    1. 指定容器映像名称。
    2. 参数部分中,点击添加参数
    3. 在每个框中输入一个命令参数。
    4. 如需确认容器详细信息,请点击选择
  4. 继续虚拟机创建过程。

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 的最后一个值。

控制台

  1. 转到创建实例页面。

    转到“创建实例”

  2. 容器部分中,点击部署容器

  3. 配置容器页面上,执行以下操作:

    1. 指定容器映像名称。
    2. 环境变量部分中,点击添加变量
    3. 根据需要添加或移除环境变量,每行一个。
    4. 如需确认容器详细信息,请点击选择
  4. 继续虚拟机创建过程。

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. 配置容器页面上,执行以下操作:

    1. 指定容器映像名称。
    2. 卷装载部分中,点击添加卷
    3. 卷类型列表中,选择目录,然后执行以下操作:

      • 装载路径字段中,指定容器目录结构中装载主机目录的装载路径。
      • 主机路径字段中,指定要装载的主机目录的主机路径。
      • 模式列表中,指定是以读/写模式还是只读模式装载目录。
    4. 如需确认容器详细信息,请点击选择

  4. 继续虚拟机创建过程。

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. 配置容器页面上,执行以下操作:

    1. 指定容器映像名称。
    2. 卷装载部分中,点击添加卷
    3. 卷类型列表中,选择 TmpFS
    4. 装载路径字段中,指定容器目录结构中装载 TmpFS 卷的装载路径。
    5. 模式列表中,指定是以读/写模式还是只读模式装载 TmpFS 卷。
    6. 如需确认容器详细信息,请点击选择
  4. 继续虚拟机创建过程。

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. 转到创建实例页面。

    转到“创建实例”

  2. 容器部分中,点击部署容器

  3. 配置容器页面上,执行以下操作:

    1. 指定容器映像名称。
    2. 卷装载部分中,点击添加卷
    3. 卷类型列表中,选择磁盘
    4. 装载路径字段中,指定容器目录结构中装载永久性磁盘的路径。
    5. 磁盘名称列表中,选择要装载的现有磁盘。
    6. 分区字段中,指定要在磁盘具有分区表时装载的分区编号。如果磁盘没有分区,请将此字段留空。
    7. 模式列表中,指定是以读/写模式还是只读模式装载目录。
    8. 如需确认容器详细信息,请点击选择
  4. 继续虚拟机创建过程。

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

后续步骤