Compute Engine 上的容器


软件容器是一种在多个独立的用户空间实例中运行应用的便捷方式。您可以在 Linux、Windows Server 公共虚拟机映像Container-Optimized OS 映像上运行容器。借助容器,您的应用在主机虚拟机 (VM) 上只需较少的依赖项即可运行,并且可独立于您部署到同一虚拟机实例的其他容器化应用运行。这些特性使容器化应用更易于移植、部署和大规模维护。

本文档介绍了一些可用于在 Compute Engine 实例上运行容器的更常见的容器技术,您可以在 Compute Engine 提供的大多数公共虚拟机映像上使用这些技术。

如果您需要完全控制容器环境和容器协调工具,请在 Compute Engine 上运行容器。

或者,您可以使用 Google Kubernetes Engine (GKE) 简化集群管理和容器编排任务,这样就无需管理底层虚拟机实例。GKE 提供了一个代管式环境,可供您使用 Google 基础架构来部署、管理和扩缩容器化应用。

GKE 环境包括多个机器(具体来讲,就是 Compute Engine 实例),这些机器组合在一起构成集群。运行 GKE 集群时,您可以获享 Google Cloud 提供的高级集群管理功能,例如负载均衡、节点池、节点自动修复、自动扩缩和升级以及日志记录和监控云。

了解如何创建具有节点池的 GKE 集群(它们运行 Microsoft Windows Server)。

自行试用

如果您是 Google Cloud 新手,请创建一个账号来评估 Compute Engine 在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。

免费试用 Compute Engine

在 Compute Engine 上运行的容器技术

一般来说,Compute Engine 实例几乎可以运行任何容器技术或工具。您可以在现代 Linux 操作系统上运行几种不同的容器。您也可以在 Windows Server 2016 或更高版本上运行 Docker。下面列出了几种可用于运行和管理容器化应用的常用工具:

  • DockerPodman 是两种主流的容器技术,可让您轻松运行容器化应用。
  • Kubernetes 是一个容器编排平台,您可以使用该平台在多个实例或混合云环境中管理和扩缩正在运行的容器。
  • Compute Engine 上的容器提供了一种将容器部署到 Compute Engine 虚拟机实例或代管实例组的简单方法。
  • 您可以将现有系统转换为 LXD 映像,然后在 Compute Engine 虚拟机实例中运行这些映像,从而直接原样迁移。LXD 在 Ubuntu 映像上运行。

另外,您可以使用 Artifact Registry 来管理容器映像版本。在将容器映像部署到 Compute Engine 上的 Kubernetes 或 Google Kubernetes Engine 集群之前,Artifact Registry 可用作存储和管理这些映像的中心位置。

容器优化型虚拟机映像

Compute Engine 提供了若干公共虚拟机映像,您可以使用这些映像来创建实例和运行容器工作负载。其中一些公共虚拟机映像具有简化的容器优化操作系统,而这些操作系统中又预装了较新版本的 Docker、Podman 或 Kubernetes。下面列出了专为运行容器而打造的公共映像系列:

  • Google 的 Container-Optimized OS
    • 包括:Docker、Kubernetes
    • 映像项目:cos-cloud
    • 映像系列:cos-stable
  • Fedora CoreOS
    • 包括:Podman、Docker
    • 映像项目:fedora-coreos-cloud
    • 映像系列:fedora-coreos-stable
  • Ubuntu
    • 包括:LXD
    • 映像项目:ubuntu-os-cloud
    • 映像系列:ubuntu-2004-lts

如果您需要在默认不包含特定容器工具和技术的映像上运行这些工具和技术,请手动安装这些技术。

在您的实例上安装容器技术

要在实例上启动单个容器,可以在创建实例时指定容器映像。 Compute Engine 自动提供安装了 Docker 的最新 Container-Optimized OS 映像,并在虚拟机启动时启动容器。如需了解详情,请参阅在虚拟机上部署容器

或者,您可以使用所需的任何容器技术和协调工具在 Compute Engine 上运行容器工作负载。您可以使用公共虚拟机映像创建实例,然后安装所需的容器技术。例如:

在某些情况下,您可能需要安装这些技术的特定版本才能确保这些技术可以正常共同运行。例如,Kubernetes 通常与特定版本的 Docker 搭配使用时运行性能最佳。因此,我们建议您安装这些技术的最新版本以获得最佳性能。

在 Windows Server 映像上安装 Docker

Windows Server 2016 及更高版本已包含容器支持。如果您计划在 Windows Server 实例上运行 Docker 容器,则可以在 Windows Server 基础映像上安装 Docker,或使用 来自 Mirantis 的市场映像。

如果要在 Windows Server 基础映像上安装 Docker CE,请按照下面列出的步骤操作。

首先使用 Windows Server 2019 或更高版本的公共映像创建 Windows Server 实例。为获得最佳容器支持,我们建议您使用最新版本的 Windows Server 的 LTSC。如需详细了解 LTSC,请参阅 Windows Server 服务渠道

安装 Docker

在 Windows 上安装 Docker。如需了解详情,请参阅为容器准备 Windows。安装完成后,重启实例。

其他设置步骤

此时,您可以使用 Docker 在实例中运行容器。例如,运行以下命令可下载 Windows nanoserver 容器映像并在 nanoserver 容器内运行命令提示符:

PS C:\> docker run -it mcr.microsoft.com/windows/nanoserver:1809 cmd.exe

Docker 的默认网络 MTU 为 1500 字节。如果您将 VPC 网络 MTU 也配置为 1500 字节,则可以忽略本部分的其余内容。不过,如果您在网络中使用默认的 VPC MTU(1460 字节),则必须在每个实例上进行一些额外的配置。

在每个实例的 PowerShell 终端中运行以下命令,将所有网络接口(以太网和 vEthernet)的 MTU 设置为 1460

PS C:\> Get-NetAdapter | Where-Object Name -like "*Ethernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}
PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295            1          0          0  Loopback Pseudo-Interface 1
  1460                1     306804     668688  Ethernet
  1460                1          0       1282  vEthernet (nat)

即使在更改实例的 MTU 后,从容器到互联网的连接也可能会不稳定,这是因为容器的网络接口默认也使用设置为 1500 的 MTU。如需了解用于为每个容器正确设置 MTU 的命令,请参阅容器 MTU 部分。

在配置 Docker 网络时,您可能需要定期重新执行这些 MTU 命令。如需了解详情,请参阅已知问题部分。

运行 Windows 容器

有许多可用于 Windows 容器入门的资源:

  • Microsoft 提供了大量 Windows 容器文档
  • Docker Hub 可用作存储区来存储和拉取 Windows 容器。

Windows 容器的已知问题

弃用 Windows Server 2019 for Containers 映像

Google 提供预装了 Mirantis Container Runtime(以前称为 Docker EE)的 Windows Server 映像系列:

  • Windows
    • 包括:Docker
    • 映像项目:windows-cloud
    • 映像系列:windows-2019-core-for-containers

2023 年初,Microsoft 停止分发和支持 Mirantis Container Runtime for Windows Server。虽然 Google 能够在 2023 年 10 月 30 日之前继续发布此映像系列,但该映像系列现已弃用,并且该系列中的所有映像都已被标记为“已作废”。

在 2023 年 10 月 30 日之前基于这些映像创建的虚拟机将继续运行而不会中断。但是,该日期之后,基于这些映像创建新实例的操作将失败。

在 2023 年 10 月 30 日之前从这些映像派生的自定义映像将可继续正常运行。但是,自定义映像将不会自动接收任何 Patch Tuesday Windows 更新,也不会接收 Mirantis Container Runtime 的更新版本。

如果您想继续使用预装 Mirantis Container Runtime 的映像,Mirantis Inc. 在 Google Cloud Marketplace 上提供映像。这些虚拟机映像的费用包括直接从 Mirantis 获取对 Mirantis Container Runtime 的支持和许可。如果您想使用独立的 Mirantis Container Runtime,也可以直接通过 Mirantis 网站下载。

如果您想迁移到 Docker CE 等替代容器运行时,请按照上述说明操作。

各版本 Windows 的容器不兼容

在较早版本的 Windows 上构建的容器在运行较新版本的 Windows 的 Compute Engine 实例中无法正常使用。默认情况下,Docker 会使用 Windows Server 2019 版本的容器。这意味着在运行 Windows Server 1709 版或更高版本的实例中运行以下命令会导致错误:

PS C:\> docker run -it mcr.microsoft.com/windows/nanoserver cmd.exe
docker: Error response from daemon: container
9a1eb8bbcba4e91792be65f3c40b5a1aee062f02fbc60a78444b47d043438069 encountered an
error during CreateContainer: failure in a Windows system call: The operating
system of the container does not match the operating system of the host.
(0xc0370101)

Microsoft 的 Windows 容器版本兼容性页面包含更多信息。如需解决 Windows 容器版本不兼容问题,请在拉取和运行容器时指定与您的 Windows 版本相对应的标记。例如,在 Windows Server 20H2 版实例中,使用以下命令在 20H2 版 nanoserver 容器(而不是默认的 2019 LTSC (1809) 容器)中运行命令提示符:

PS C:\> docker run -it mcr.microsoft.com/windows/nanoserver:1809 cmd.exe

MTU 不兼容会影响实例和容器连接

当您使用 docker network createNew-VMSwitch 命令在 Windows 实例上创建容器网络时,系统通常会将该实例网络接口的 MTU 强制设置为 1500。此外,新 Docker 容器内的默认网络接口通常也使用设置为 1500 的 MTU。如果 VPC 网络的 MTU 为 1460,您可能会遇到以下问题:

  • RDP 会话会停止,并且您可能无法重新连接。已知该问题会在创建透明容器网络时发生。

  • 容器内的 DNS 解析可能会失败。

  • 虽然 DNS 解析成功,但可能无法建立从容器到互联网的 HTTP 连接。

这些限制的解决方法需要两个步骤:设置实例的网络接口的 MTU1460设置容器网络接口的 MTU1460。或者,您可以设置 VPC 的 MTU1500,但这需要停止或迁移所有虚拟机。

1. 为 Windows 实例的网络接口设置 MTU

在 Windows 实例的 PowerShell 终端中运行以下命令,为所有网络接口(以太网和 vEthernet)设置 MTU:

PS C:\> Get-NetAdapter | Where-Object Name -like "*Ethernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}

使用以下命令检查实例的以太网和 vEthernet 接口 MTU 是否设置为 1460

PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295            1          0          0  Loopback Pseudo-Interface 1
  1460                1  628295912    2613170  Ethernet
  1460                1      37793     223909  vEthernet (nat)

如果由于无法再通过 RDP 连接到实例,您无法运行这些命令,那么您可以通过串行控制台连接到实例,启动 cmd 提示符,并在其中运行 netsh 命令以修复 MTU。如想避免这种情况,我们建议您在执行 MTU 修复命令的脚本中亦执行任何 docker network ...New-VMSwitch 命令。

2. 设置 Windows 容器网络接口的 MTU

容器正在运行时,您必须设置 Windows 容器的 MTU,要么从容器内部,要么从托管容器的实例。如果容器中有 PowerShell,则您可以交互方式运行此命令,也可以从容器中的脚本运行此命令以正确设置 MTU:

PS C:\> Get-NetAdapter | Where-Object Name -like "vEthernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}

或者,您可以在 Windows 实例上运行此命令,以为所有正在运行的容器设置 MTU:

PS C:\> Get-NetIPInterface -IncludeAllCompartments |
  Where-Object InterfaceAlias -like "vEthernet*" |
  Set-NetIPInterface -IncludeAllCompartments -NlMtuBytes 1460

Hyper-V 容器无法启动

目前,Compute Engine 不支持 Hyper-V 容器

后续步骤