最近在做项目的时候,发现项目在本机启动的时候不会出现时间误差问题,一旦部署到docker中便会差8个小时,经过在网上查询资料得知是docker时区的问题。
下边分享下我的问题解决过程:
在此之前先说下时区
UTC是世界时区,CST是东八区时间
CST是指(China Shanghai Time,东八区时间)
UTC是指(Coordinated Universal Time,标准时间)
1.在linux中使用date查看当前时间 时间正常
[root@fheb tomcat2]# date
Mon Jul 30 19:15:53 CST 2018
2.使用exec命令进入tomcat终端命令并使用date命令
[root@fheb tomcat2]# docker exec -it tomcat1 /bin/bash
root@6ce7ff709a6a:/usr/local/tomcat#
root@6ce7ff709a6a:/usr/local/tomcat# date
Mon Jul 30 11:17:41 CST 2018
3.发现docker中刚好与现在差8小时,于是把linux时间与tomcat容器时间映射上
docker run -it -d
--name tomcat1
-p 8080:8080
-v $PWD/logs:/usr/local/tomcat/logs
-v $PWD/webapps:/usr/local/tomcat/webapps
-v $PWD/conf:/usr/local/tomcat/conf
-v /etc/localtime:/etc/localtime
tomcat:7.0.62
4.此时再次使用date命令,发现tomcat时间与linux时间一致
root@6ce7ff709a6a:/usr/local/tomcat# date
Mon Jul 30 19:20:44 CST 2018
5.再次访问项目,插入一条记录,一个字段为当前时间,发现生成的时间仍然差把个小时,怎么回事,难道是我写命令的姿势不对?查询资料得知,每一个docker中的容器或服务使用的默认时区都不是一致的,大概分为:
时区功能 | 时区说明 |
---|---|
Java | JVM启动时候的时区。如果不指定,则默认取系统时区 |
MySQL | 数据库有时区,直接用:select now()可以查看确认。但是,Java的JDBC直接新增的数据是不会参考Mysql本身的时区。举个例子:INSERT什么时间就是什么时间! |
Docker宿主 | 实际上是操作系统OS的时区。如果安装系统的时候选择中国上海时区,那一般是CST(中国时区)。 |
Docker容器 | 容器本身也是一个操作系统(虚拟系统)。当容器时区和宿主时区不一致,可以修改。如果有疑问可以直接exec到容器里面查看容器时区。 |
Tomcat服务 | Tomcat是运行Java的Web应用服务器,所以,它的时区实际上就是JVM的时区。 |
6.问题解决方式
6.1 方式一 修改 catalina.sh文件,加入一行jvm参数,使其默认时区为上海时区
JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Duser.timezone=GMT+08"
6.2 方式二 启动tomcat容器时就制定默认时区为上海时区
docker run -it -d
--name tomcat1
-p 8080:8080
-v $PWD/logs:/usr/local/tomcat/logs
-v $PWD/webapps:/usr/local/tomcat/webapps
-v $PWD/conf:/usr/local/tomcat/conf
-v /etc/localtime:/etc/localtime
-e TZ="Asia/Shanghai"
tomcat:7.0.62