关于Docker部署java应用时间和系统时间不匹配的问题
关于Docker部署java应用时间和系统时间不匹配的问题!服务器和Docker容器中的系统时间正常,但java应用中获取的时间相差了8小时,导致数据库存储的时间也差了8小时。
关于Docker部署java应用时间和系统时间不匹配的问题
问题与解决方法
使用Docker镜像进行服务器部署,在这之前没有接触过Docker只是听说过,当自己真的要去部署使用时很忐忑,因为怕出问题嘛(^~^)!好啦,接下来下说下具体问题。
具体问题是酱紫的,在项目运行期间遇到数据库存储的时间与实际时间不符合,相差了八小时。出现这个问题,我第一反应就是镜像中的时间不对,所以就讲服务器时间映射进了容器了,当我映射完成后,进入容器看了下容器的时间确实就好。本以为酱紫配置后就能够完工了,万万没想到还是有这个问题。
# 映射服务器时间到容器
volumes:
- /etc/localtime:/etc/localtime
所有就接着去想问题,将问题定位到了jvm虚拟机上,怀疑是否是jvm获取的时间是服务器时间,或者jvm自己做了什么骚操作导致了java应用程序中获取的时间不对。在网上查了很多资料有很多方法:
1:在程序中使用java的函数设定时区。
2:在启动java程序时加参数-Duser.timezone=GMT+8(注:此处参考
通过Java得到的时间与操作系统时间不一致,如何修改Java虚拟机时间?)但这个方法别没有解决我的问题,就接着去找寻我要的答案。终于找到一个可靠的解决方案,解决了我的问题。不过遗憾的事那篇文件的连接找不见了。
接下来说下解决思路和方法: 1:先写了一段打印时间的程序,并进入容器去测试容器中java应用获取的时间。
import java.util.Date;
public class TestDate {
public static void main(String[] args) throws Exception {
System.out.println(new Date());
}
}
root@f2613436eb8c:/# date
Wed Aug 16 20:44:02 CST 2017
root@f2613436eb8c:/# java TestDate
Wed Aug 16 12:44:08 UTC 2017
root@f2613436eb8c:/# cat /etc/timezone
Etc/UTC
2: 发现时区不对就将服务器的时区到容器的时区。(Docker 配置如下)
volumes:
- /etc/localtime:/etc/localtime
- /etc/timezone:/etc/timezone:ro
3:修改后再次进入容器去查看时间是否合适。
root@8b45916bd1a3:/# date
Wed Aug 16 20:51:22 CST 2017
root@8b45916bd1a3:/# java TestDate
Wed Aug 16 20:51:33 CST 2017
确实修改完以后就真的合适了,为此感到很开心。到此该问题就算解决了,然后屁颠屁颠的就去吧Docker的各种映射都去加上。
感慨
可能这个问题对于有经验的人来说并不是什么特别大的问题,但对于我而言遇到这个问题,并且花费了不少时间去解决他。对自己是一个很大的进步,所以突然之间就想把这个问题记录下来。发表的原因第一个是因为想把问题记录下来,万一下次还遇到此类问题,能够有效快速得到解决;第二个原因也是希望将自己的成长之路一步步记录下来。这是我发表的第一个博客,以后如果遇到自己感觉好的或者是有帮助的问题或者学习心得,也会试着去记录他。可能在多年以后再次回顾此博客等会觉得这时候的自己很菜吧!哈哈哈!!!
更多推荐
所有评论(0)