数学建模社区-数学中国

标题: Docker 中时区和宿主机相隔八个小时的解决方案之一 [打印本页]

作者: 杨利霞    时间: 2020-5-30 15:21
标题: Docker 中时区和宿主机相隔八个小时的解决方案之一
Docker 中时区和宿主机相隔八个小时的解决方案之一$ p' n( L2 g6 q- ]2 L/ v
前言1 J7 {( _2 R) Y8 d- \9 p

/ d& X) g8 L. x9 K2 h1 B项目部署在 tomcat 容器中,但是定时任务在凌晨插入数据到数据库后,第二天查看数据时间不对,时间延后的8个小时,于是踏上了解决之路。4 g7 S2 }0 I4 i- E' u
& `9 C7 C0 v/ k! p  e7 N7 p7 r+ ~
关键字:Linux、Docker、Tomcat/ e# S& l& u* Y# O5 v5 E

7 h3 U/ ^$ [0 z2 h% l* b8 y8 |一、问题重现8 J  G; }8 L+ W$ d% z9 h7 I- n

4 b4 m+ t9 Q( Z1 i& F& O项目中设置的定时任务是凌晨0点整执行,但是第二天查看数据库发现插入的时间是当天的8点钟(为什么是延后后面会讲),然后查看日志发现,打印日志的时间也和现在对不上(比现在少八个小时),就已经很明了了,时区的问题,然后重要的是怎么解决,把这个打印时间变成和现在对应的时间。
$ |* j  E  }- t+ F4 z8 S" K7 p5 R, A( q8 L5 k% W
[root@iZh4ntc7dmrvkzZ zxw]# docker logs -f --tail 100 965abb1fb546 # 查看 docker 容器日志的最后100行,动态的(新增继续打印)
2 Z; _' u0 p% l+ b# 打的日志上面的信息会比当前的时间(北京时间)少8个小时. u6 F, V8 O* y& X, F6 Q0 i9 _
28-May-2020 02:41:31.492 INFO [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"], j. ~& P; a. L5 x) n, u3 g! q2 o
28-May-2020 02:41:31.496 INFO [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]
8 }1 M8 @6 y1 b9 U7 }( Y28-May-2020 02:41:31.498 INFO [Thread-9] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]. g9 _+ \) Y! h% j- D; L' M
[root@iZh4ntc7dmrvkzZ zxw]# docker exec 965abb1fb546 date # 查看指定容器的时区,965abb1fb546为容器 id
4 S4 u- ~( C- v0 j3 Z8 fThu May 28 02:50:42 UTC 2020# [, q8 |: ~% _8 G& }1 }
[root@iZh4ntc7dmrvkzZ ~]# date # 查看 linux 的时间
( H& d- v! S3 sThu May 28 14:19:38 CST 2020
# y7 I# j% X4 H- Y% ^, j6 B[root@iZh4ntc7dmrvkzZ ~]#
$ h; c8 n, W8 j2 ]! Y4 h1: N$ q$ J2 k* c
20 n9 U* V6 j: {5 _; {
3
# D6 K, r& L0 v) j& d4
0 f( Q/ m3 a# `/ f54 Q6 A+ d6 o4 W) g1 v
6
: S8 W5 U8 u& l- J! |* ?- m0 [; V& ?7
! P5 y; z4 i7 c/ e# {8: O, F( z  j8 _2 K+ }5 u1 ?
9
! j' E% b+ }0 R* T" {8 Z/ A% R3 r明显一个是 UTC,一个是 CST,不一样的时区,相差八个小时。
$ T5 H8 x( t& G) B# v  O  B
+ f, \$ p3 g1 k- e$ R0 M3 e& ^二、分析问题
1 B5 K( o: a, p5 Y: V* A# u- X# v: P' R2 |) t4 r* L
刚遇到的时候只知道是时区问题,最先想到的就是 tomcat 的时区设置不对,然后找了资料修改之后,发现并没有什么暖用,然后查资料的时候发现 docker 的时间也会出现这种情况,就把问题方向占时确认为 docker 问题(后面修改成功也证明了确实是 docker 的问题)。& u/ s; D* M2 |% F

2 x& B: _6 b7 M& x( m三、修改 docker 容器的时区
8 {" C6 P1 L6 z! y, {2 \5 S+ T* |
1、进入需要修改时区的 docker 容器
6 F' Z/ b( P7 x) f& y( z, W: r9 F" v7 @- S1 U
[root@iZh4ntc7dmrvkzZ zxw]# docker exec -it 965abb1fb546 /bin/bash
$ Y; |9 U. Z: b' s6 wroot@965abb1fb546:/usr/local/tomcat# cd /usr/share/zoneinfo/Asia # 进入亚洲时区文件夹/ q7 E& N" F$ X3 s: O
1) ]7 r& e5 W2 S9 B5 P
2、复制上海(Shanghai)时区到 localtime& m* Q  M4 d9 z/ D/ U2 S) N( z

3 l4 r/ Y5 @# e- l: b- mroot@965abb1fb546:/usr/share/zoneinfo/Asia# cp Shanghai /etc/localtime # cp 直接复制( q8 I% j/ {" f% X( a
root@965abb1fb546:/usr/share/zoneinfo/Asia# exit # 退出容器
/ N" J* m) Y3 o3 g4 [exit
3 l$ Z* ~- I! @4 @! F[root@iZh4ntc7dmrvkzZ zxw]# docker restart 965abb1fb546 # 重启容器
! i' R( L1 n+ f: L$ I2 p* V1 r" d965abb1fb546
- u' Y0 v4 h2 }! @4 o7 Y( X[root@iZh4ntc7dmrvkzZ zxw]# docker exec 965abb1fb546 date # 再次查看,已经和现在的时间对应了,时区也变成了 CST 了* f; W" T. a6 h1 R- I5 P
Thu May 28 11:12:12 CST 20205 F. s* U+ f, e3 S
1' |6 A; v3 t3 |/ i
2
; L' Z. W1 O! U' h. q. c2 g/ f; k3
2 s: e& C# Q2 m47 B6 Y/ i8 r. n& w- u
5' f. V& ^: k% \0 d( `- S
6
3 C. Z8 c( Y. ~( C" j, {四、验证(重启容器并查看日志)
, O3 |+ g6 e2 k+ Y' L* ]5 x" s& x  I4 {9 q# b
[root@iZh4ntc7dmrvkzZ zxw]# docker logs -f --tail 100 965abb1fb546% r2 o, Q% k% c
28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux% P; y* E  V1 {6 M  v: f4 b
28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            3.10.0-862.14.4.el7.x86_649 h/ R) q# u1 v0 V* @
28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64; g/ z9 B( D( f  w6 l3 E
1
7 y* ^1 t9 O2 h2
7 e' V2 C6 F" }1 u9 m' ?0 f3' p# H/ j4 q7 u" ~+ w
可以看到打印的日志已经和当前时间相同了。  E* A$ Y/ `3 d5 I$ k" n
: c% y# _8 C- K
五、说明# i) {8 Z7 V- f1 j$ e2 D& ~

! U& y" {. b6 s" _为什么时区时间是少了8个小时,但是数据库的时间却比设置的时间多了8个小时?
6 J! F1 {3 I6 {$ O" c2 w! _是因为数据库设置了操作时间为上海时间(Shanghai),所以插入的时候会自动在当前时间➕8个小时,指定的0点本来是指定的上海时间的0点,但是时区不对(执行的时候始终是0点),就是在另一个时区的零点执行的,另一个时区的零点其实就是 Shanghai 时间的八点中,所以数据库的时间是 Shanghai 时间的8点钟执行的,说白了就是时区把0点延后了8小时,但是保存到数据库是 Shanghai 时间,于是就➕了八个小时,有点小饶,但是想清楚了就完全能理解了。$ z& V0 E) s4 u) K) j

8 B) z) C2 L$ r: ?+ Y: O' X六、参考
. q; b- F, U! b" n: i- H" r
6 |- ]/ q# g, ~参考文章2 k! r5 f8 W/ B$ J/ {9 y. E

' n, D4 y2 Q5 b* ?总结4 X9 a! Z& X7 R, Z4 P! s3 V2 _1 J

' P8 x# C4 h: @. E* c; v' G5 q时区问题经常遇到,修改的地方也不尽相同,所以记录在此,下次遇到了能快速解决问题;这也只是其中一种修改 docker 容器的时区方法,还有其它的比如,启动的时候挂载宿主机的时区等,这里不再说明,网上也有很多资料,以后有遇到再记录。& U' ^/ @* W1 m7 w& ~8 x) X: X% g+ N
————————————————6 e7 t" t6 d3 \  t% U- a1 \% X8 ]
版权声明:本文为CSDN博主「忧郁的白衬衫丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
2 G: O$ U; y1 k% q+ W( g( Z原文链接:https://blog.csdn.net/weixin_42816285/article/details/106403093! D9 C+ G. j4 e# f" c: @

, C( k( [$ S6 [* }1 |* Y6 l. f, Z. I. q* b: b" K' M

作者: 手可摘星陈    时间: 2020-6-1 12:25
发表回复谢谢啦+ x1 F; h  x6 ^0 ]' I8 c  S





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5