Docker容器未同步Windows主机修改后的时间,如何解决?
容器时间同步问题:修改Windows主机时间后容器仍使用UTC当前时间
我需要测试容器中的应用,部分测试需要修改日期/时间到特定值来验证应用运行状态。原本以为修改Windows 10主机时间后启动容器,容器会同步主机修改后的时间,但实际容器仍获取当前UTC时间。
操作步骤
修改Windows主机时间:
> date 07-08-2018 > 07/08/2018 15:25:09.29 > time 12:12:12 > 07/08/2018 12:12:12.00
运行标准Alpine容器查看时间:
> docker run alpine date Thu Jun 19 13:42:07 UTC 2025
预期容器时间应为07/08/2018 12:12:12左右,但实际显示当前UTC时间。尝试以下两种方法均未解决问题:
docker run -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro alpine date docker run --privileged alpine date
请问是否可以关闭时间同步机制,或修复问题让容器同步主机修改后的时间?
解决办法
问题根源在于:Windows上的Linux Docker容器并非直接跑在Windows系统上,而是运行在WSL2虚拟机或Hyper-V虚拟机中,容器读取的是虚拟机的时间,而非Windows主机的时间。修改Windows主机时间不会自动同步到虚拟机,所以容器时间没变化。下面分两种场景给出解决方案:
场景1:使用WSL2作为Docker后端
临时修改WSL时间(单次生效)
- 打开PowerShell,进入Docker对应的WSL实例:
wsl -d docker-desktop - 在WSL环境中手动设置时间(替换成你需要的时间):
sudo date -s "2018-07-08 12:12:12" - 退出WSL后,再启动容器,就能看到容器时间同步为设置的值。
- 打开PowerShell,进入Docker对应的WSL实例:
关闭WSL自动时间同步(持久生效)
- 进入WSL环境,编辑
/etc/wsl.conf文件:sudo nano /etc/wsl.conf - 添加以下配置内容:
[clock] synchronized=false - 保存退出后,在PowerShell中重启WSL:
wsl --shutdown - 重启后WSL不会再自动同步时间,后续修改WSL时间后,容器会一直沿用该时间。
- 进入WSL环境,编辑
场景2:使用Hyper-V作为Docker后端
找到Docker对应的Hyper-V虚拟机
默认虚拟机名称为DockerDesktopVM,可以通过PowerShell查看:Get-VM修改虚拟机时间
- 先关闭虚拟机:
Stop-VM DockerDesktopVM - 设置虚拟机的启动时间为你需要的时间:
Set-VMClock DockerDesktopVM -StartTime "2018-07-08T12:12:12" - 启动虚拟机:
Start-VM DockerDesktopVM - 之后启动容器,容器时间就会同步为设置的时间。
- 先关闭虚拟机:
补充说明
- 你之前尝试挂载
/etc/localtime和/etc/timezone,只是设置容器的时区,不会修改时间本身; --privileged参数只是给容器更高权限,但容器时间依然依赖宿主机(虚拟机)的时间,所以也无法解决问题。
内容的提问来源于stack exchange,提问作者push 22
相关产品推荐
相关产品推荐

