docker容器时间不同步导致在java应用中获取的时间不正确问题

一、前言

在把Java应用部署到docker容器时,发现应用获取到的时间和现实时间相差了8个小时,会导致一系列不必要的麻烦。

二、解决方案

1、首选需要确保宿主机的时区和时间的准确

在宿主机上用 date -R 看一下时区是否为东八区(末尾有+0800)

2、若宿主机时区或者时间不准确,可以用date/ntpdate和tzdata同步一下时间以及更改时区

date命令:
1
2
3
date                	#查看当前时间,结果如下:2017年 01月 06日 星期五 13:02:55 CST
date -s 14:03:35 #设置当前时间,结果如下:2017年 01月 06日 星期五 14:03:35 CST
date -s 2017-01-08 #设置当前日期,结果如下:2017年 01月 08日 星期五 00:00:00 CST
ntpdate命令:
1
ntpdate -u 210.72.145.44   #网络时间同步命令

注意:若不加上-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
2
yum install tzdata 	#centos
apt-get install tzdata #ubuntu

3、复制宿主机上的zoneinfo文件夹到容器下的/usr/share/目录下。

1
docker cp /usr/share/zoneinfo 容器名称:/usr/share/

2、进入到容器中

1
docker exec -it --user=root 容器名称 /bin/bash

3、创建软连接,修改时区。

1
2
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "Asia/Shanghai" > /etc/timezone

4、查看时间,进行测试。

1
date -R
  • 若容器中有服务,需要重启容器,服务获取的时间才会正确。

参考文章:

如何调整Linux系统为正确时区 | 《Linux就该这么学》 (linuxprobe.com)

linux中同步时间的命令是什么 - CSDN

修改docker的时间_在路上的阿帅的博客-CSDN博客_docker 修改时间


docker容器时间不同步导致在java应用中获取的时间不正确问题
https://aunero.github.io/2022/06/docker-time-java-app.html
作者
AuthurNero
发布于
2022年6月10日
许可协议