解决Docker容器部署Tomcat启动Web项目碰到的时区问题

最近在做项目的时候,发现项目在本机启动的时候不会出现时间误差问题,一旦部署到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

 

你可能感兴趣的:(Docker)