一、问题背景
在我们平时使用docker容器运行我们的应用的时候,访问应用页面的时间与现在相差x个小时,无法结合时间点去判断当时服务的异常。
宿主机一般会根据所在区域,设置特定的时区,如Asia/Shanghai、America/Los_Angeles等等,而docker容器默认使用UTC 时间。
二、处理方法
方式一:容器使用UTC 时间,前端、后端应用代码做逻辑处理,根据浏览器获取到用户时区,用用户时区展示页面,具有通用性
Docker化部署java应用,jvm读取的是容器中的UTC时间。
前端、后端应用代码做逻辑处理
前端应用,应该根据浏览器时区,以浏览器时区展示,而不是在相关页面上显示为UTC 时间。
方式二:通过挂载的方式,将宿主机时区挂载到docker容器中,使得两者时间显示一直,不具有通用性,是临时解决方案
# cat /etc/systemd/system/mysqld.service
# timedatectl
# ls -l /etc/localtime
# docker exec -it mysql date
用 -v /etc/localtime:/etc/localtime 形式,将时区文件挂载
注意:此方式只针对 宿主机和容器的时区文件均为 /etc/localtime,不用类型的宿主机操作系统或者容器基础镜像,时区文件不一样
# cat /etc/systemd/system/mysqld.service
# timedatectl
# ls -l /etc/localtime
# docker exec -it mysql date
三、参考
How to make sure docker's time syncs with that of the host?
https://stackoverflow.com/questions/24551592/how-to-make-sure-dockers-time-syncs-with-that-of-the-host
5 ways to change time in Docker container
https://bobcares.com/blog/change-time-in-docker-container
关于Docker部署java应用时间和系统时间不匹配的问题
https://blog.csdn.net/qq_17153579/article/details/77278511
修改使用Alpine Linux的Docker容器的时区
https://wiki.alpinelinux.org/wiki/Setting_the_timezone