虚拟化时区
适用于: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 服务器核心基本映像,以下是设置虚拟化时区的示例。
启动容器后,将时区设置为主机的时区(在此示例中为太平洋标准时间),如下所示:
PS C:\> tzutil /g Pacific Standard Time
将主机的时区设置为中亚标准时间 (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 基本映像,默认为太平洋标准时间。
接下来,将容器的时区设置为“萨摩亚标准时间”:
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
现在,容器的时区已更新为萨摩亚标准时间,但主机仍使用中亚标准时间。 保存容器的状态时,此配置将保持不变。
如果在没有事先保存其状态的情况下重启容器,则会将时区设置为主机的时区,如下所示:
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