数学建模社区-数学中国

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

作者: 杨利霞    时间: 2020-5-30 15:21
标题: Docker 中时区和宿主机相隔八个小时的解决方案之一
Docker 中时区和宿主机相隔八个小时的解决方案之一
, _3 |; y3 ?: K. `前言4 [7 g3 a! v/ w4 B

+ g3 K% r' g8 t* |; p项目部署在 tomcat 容器中,但是定时任务在凌晨插入数据到数据库后,第二天查看数据时间不对,时间延后的8个小时,于是踏上了解决之路。; @8 a1 @: s; ?% v

; y  C. T3 Y; `" j% S关键字:Linux、Docker、Tomcat1 E7 G5 d  N# |( \9 ?. `
! H7 L- R# o0 I' M7 ~
一、问题重现  }/ j9 g; [* |, s

+ j$ H( m# r. ]6 A5 b项目中设置的定时任务是凌晨0点整执行,但是第二天查看数据库发现插入的时间是当天的8点钟(为什么是延后后面会讲),然后查看日志发现,打印日志的时间也和现在对不上(比现在少八个小时),就已经很明了了,时区的问题,然后重要的是怎么解决,把这个打印时间变成和现在对应的时间。
9 I4 {# S- [- O' h. g! O+ H; G% O% I: n) r" w9 i
[root@iZh4ntc7dmrvkzZ zxw]# docker logs -f --tail 100 965abb1fb546 # 查看 docker 容器日志的最后100行,动态的(新增继续打印)
1 p- L! t- f- e! T2 V6 o2 Z: c# 打的日志上面的信息会比当前的时间(北京时间)少8个小时* f# u% q3 h0 v5 C
28-May-2020 02:41:31.492 INFO [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]  q2 P' N5 o8 H/ l1 U
28-May-2020 02:41:31.496 INFO [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]
1 [/ G: c( e/ N; J  o5 [28-May-2020 02:41:31.498 INFO [Thread-9] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
/ g* \3 G6 ^& x9 e- w# y8 k[root@iZh4ntc7dmrvkzZ zxw]# docker exec 965abb1fb546 date # 查看指定容器的时区,965abb1fb546为容器 id& }: h% S# A& N! e  z& V
Thu May 28 02:50:42 UTC 2020: @/ T) S% g5 f
[root@iZh4ntc7dmrvkzZ ~]# date # 查看 linux 的时间% o; B7 e2 Q, v/ R
Thu May 28 14:19:38 CST 2020; j) f9 o, P0 H# L* I$ b0 p
[root@iZh4ntc7dmrvkzZ ~]#   R# r) s8 H7 j/ A- y
1  V  u8 d) q8 C. _) Y
29 d& j) t2 p% ?
37 e. ~4 C9 H% R
4) x8 q3 x* W" j# x5 ~
5
1 x. Z3 u0 Q) F( C8 o7 D64 G# d! X: L! x) x' S
74 X/ x$ L  y+ l; X& f( ]: L
82 u0 b) g$ c$ U" W8 ?1 x
9
: {, g+ ^/ s& F- ?' p明显一个是 UTC,一个是 CST,不一样的时区,相差八个小时。
1 U' H1 A: J( c* M+ P# a( S8 f9 Q$ N4 I# E8 w# |8 F  P
二、分析问题
! f! R/ r7 p7 V% ~+ `" r) i2 D) K$ b4 V- k* V
刚遇到的时候只知道是时区问题,最先想到的就是 tomcat 的时区设置不对,然后找了资料修改之后,发现并没有什么暖用,然后查资料的时候发现 docker 的时间也会出现这种情况,就把问题方向占时确认为 docker 问题(后面修改成功也证明了确实是 docker 的问题)。$ g) U1 ]/ Z8 |8 a" T9 R( D

: c1 h; L6 S' V# u0 j* g: R三、修改 docker 容器的时区
3 B4 S% A+ s6 o( b& A" j4 L5 W- W7 y" ~/ I7 S- n
1、进入需要修改时区的 docker 容器& |" D, r4 t7 B: F2 k9 v# d

& M2 y' B  x8 e* H  F) ^3 W[root@iZh4ntc7dmrvkzZ zxw]# docker exec -it 965abb1fb546 /bin/bash6 w% X8 g0 P, X& i
root@965abb1fb546:/usr/local/tomcat# cd /usr/share/zoneinfo/Asia # 进入亚洲时区文件夹! t& N6 t. j5 |) c) m
17 s- }) I3 P& r2 j( S
2、复制上海(Shanghai)时区到 localtime
' x9 \, s4 N% d7 ~+ [+ e) o1 r5 s$ Y8 E9 |* R' G
root@965abb1fb546:/usr/share/zoneinfo/Asia# cp Shanghai /etc/localtime # cp 直接复制( p# }7 ~! H: Z% `1 z
root@965abb1fb546:/usr/share/zoneinfo/Asia# exit # 退出容器
- e2 d+ E. ~* e3 Mexit5 l( a9 z1 \# }9 f3 `* R
[root@iZh4ntc7dmrvkzZ zxw]# docker restart 965abb1fb546 # 重启容器
# |1 c3 y% r5 H0 n: z9 L9 ?965abb1fb546& k" ]1 l% s  j4 Q! m9 H
[root@iZh4ntc7dmrvkzZ zxw]# docker exec 965abb1fb546 date # 再次查看,已经和现在的时间对应了,时区也变成了 CST 了
9 z/ w$ a/ u& P2 cThu May 28 11:12:12 CST 2020* ?& r+ A6 j+ E/ [" T, ]
1
! C2 S/ V, l) ^4 n3 ~2
! }* v& W, R2 y; i- j3
; a, F8 ?4 h! d% T3 V/ q, v4
+ i" ]0 k- L* o4 t; F( h  h52 l# q; [. S; }; ^1 ?3 s
6
  f& R- U" i: y" ^四、验证(重启容器并查看日志)
7 m7 L% \; u3 X# {, M. Q. T
1 G5 U; d6 N, p# V[root@iZh4ntc7dmrvkzZ zxw]# docker logs -f --tail 100 965abb1fb546
) N" A0 j; J* t, i28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux& L. v  e5 q9 R9 K0 m
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_64. r. o- H" G; Q  I; _  W# F7 i) b
28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd649 i) I0 R! Z9 J: H/ ~
1
. ]8 b. u( F7 X6 G. S. }' }2
- m+ D, j9 c3 U3 ~2 }( W33 }, {& |2 K5 h/ ~7 U: V
可以看到打印的日志已经和当前时间相同了。
3 x7 r  O, `. }1 O
" L/ m& L/ U* ]1 u五、说明, {5 I& o. F8 m$ b: p* P% I
- p! j  I& J/ W, K' A: `
为什么时区时间是少了8个小时,但是数据库的时间却比设置的时间多了8个小时?
) s8 `6 p$ S6 P7 n3 z8 R是因为数据库设置了操作时间为上海时间(Shanghai),所以插入的时候会自动在当前时间➕8个小时,指定的0点本来是指定的上海时间的0点,但是时区不对(执行的时候始终是0点),就是在另一个时区的零点执行的,另一个时区的零点其实就是 Shanghai 时间的八点中,所以数据库的时间是 Shanghai 时间的8点钟执行的,说白了就是时区把0点延后了8小时,但是保存到数据库是 Shanghai 时间,于是就➕了八个小时,有点小饶,但是想清楚了就完全能理解了。
8 U) Q. G" G7 Z' g
1 D! h  v# Z+ N8 J! h' @9 V六、参考
8 ?3 E7 H  \* W9 m) x# B& I
/ L5 K4 r& Z* G% `3 Q* U) _+ E! c参考文章3 B" {' k: A/ v& W
  [& \& ^, p" n2 m& Q. `
总结, J" |; d! e' {9 c( [! W( T

! r7 }- W, H: Y$ L7 B" _- t) x时区问题经常遇到,修改的地方也不尽相同,所以记录在此,下次遇到了能快速解决问题;这也只是其中一种修改 docker 容器的时区方法,还有其它的比如,启动的时候挂载宿主机的时区等,这里不再说明,网上也有很多资料,以后有遇到再记录。
0 w+ O$ i3 Z. Q$ j2 ^4 P) d/ j7 d————————————————3 a) i1 k7 ~4 j) G9 ]3 G, K$ o
版权声明:本文为CSDN博主「忧郁的白衬衫丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。' @9 b# V( ^& S1 Y7 I
原文链接:https://blog.csdn.net/weixin_42816285/article/details/106403093+ R" d- `/ F5 @8 I! E
- v5 M: L; _: x7 ?! S# L) G+ U

5 d: z1 e  }& P1 a: S2 u- e8 Z
作者: 手可摘星陈    时间: 2020-6-1 12:25
发表回复谢谢啦/ _- a: Q# q: T) `8 n% p1 }





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