<p>最常用方式是直接设置TZ环境变量,如environment: - TZ=Asia/Shanghai;其次可挂载宿主机/etc/localtime和/etc/timezone文件实现秒级同步;Windows容器还需启用W32Time服务并配置NTP;所有配置均需通过date -Iseconds实测验证时间偏差≤1秒。</p>
绝大多数 Linux 基础镜像(如 Ubuntu、Debian、Alpine)支持 TZ 环境变量,运行时自动生效。只需在 docker-compose.yml 的服务定义中添加一行:
environment: - TZ=Asia/Shanghai(中国用户)environment: - TZ=America/New_York(美东用户)environment: - TZ=Europe/London(英标用户)该方式轻量、可版本控制,且不依赖宿主机时区文件是否存在。但注意:部分精简镜像(如某些 Alpine 版本)需额外安装 tzdata 包才能识别时区名。
当容器必须与宿主机“秒级同步”,尤其宿主机本身已通过 NTP 校准过时,推荐绑定两个关键文件:
/etc/localtime:指向具体时区数据的软链接(如 → /usr/share/zoneinfo/Asia/Shanghai)/etc/timezone:明文记录时区名称(如内容为 Asia/Shanghai)在 docker-compose.yml 中写为:
volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro
这种方式绕过环境变量解析,对所有程序(包括 C 库调用 localtime() 的二进制)都有效,适合日志审计、金融类等强时间一致性场景。
Linux 容器共享宿主机内核时钟,而 Windows 容器运行在 Hyper-V 或 QEMU 虚拟化层上,存在独立时钟漂移风险。仅设 TZ 不够,必须激活系统级时间服务:
w32tm /config /manualpeerlist:"ntp.aliyun.com,0x1" /syncfromflags:manual /reliable:yes /update
net stop w32time && net start w32time
w32tm /resync /force
建议将这些命令封装进容器启动脚本(如 entry.ps1),或在 docker-compose.yml 的 command 中组合调用。
配置完不要只信配置文件,务必实测:
date -Iseconds(输出如 2026-06-18T12:19:35+0800)docker exec -it <service_name> date -Iseconds
TZ 方式,再检查:cat /etc/timezone 和 ls -l /etc/localtime 是否指向正确 zoneinfo时间对齐不是“设了就完事”,而是需要验证的生产级动作。