解决Docker容器中的时间与宿主机的时间不一致问题

场景复现

分别在宿主机和容器中使用date命令查询当前时间:

宿主机

1
2
# date
Thu Apr 11 16:40:36 CST 2024

容器

1.进入容器

1
docker exec -it <container-id> /bin/bash

2.查看当前时间

1
2
# date
Thu Apr 11 08:43:36 UTC 2024

可以看到宿主机是CST时间,而容器是UTC时间。

CSTChina Standard Time 的缩写,即 中国标准时间,是东八区的标准时间。UTC 是 Coordinated Universal Time 的缩写,即 协调世界时,是国际标准时间。

CST与UTC时间差:

CST 比 UTC 时间快 8 小时。也就是说,当 CST 时间是 12:00 PM 时,UTC 时间是 4:00 AM。

CST与UTC时间转换:

您可以使用以下公式进行 CST 和 UTC 时间之间的转换:

  • CST to UTC:
1
>UTC = CST - 8
  • UTC to CST:
1
>CST = UTC + 8

示例:

  • 现在是 CST 时间 2023-11-16 12:00 PM,那么 UTC 时间是 2023-11-16 4:00 AM。
  • 现在是 UTC 时间 2023-11-16 4:00 AM,那么 CST 时间是 2023-11-16 12:00 PM。

CST 和 UTC 时间的应用:

  • CST 和 UTC 时间常用于国际交流中,以避免因时区不同造成的误解。
  • 在计算机系统中,通常使用 UTC 时间来表示时间,以便于在不同时区之间进行时间转换。

解决方案

将宿主机时间挂载到容器中。

在启动容器时,使用 -v /etc/localtime:/etc/localtime:ro 参数挂载宿主机的时间配置到容器中,从而与宿主机同步时间。如

1
docker run -d -v /etc/localtime:/etc/localtime:ro your_image
  • /etc/localtime 文件是系统中用来保存当前时区信息的文件,通过将它挂载到容器内,可以确保容器内部的时间与宿主机保持同步。
  • ro 参数表示将挂载点设置为只读模式,这意味着容器内的 /etc/localtime 文件只能读取,不能写入。这样做可以确保容器无法修改宿主机的时间配置,防止意外修改造成的影响。