Compute Engine 上的容器

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

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

如果您需要完全控制容器环境和容器协调工具,请在 Compute Engine 上运行容器。或者,您可以使用 Google Kubernetes Engine 简化集群管理和容器协调任务,这样就无需管理底层虚拟机实例。

在 Compute Engine 上运行的容器技术

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

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

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

容器优化型虚拟机映像

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

  • Google 的 Container-Optimized OS
    • 包括:Docker、Kubernetes
    • 映像项目:cos-cloud
    • 映像系列:cos-stable
  • CoreOS
    • 包括:Docker、rkt、Kubernetes
    • 映像项目:coreos-cloud
    • 映像系列:coreos-stable
  • Ubuntu
    • 包括:LXD
    • 映像项目:ubuntu-os-cloud
    • 映像系列:ubuntu-1604-lts
  • Windows
    • 包括:Docker
    • 映像项目:windows-cloud
    • 映像系列:windows-1803-core-for-containers

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

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

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

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

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

在 Windows Server 2016 映像上安装 Docker

Windows Server 2016 及更高版本已包含容器支持。如果您计划在 Windows Server 实例上运行 Docker 容器,请先从 Windows Server for Containers 公共映像入手。该映像安装了以下组件:

如果要在 Windows Server 基础映像上安装 Docker 并运行容器化应用,而不是使用 Windows Server for Containers 映像,请按照下面列出的步骤操作。

首先使用 Windows Server 2016 或更高版本的公共映像创建 Windows Server 实例。为获得最佳容器支持,Google 建议您使用最新的 Windows Server 半年发行版,例如 Windows Server 版本 1803。

安装 Docker

  1. 连接 Windows 实例

  2. 以管理员身份打开 PowerShell 终端。

  3. 通过 Microsoft 代码库安装 Docker:

    PS C:\> Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
    
    PS C:\> Install-Package -Name docker -ProviderName DockerMsftProvider
    
  4. 运行以下命令以解决 Compute Engine 上的 Windows 容器的已知问题

    • 停用接收段聚合功能:

      PS C:\> netsh netkvm setparam 0 *RscIPv4 0
      
    • 启用 IPv6:

      PS C:\> reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters `
      /v DisabledComponents /t REG_DWORD /d 0x0 /f
      
  5. 重启实例:

    PS C:\> Restart-Computer -Force
    

其他设置步骤

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

PS C:\> docker run -it microsoft/nanoserver:1803 cmd.exe

但是,Docker 的默认网络 MTU 存在一个已知问题,该问题会影响到实例的连接以及从容器到互联网的连接。要解决此问题,请在实例的 PowerShell 终端中运行以下命令以查看接口名称并将 vEthernet MTU 设置为 1460

PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295                1          0       5720  Loopback Pseudo-Interface 1
  1500                1      76091     292077  vEthernet (nat)
PS C:\> netsh interface ipv4 set subinterface `
"vEthernet (nat)" mtu=1460 store=persistent

即使在修复实例的 MTU 后,从容器到互联网的连接也可能会不稳定,这是因为容器的网络接口默认使用设置为 1500 的 MTU。因此要建立完整的连接,请在容器内重复运行这些 MTU 命令(接口名称将有所不同)。请记住,每当生成并运行新的容器映像时都要以这种方式修复 MTU。

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

运行 Windows 容器

有许多资源可帮助您开始了解 Windows 容器:

Windows 容器的已知问题

各版本 Windows 的容器不兼容

在较早版本的 Windows 上构建的容器不适用于运行更新版本 Windows 的 Compute Engine 实例。默认情况下,Docker 会使用 Windows Server 2016 版本的容器。这意味着在运行 Windows Server 1709 的实例中运行以下命令将导致错误:

PS C:\> docker run -it microsoft/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 1709 实例中,使用以下命令在 1709 版 nanoserver 容器(而不是默认的 2016 容器)中运行命令提示符:

PS C:\> docker run -it microsoft/nanoserver:1709 cmd.exe

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

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

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

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

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

要从这种情况中恢复,请在实例的 PowerShell 终端或容器中运行以下命令以查看接口名称并重置 MTU:

PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295                1          0       5720  Loopback Pseudo-Interface 1
  1500                1      76091     292077  vEthernet (HNSTransparent)
PS C:\> netsh interface ipv4 set subinterface `
"vEthernet (HNSTransparent)" mtu=1460 store=persistent

如果您不能再通过 RDP 连接实例,因而无法运行这些命令,则可以通过串行控制台连接实例,启动 cmd 命令提示符并在其中运行 netsh 命令以修复 MTU。如果不想执行此操作,您可以在同样执行 MTU 修复命令的脚本中执行 docker network ...New-VMSwitch 命令。

Docker 容器无法启动

使用 docker run 启动容器可能会失败,并会出现以下错误:

C:\Program Files\Docker\docker.exe: Error response from daemon: container ...
encountered an error during CreateContainer: failure in a Windows system call:
Element not found. (0x490)

在安装了 Windows Update KB4015217 的 Windows Server 2016 实例上会发生此问题。要解决该问题,请使用以下 PowerShell 命令在实例上启用 IPv6:

PS C:\> reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters `
/v DisabledComponents /t REG_DWORD /d 0x0 /f

启用 IPv6 后,重启实例:

PS C:\> Restart-Computer -Force

如果未来的操作系统更新更正了此问题,那么您可以恢复原始 IPv6 设置:

PS C:\> reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters `
/v DisabledComponents /t REG_DWORD /d 0xff /f

Hyper-V 容器无法启动

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

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档