数学建模社区-数学中国

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

作者: 杨利霞    时间: 2020-5-30 15:21
标题: Docker 中时区和宿主机相隔八个小时的解决方案之一
Docker 中时区和宿主机相隔八个小时的解决方案之一
+ ~/ ]8 w% W9 l前言
5 F$ @7 X1 N* g5 S( M9 B" L
1 F  x2 K" {1 V7 n1 C, n项目部署在 tomcat 容器中,但是定时任务在凌晨插入数据到数据库后,第二天查看数据时间不对,时间延后的8个小时,于是踏上了解决之路。
3 u0 Y1 y# ?; y: W+ f- U1 d( U/ |( E4 V& Y
关键字:Linux、Docker、Tomcat: C  X4 ], n+ z

1 q9 Y' J$ S' g* Z! m! V: m一、问题重现8 H' b" q5 ]; b: p4 E) C

5 ]8 x  u" p: x% A- {, V; ?* L项目中设置的定时任务是凌晨0点整执行,但是第二天查看数据库发现插入的时间是当天的8点钟(为什么是延后后面会讲),然后查看日志发现,打印日志的时间也和现在对不上(比现在少八个小时),就已经很明了了,时区的问题,然后重要的是怎么解决,把这个打印时间变成和现在对应的时间。
# z( @0 u1 \* O6 z3 x
2 g) T! l7 \# ^/ M' d[root@iZh4ntc7dmrvkzZ zxw]# docker logs -f --tail 100 965abb1fb546 # 查看 docker 容器日志的最后100行,动态的(新增继续打印)
& F0 R) l" S! X0 L! J3 i" j# 打的日志上面的信息会比当前的时间(北京时间)少8个小时
+ I/ T6 R4 P) W28-May-2020 02:41:31.492 INFO [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
5 M' L3 n  \  Z0 V" `28-May-2020 02:41:31.496 INFO [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]- ?- A% t3 m" W8 ~3 w9 B. |
28-May-2020 02:41:31.498 INFO [Thread-9] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
6 B: L6 M' q) q0 v; r/ m[root@iZh4ntc7dmrvkzZ zxw]# docker exec 965abb1fb546 date # 查看指定容器的时区,965abb1fb546为容器 id
2 g7 @" R" r8 ]! W6 m# O6 AThu May 28 02:50:42 UTC 2020
# B' W* p& J4 M  D/ M[root@iZh4ntc7dmrvkzZ ~]# date # 查看 linux 的时间
; z6 {# o* s, Y( n5 EThu May 28 14:19:38 CST 2020
. _: ^8 c$ }1 k# v+ h; o[root@iZh4ntc7dmrvkzZ ~]#
# j5 A. H$ G$ O. ^' l' ?. w) n1
' P3 c1 U0 e# ]$ ]( u' N; \0 W2
# }' f* f$ w7 p, L5 Z& f. C2 O5 s32 n# B& W, L; M
4: P/ N, G* U; S- y+ @0 }% d
5* @6 v. P* c. K7 j/ o# F
6  p1 D! }0 y. S# s8 @2 q- c
7; l7 ~) M: H' u+ B% b1 z
89 X. B( b* K/ D1 n
9
, n4 H0 X% n7 l9 S' @明显一个是 UTC,一个是 CST,不一样的时区,相差八个小时。; ^; E; M/ K8 V; `

& O- ^* w  O+ V( ~二、分析问题
% M8 ?  D! F! Y4 ]- `, W0 b6 B/ Y6 h! a1 Z1 A
刚遇到的时候只知道是时区问题,最先想到的就是 tomcat 的时区设置不对,然后找了资料修改之后,发现并没有什么暖用,然后查资料的时候发现 docker 的时间也会出现这种情况,就把问题方向占时确认为 docker 问题(后面修改成功也证明了确实是 docker 的问题)。* _' |( Q5 B/ t! t0 j, a- O
4 j3 [- R" @1 I1 M' c
三、修改 docker 容器的时区* {- M5 n* ]7 r. p9 P
6 Z  q  e3 h; d
1、进入需要修改时区的 docker 容器8 i, @2 a) u$ J2 U" p6 |

5 D) y; A7 C. ~' U; u( f[root@iZh4ntc7dmrvkzZ zxw]# docker exec -it 965abb1fb546 /bin/bash5 q3 @: w# d) d, }( M" H0 q6 e4 g
root@965abb1fb546:/usr/local/tomcat# cd /usr/share/zoneinfo/Asia # 进入亚洲时区文件夹+ ~- h6 H4 b/ ^9 y( T0 _" \
1
/ V1 ?  p; @+ y; }7 m0 U- l- O2、复制上海(Shanghai)时区到 localtime
* G) j, I2 l8 Y! ~6 w+ E' v8 W% }% Z' \& v: u1 L
root@965abb1fb546:/usr/share/zoneinfo/Asia# cp Shanghai /etc/localtime # cp 直接复制7 `% g7 z/ f1 E7 \0 G
root@965abb1fb546:/usr/share/zoneinfo/Asia# exit # 退出容器
) H6 K3 |& s6 Y' D: K. Rexit! I2 n" y: @& n: p5 e! \, i' _
[root@iZh4ntc7dmrvkzZ zxw]# docker restart 965abb1fb546 # 重启容器% }- u0 h; H2 a
965abb1fb546+ R9 O5 s* G6 @3 k" b9 N- i
[root@iZh4ntc7dmrvkzZ zxw]# docker exec 965abb1fb546 date # 再次查看,已经和现在的时间对应了,时区也变成了 CST 了+ i: @6 ]' [6 R* o( |0 g% H
Thu May 28 11:12:12 CST 2020
4 o( E% q/ b3 ~$ ]% G1
* T5 Y. O5 Y) s& K2, a- y/ L9 O, c3 a: X
3$ a6 I  B1 i3 [1 ~  K2 v
45 F/ c* R' h7 p4 G/ ^3 B  t6 x8 a
5
3 }3 n3 [  K* K. t5 p: x& J6
/ w$ b! Z- ]0 }9 d2 \7 N# X四、验证(重启容器并查看日志)6 K- @$ s! _' ~3 J' O
% I* O+ F5 Y8 j4 N1 k
[root@iZh4ntc7dmrvkzZ zxw]# docker logs -f --tail 100 965abb1fb546
5 L, k9 N! X4 [+ b& g28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
8 w) {; h; V7 d- C2 ~0 {4 ~* v28-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
- s7 Z. P! X$ F6 ^* A2 E* h9 U28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64) Y* K6 `, o' I1 J* H0 F" H$ C
16 ~7 ^9 O& {- {" ?. D
2
% y  F' U7 F' K3
% T$ r" R; Y1 X7 @3 h* t可以看到打印的日志已经和当前时间相同了。
" W0 l. h+ ?- d6 r+ ^
* b' {; e4 x' e$ `" _" E五、说明
1 t# Z8 n+ H( ?) {( N- A; B- H5 F( l
为什么时区时间是少了8个小时,但是数据库的时间却比设置的时间多了8个小时?8 Z/ C1 `4 ]9 Z' U2 G* S2 l
是因为数据库设置了操作时间为上海时间(Shanghai),所以插入的时候会自动在当前时间➕8个小时,指定的0点本来是指定的上海时间的0点,但是时区不对(执行的时候始终是0点),就是在另一个时区的零点执行的,另一个时区的零点其实就是 Shanghai 时间的八点中,所以数据库的时间是 Shanghai 时间的8点钟执行的,说白了就是时区把0点延后了8小时,但是保存到数据库是 Shanghai 时间,于是就➕了八个小时,有点小饶,但是想清楚了就完全能理解了。$ U( o1 c( {. @% W1 a

2 k! o+ W" Z6 K, h7 U2 W六、参考: X1 E( F( g7 r4 Y5 G0 i4 J5 M

1 R% q6 @0 F" C6 N3 ]参考文章% C2 b5 ?- U2 Q6 e9 O
; c6 ^  W" d  D7 m$ u1 S3 @
总结1 O9 O1 q* f9 s% F4 m

$ e+ |3 U- P6 U/ s. G5 M1 a时区问题经常遇到,修改的地方也不尽相同,所以记录在此,下次遇到了能快速解决问题;这也只是其中一种修改 docker 容器的时区方法,还有其它的比如,启动的时候挂载宿主机的时区等,这里不再说明,网上也有很多资料,以后有遇到再记录。/ r8 v! Z1 B, M! Y2 X) F
————————————————! @" o, b; t7 d$ \) f
版权声明:本文为CSDN博主「忧郁的白衬衫丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& P1 e+ M6 f1 y8 e5 w& c
原文链接:https://blog.csdn.net/weixin_42816285/article/details/106403093
# {$ a3 H3 W: K( l, ~& y6 f$ \' v" Y7 t6 O6 V3 E- X

- i' V) M+ e7 X) K- \, `& F6 o. Z
作者: 手可摘星陈    时间: 2020-6-1 12:25
发表回复谢谢啦
* w" `. U# p5 b$ [+ K) J$ I: a




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