虚拟化时区

适用于:Windows Server 2022

Windows 容器支持维护独立于主机的虚拟化时区配置。 传统上用于主机时区的所有配置都已进行虚拟化,并针对每个容器进行了实例化。 利用此功能,Windows 容器提供以下行为:

  • 启动容器时,将继承主机的时区,并将其保留在容器中。 如果在容器运行时主机的时区发生更改,存储在容器中的时区将不会更改。 若要重新继承主机的时区,必须重启该容器。
  • 容器只保留启动容器时观察到的主机时区配置,直到用户显式配置容器中的时区为止。 在容器中设置时区后,配置将虚拟化,容器将不再引用主机。
  • 如果配置容器的时区,并随后保存容器的状态,则时区配置会在重启时保持不变。

与系统时区配置相关的所有内核模式和用户模式 API 现在都是容器可感知的。 在容器的上下文中运行的线程调用系统 API 来查询本地时间时,它将检索容器的时区配置,而不是主机的时区配置。 从容器中写入的时区数据现在保存在容器特定的存储中,并且在启动过程中,所述容器不再继承主机的当前时区数据。 这意味着在设置时区后,容器将在重启时继续使用配置的时区。 任何在映像之上构建的容器都会继承时区配置,只要它是在其中一层中显式设置的。

下表显示了每个 SKU 支持的版本:

SKU 支持的版本
Windows Server 2019 10.0.17763.1935 或更高版本
20H2 SAC 10.0.19042.985 或更高版本
Windows Server 2022 所有版本

如何配置容器的时区?

首先,你需要包含此功能的主机和来宾版本,这意味着要在 2105B 服务修补程序或更高版本上运行。 运行早期版本只是将容器的行为还原为镜像主机的时区,配置对主机或来宾没有影响。

注意

配置时区需要管理权限,确切来说是 SeTimeZonePrivilege。 ContainerAdministrator 帐户具有此权限。 因此,建议以工作负载所需的最低权限运行,并保留 ContainerAdministrator 帐户用于管理任务(例如设置时区)。

建议使用 TZUtil.exe 实用工具或 PowerShell 的 Set-TimeZone cmdlet 来配置容器时区。 这些实用工具维护良好,并为轻松设置时区提供了便利。 任何其他方法都需要直接与系统 API 交互。 包含 TZUtil.exe 或 PowerShell 的基本映像版本开箱即用。 Nanoserver 基本映像是一个例外,因为在默认情况下,此映像不支持 TZUtil.exe 或 PowerShell,所以需要使用自定义实用工具与系统 API 交互。 在任何情况下,除非绝对必要,否则新编写的应用程序都不应依赖于操作系统时区,而是应该在应用程序数据和逻辑中考虑它。

使用 Windows Server 2019 的示例

使用最新的 Windows Server 2019 服务器核心基本映像,以下是设置虚拟化时区的示例。

  1. 启动容器后,将时区设置为主机的时区(在此示例中为太平洋标准时间),如下所示:

    PS C:\> tzutil /g
    Pacific Standard Time
    
    
  2. 将主机的时区设置为中亚标准时间 (UTC+6:00),注意太平洋标准时间仍会显示在容器中:

    PS C:\> Get-TimeZone
    
    Id                         : Pacific Standard Time
    DisplayName                : (UTC-08:00) Pacific Time (US & Canada)
    StandardName               : Pacific Standard Time
    DaylightName               : Pacific Daylight Time
    BaseUtcOffset              : -08:00:00
    SupportsDaylightSavingTime : True
    

    请注意,首次启动容器时,配置将设置为在创建基本映像时配置的内容,直到你自行配置为止。 在大多数情况下,对于 Windows 基本映像,默认为太平洋标准时间。

  3. 接下来,将容器的时区设置为“萨摩亚标准时间”:

    PS C:\> tzutil /s "Samoa Standard Time"
    PS C:\> tzutil /g
    Samoa Standard Time
    PS C:\> Get-TimeZone
    
    Id                         : Samoa Standard Time
    DisplayName                : (UTC+13:00) Samoa
    StandardName               : Samoa Standard Time
    DaylightName               : Samoa Daylight Time
    BaseUtcOffset              : 13:00:00
    SupportsDaylightSavingTime : True
    

    现在,容器的时区已更新为萨摩亚标准时间,但主机仍使用中亚标准时间。 保存容器的状态时,此配置将保持不变。

  4. 如果在没有事先保存其状态的情况下重启容器,则会将时区设置为主机的时区,如下所示:

    PS C:\>tzutil /g
    Central Asia Standard Time
    PS C:\> Get-TimeZone
    
    Id                         : Central Asia Standard Time
    DisplayName                : (UTC+06:00) Astana
    StandardName               : Central Asia Standard Time
    DaylightName               : Central Asia Daylight Time
    BaseUtcOffset              : 06:00:00
    SupportsDaylightSavingTime : False