问题概述
容器内时间与宿主机不一致是运维中常见问题,主要因容器默认使用UTC时区且未继承宿主机时间配置,导致日志、计划任务等出现偏差。以下提供三种已验证的校准方法。
方法一:挂载宿主机时间文件
运行容器时通过 volume 挂载 将宿主机的时区文件传递到容器内:
docker run -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro your-image
此方式使容器直接使用宿主机的时区与时间同步,适用于绝大多数 Linux 发行版。
方法二:通过环境变量设置时区
在 Dockerfile 或运行命令中指定 TZ 环境变量:
docker run -e TZ=Asia/Shanghai your-image
若基础镜像不含 tzdata,需在 Dockerfile 中安装:
RUN apt-get update && apt-get install -y tzdata
适用于 Alpine 等轻量镜像时,需额外安装 tzdata 包。
方法三:容器内运行 NTP 同步
对于需要高精度时间对齐的场景,可在容器内安装 ntpdate 或 chrony:
docker run --privileged your-image ntpdate ntp.aliyun.com
注意:--privileged 会赋予容器修改系统时间的权限,存在安全风险,建议仅在测试环境使用。生产环境推荐前两种方式。
验证同步效果
进入容器执行 date 命令检查当前时间,也可对比宿主机时间确认差异。若时间仍不准,请检查宿主机 NTP 服务是否正常。