创建要用于在虚拟机和代管式实例组 (MIG) 上部署容器的实例或实例模板时,请使用 Google Cloud Console 或 gcloud
命令行工具指定容器配置。
以下部分介绍如何配置虚拟机实例的选项,但您也可以在创建实例模板时配置以下选项。使用 Google Cloud Console 或 gcloud
命令行工具在实例模板中配置虚拟机实例的选项。
控制台
在 Google Cloud Console 中,转到创建实例模板页面。
在容器下,选中将一个容器映像部署到此虚拟机实例复选框,然后展开高级容器选项。
gcloud
- 在
gcloud
命令行工具中,使用gcloud compute instance-templates create-with-container
命令,如以下示例所示。
准备工作
- 如果您要使用本指南中的命令行示例,请执行以下操作:
- 安装或更新到 gcloud 命令行工具的最新版本。
- 设置默认地区和区域。
- 如果您不熟悉容器,请参阅 Compute Engine 上的容器。
- 如果您对 Docker 不熟悉,请参阅 Docker 文档。
- 阅读在 Compute Engine 上部署容器。
指定重启政策
您可以设置重启政策,以指定是否在退出时重启容器。默认政策是始终重启。您还可以将政策设置为失败时重启或设置为永不重启。
控制台
转到虚拟机实例页面。
点击创建实例按钮以创建实例。
在容器部分下,指定容器的重启政策。
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
标志结合使用。
在特权模式下运行容器
您可以在特权模式下运行容器,以允许其访问主机上的所有设备。默认情况下,容器以“非特权”模式运行,不能访问任何设备。
控制台
在 Google Cloud Console 中,转到虚拟机实例页面。
点击创建实例按钮以创建实例。
在容器部分下,选择部署容器映像。
点击高级容器选项。
选择以特权模式运行。
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
保持打开状态。
控制台
在 Google Cloud Console 中,转到虚拟机实例页面。
点击创建实例按钮以创建实例。
在容器部分下,选择部署容器映像。
点击高级容器选项。
选择为 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。
控制台
在 Google Cloud Console 中,转到虚拟机实例页面。
点击创建实例按钮以创建实例。
在容器部分下,选择部署容器映像。
点击高级容器选项。
选择分配一个伪 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
命令。
控制台
在 Google Cloud Console 中,转到虚拟机实例页面。
点击创建实例按钮以创建实例。
在容器部分下,选择部署容器映像。
点击高级容器选项。
在命令框中,输入一个不带参数的可执行命令,例如
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
命令。
控制台
在 Google Cloud Console 中,转到虚拟机实例页面。
点击创建实例按钮以创建实例。
在容器部分下,选择部署容器映像。
点击高级容器选项。
在命令参数下,点击添加参数。
在每个框中输入一个命令参数。
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
的最后一个值。
控制台
在 Google Cloud Console 中,转到虚拟机实例页面。
点击创建实例按钮以创建实例。
在容器部分下,选择部署容器映像。
点击高级容器选项。
在环境变量下,点击添加变量。
根据需要添加或移除环境变量,每行一个。
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
如果指定的环境变量不存在,系统会以静默方式忽略该变量。
将主机目录装载为数据卷
您可以将主机虚拟机中的目录装载到容器中。
控制台
在 Google Cloud Console 中,转到虚拟机实例页面。
点击创建实例按钮以创建实例。
在容器部分下,选择部署容器映像。
点击高级容器选项。
在主机目录装载下,点击添加卷。
指定以下各项:
- 装载路径。要装载主机目录的容器目录结构中的路径。
- 主机路径。要装载的主机目录的路径。
- 是以读/写模式还是只读模式装载目录。
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 文件系统装载到容器中。
控制台
在 Google Cloud Console 中,转到虚拟机实例页面。
点击创建实例按钮以创建实例。
在容器部分下,选择部署容器映像。
点击高级容器选项。
在 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
,并且仅支持读/写挂接和装载。 - 磁盘必须挂接到虚拟机。
无分区设备和分区均受支持。对于分区装载,磁盘不能为空;它必须包含现有的分区表。
控制台
在 Google Cloud Console 中,转到虚拟机实例页面。
点击创建实例按钮以创建实例。
在容器部分下,选择部署容器映像。
点击高级容器选项。
在卷装载下,点击添加卷。
在卷类型下,选择
Disk
。指定装载路径,即您要在其中装载永久性磁盘的容器目录结构内的路径。
在磁盘名称下,选择要装载的现有磁盘,或者选择挂接新磁盘。
如果磁盘具有分区表,请指定要装载的分区的编号。 如果磁盘没有分区,请将此字段留空。
指定是以读/写模式还是只读模式装载目录。
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
以下示例展示了如何创建具有 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
。这些规则将实际管理从虚拟机外部访问相应容器端口的权限。