解决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中的容器或服务使用的默认时区都不是一致的,大概分为:

时区功能时区说明
JavaJVM启动时候的时区。如果不指定,则默认取系统时区
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

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值