关于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的各种映射都去加上。

感慨

可能这个问题对于有经验的人来说并不是什么特别大的问题,但对于我而言遇到这个问题,并且花费了不少时间去解决他。对自己是一个很大的进步,所以突然之间就想把这个问题记录下来。发表的原因第一个是因为想把问题记录下来,万一下次还遇到此类问题,能够有效快速得到解决;第二个原因也是希望将自己的成长之路一步步记录下来。这是我发表的第一个博客,以后如果遇到自己感觉好的或者是有帮助的问题或者学习心得,也会试着去记录他。可能在多年以后再次回顾此博客等会觉得这时候的自己很菜吧!哈哈哈!!!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐