docker容器时间不同步导致在java应用中获取的时间不正确问题
一、前言
在把Java应用部署到docker容器时,发现应用获取到的时间和现实时间相差了8个小时,会导致一系列不必要的麻烦。
二、解决方案
1、首选需要确保宿主机的时区和时间的准确
在宿主机上用 date -R 看一下时区是否为东八区(末尾有+0800)
2、若宿主机时区或者时间不准确,可以用date/ntpdate和tzdata同步一下时间以及更改时区
date命令:
1 |
|
ntpdate命令:
1 |
|
注意:若不加上-u参数, 会出现以下提示:no server suitable for synchronization found
-u:从man ntpdate中可以看出-u参数可以越过防火墙与主机同步;
210.72.145.44:中国国家授时中心的官方服务器。
ntp常用服务器:
中国国家授时中心:210.72.145.44
NTP服务器(上海) :ntp.api.bz
经测试中国国家授时中心与NTP上海服务器可以正常同步时间,注意需要加上-u参数!
时区修改:
使用tzselect, 选择到China/Shanghai即可
若显示未安装tzselect,可以安装一下tzdata
1 |
|
3、复制宿主机上的zoneinfo文件夹到容器下的/usr/share/目录下。
1 |
|
2、进入到容器中
1 |
|
3、创建软连接,修改时区。
1 |
|
4、查看时间,进行测试。
1 |
|
- 若容器中有服务,需要重启容器,服务获取的时间才会正确。
参考文章:
docker容器时间不同步导致在java应用中获取的时间不正确问题
https://aunero.github.io/2022/06/docker-time-java-app.html