配置选项以运行容器

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

准备工作

指定重启政策

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

Console

  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 标志和重启政策一起使用。

在特权模式下运行容器

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

Console

  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

gcloud compute instances update-container 命令与 --container-privileged 标志一起使用,以更新虚拟机上的容器。使用 --no-container-privileged 标志关闭特权模式。

在容器运行时中为 STDIN 分配缓冲区

您可以在容器运行时中为 STDIN 分配缓冲区,以使 STDIN 数据流在容器中保持打开。如果不执行此设置,则从容器中的 STDIN 读取时将始终导致 EOF

保持 STDIN 数据流打开,这对于在容器中建立交互式 shell(连同分配伪 TTY)以及让容器能够从管道接收其标准输入而言是必要的。

Console

  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

gcloud compute instances update-container 命令与 --container-stdin 标志一起使用以更新虚拟机上的容器。使用 --no-container-stdin 标志关闭为 STDIN 分配的缓冲区。

分配伪 TTY

为容器分配伪 TTY,对于在容器中建立交互式 shell(连同为 STDIN 分配缓冲区)而言是必要的。

Console

  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

gcloud compute instances update-container 命令与 --container-tty 标志一起使用以更新虚拟机上的容器。使用 --no-container-tty 标志来禁止分配伪 TTY。

替换容器启动时要执行的默认命令

容器映像的 ENTRYPOINT 指定容器启动时要运行的可执行文件,并允许您运行容器,就像容器是该二进制文件一样。

您可以替换容器映像的 ENTRYPOINT 命令。

Console

  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"

gcloud compute instances update-container 命令与 --container-command 标志一起使用以更新虚拟机上容器的命令。

--clear-container-command 标志与 update-container 命令一起使用以清除所更新容器的默认命令。

将参数传递给容器 ENTRYPOINT 命令

您可以将参数传递给(附加到)容器 ENTRYPOINT 命令或替换默认的容器 CMD 命令。

Console

  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"

gcloud compute instances update-container 命令与 --container-arg 标志一起使用以更新虚拟机上运行的容器的命令参数。更新会将整个参数列表替换为新列表。

--clear-container-args 标志与 update-container 命令一起使用以移除容器声明中的所有参数。

设置环境变量

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

Console

  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

gcloud compute instances update-container 命令与 --container-env--container-env-file 标志一起使用以更新虚拟机上容器的环境变量。这将更新虚拟机实例容器声明中存在的任何变量。系统会添加容器声明中不包含的变量。

使用 --remove-container-env 标志在更新虚拟机上的容器时移除环境变量。以下示例将移除名为 MODEOWNER 的环境变量:

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

如果指定的环境变量不存在,则会将该变量静默忽略。

将主机目录装载为数据卷

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

Console

  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,以只读模式装载主机目录。

gcloud compute instances update-container 命令与 --container-mount-host-path 标志一起使用以更新容器上的主机目录装载。使用 --remove-container-mounts 标志在更新时移除具有所指定装载路径的卷装载。以下示例将移除具有 mount-path=/logs 的主机路径装载:

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

如果所指定的装载路径不存在,则会将该路径静默忽略。

将 tmpfs 文件系统装载为数据卷

您可以将空的 tmpfs 文件系统装载到容器中。

Console

  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

gcloud compute instances update-container 命令与 --container-mount-tmpfs 标志一起使用以更新容器上的 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,并且仅支持读/写连接和装载。
  • 磁盘必须连接到虚拟机。
  • 无分区设备和分区均受支持。对于分区装载,磁盘不能为空;它必须包含现有的分区表。

Console

  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,您不必指定端口发布 (-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 文档