准备工作
- 如果您不熟悉容器,请参阅 Compute Engine 上的容器。
- 如果您对 Docker 不熟悉,请参阅 Docker 文档。
- 阅读在 Compute Engine 上部署容器。
-
如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以选择以下任一选项向 Compute Engine 进行身份验证:
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Set a default region and zone.
转到创建实例模板页面。
在容器部分中,选中将一个容器映像部署到此虚拟机实例 (Deploy a container image to this VM instance) 复选框,然后展开高级容器选项。
- 在 Google Cloud CLI 中,使用
gcloud compute instance-templates create-with-container
命令,如以下示例所示。 转到创建实例页面。
在容器部分中,点击部署容器。
在配置容器页面上,执行以下操作:
- 指定容器映像名称。
- 在重启政策部分中,选择容器的重启政策。
- 如需确认容器详细信息,请点击选择。
继续虚拟机创建过程。
always
(默认)on-failure
never
转到创建实例页面。
在容器部分中,点击部署容器。
在配置容器页面上,执行以下操作:
- 指定容器映像名称。
- 选择以特权模式运行。
- 如需确认容器详细信息,请点击选择。
继续虚拟机创建过程。
转到创建实例页面。
在容器部分中,点击部署容器。
在配置容器页面上,执行以下操作:
- 指定容器映像名称。
- 选择为 STDIN 分配一个缓冲区。
- 如需确认容器详细信息,请点击选择。
继续虚拟机创建过程。
转到创建实例页面。
在容器部分中,点击部署容器。
在配置容器页面上,执行以下操作:
- 指定容器映像名称。
- 选择分配一个伪 TTY。
- 如需确认容器详细信息,请点击选择。
继续虚拟机创建过程。
转到创建实例页面。
在容器部分中,点击部署容器。
在配置容器页面上,执行以下操作:
- 指定容器映像名称。
- 在命令字段中,输入一个不带参数的可执行命令,例如
uptime
。 - 如需确认容器详细信息,请点击选择。
继续虚拟机创建过程。
转到创建实例页面。
在容器部分中,点击部署容器。
在配置容器页面上,执行以下操作:
- 指定容器映像名称。
- 在参数部分中,点击添加参数。
- 在每个框中输入一个命令参数。
- 如需确认容器详细信息,请点击选择。
继续虚拟机创建过程。
转到创建实例页面。
在容器部分中,点击部署容器。
在配置容器页面上,执行以下操作:
- 指定容器映像名称。
- 在环境变量部分中,点击添加变量。
- 根据需要添加或移除环境变量,每行一个。
- 如需确认容器详细信息,请点击选择。
继续虚拟机创建过程。
转到创建实例页面。
在容器部分中,点击部署容器。
在配置容器页面上,执行以下操作:
- 指定容器映像名称。
- 在卷装载部分中,点击添加卷。
从卷类型列表中,选择目录,然后执行以下操作:
- 在装载路径字段中,指定容器目录结构中装载主机目录的装载路径。
- 在主机路径字段中,指定要装载的主机目录的主机路径。
- 在模式列表中,指定是以读/写模式还是只读模式装载目录。
如需确认容器详细信息,请点击选择。
继续虚拟机创建过程。
转到创建实例页面。
在容器部分中,点击部署容器。
在配置容器页面上,执行以下操作:
- 指定容器映像名称。
- 在卷装载部分中,点击添加卷。
- 从卷类型列表中,选择 TmpFS。
- 在装载路径字段中,指定容器目录结构中装载 TmpFS 卷的装载路径。
- 在模式列表中,指定是以读/写模式还是只读模式装载 TmpFS 卷。
- 如需确认容器详细信息,请点击选择。
继续虚拟机创建过程。
- 磁盘必须使用
ext4
文件系统或不使用任何文件系统。在没有初始文件系统的情况下,容器启动代理会将磁盘的格式设置为ext4
,并且仅支持读/写挂接和装载。 - 磁盘必须挂接到虚拟机。
无分区设备和分区均受支持。对于分区装载,磁盘不能为空;它必须包含现有的分区表。
转到创建实例页面。
在容器部分中,点击部署容器。
在配置容器页面上,执行以下操作:
- 指定容器映像名称。
- 在卷装载部分中,点击添加卷。
- 从卷类型列表中,选择磁盘。
- 在装载路径字段中,指定容器目录结构中装载永久性磁盘的路径。
- 从磁盘名称列表中,选择要装载的现有磁盘。
- 在分区字段中,指定要在磁盘具有分区表时装载的分区编号。如果磁盘没有分区,请将此字段留空。
- 在模式列表中,指定是以读/写模式还是只读模式装载目录。
- 如需确认容器详细信息,请点击选择。
继续虚拟机创建过程。
创建具有 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
。这些规则将实际管理从虚拟机外部访问相应容器端口的权限。
创建要用于在虚拟机和 MIG 上部署容器的实例或实例模板时,请使用 Google Cloud Console 或 Google Cloud CLI 指定容器配置。
以下部分介绍如何配置虚拟机实例的选项,但您也可以在创建实例模板时配置以下选项。可以使用 Google Cloud 控制台或 Google Cloud CLI 在实例模板中配置虚拟机实例的选项。
控制台
gcloud
指定重启政策
您可以设置重启政策,以指定是否在退出时重启容器。默认政策是始终重启。您还可以将政策设置为失败时重启或设置为永不重启。
控制台
gcloud
使用
--container-restart-policy
标志可为容器指定重启政策:以下示例启动了一个采用
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
标志结合使用。在特权模式下运行容器
您可以在特权模式下运行容器,以允许其访问主机上的所有设备。默认情况下,容器以“非特权”模式运行,不能访问任何设备。
控制台
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
保持打开状态。控制台
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。
控制台
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
命令。控制台
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
命令。控制台
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
的最后一个值。控制台
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
如果指定的环境变量不存在,系统会以静默方式忽略该变量。
将主机目录装载为数据卷
您可以将主机虚拟机中的目录装载到容器中。
控制台
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 文件系统装载到容器中。
控制台
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 或更高版本,您可以将永久性磁盘从主机虚拟机装载到容器。
前提条件
控制台
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。
后续步骤
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2024-12-22。
-