数学建模社区-数学中国

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

作者: 杨利霞    时间: 2020-5-30 15:21
标题: Docker 中时区和宿主机相隔八个小时的解决方案之一
Docker 中时区和宿主机相隔八个小时的解决方案之一
$ f' ~' u7 `  Q9 q& S前言
: i; C& O! X; h+ |7 g6 G; E9 T& R2 x( o2 V; j" [( {
项目部署在 tomcat 容器中,但是定时任务在凌晨插入数据到数据库后,第二天查看数据时间不对,时间延后的8个小时,于是踏上了解决之路。0 C% F5 M+ P% k4 w, G9 u

7 [3 N/ P# O4 D* y! s: `关键字:Linux、Docker、Tomcat, p" p" K6 P2 X% e1 D

/ e2 m3 I) g7 a" n一、问题重现
! I; e: K7 n- g( K' `
9 n. `9 M/ C+ w6 c项目中设置的定时任务是凌晨0点整执行,但是第二天查看数据库发现插入的时间是当天的8点钟(为什么是延后后面会讲),然后查看日志发现,打印日志的时间也和现在对不上(比现在少八个小时),就已经很明了了,时区的问题,然后重要的是怎么解决,把这个打印时间变成和现在对应的时间。: U! s& w9 r7 g# B: B7 A

* J1 Z- F: }6 G/ x/ z8 _7 M4 A- c[root@iZh4ntc7dmrvkzZ zxw]# docker logs -f --tail 100 965abb1fb546 # 查看 docker 容器日志的最后100行,动态的(新增继续打印)" T- ^+ D, K$ L
# 打的日志上面的信息会比当前的时间(北京时间)少8个小时  S- n2 G5 N9 o# D4 L$ ~* `$ D# C! |
28-May-2020 02:41:31.492 INFO [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
" o# C3 t( ~5 P, i+ Q1 h28-May-2020 02:41:31.496 INFO [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]
/ \0 A' {! z: o! }28-May-2020 02:41:31.498 INFO [Thread-9] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
* T$ {" j5 p# t$ j+ U# r8 }2 E[root@iZh4ntc7dmrvkzZ zxw]# docker exec 965abb1fb546 date # 查看指定容器的时区,965abb1fb546为容器 id
+ r; \# [/ ~, H; f  L% HThu May 28 02:50:42 UTC 2020
$ W. k7 ~1 ~9 O8 X/ I  j0 k[root@iZh4ntc7dmrvkzZ ~]# date # 查看 linux 的时间! t. ^8 v' \* g7 p
Thu May 28 14:19:38 CST 2020/ c# @! p% c  }* t; n
[root@iZh4ntc7dmrvkzZ ~]# ' Z& b9 `1 {, t; N& M% F& h
1
' m! O; g& X( X/ q( l1 [3 e2
8 m* D+ w0 e2 }4 J% s35 V+ e2 H# E8 r1 J
4
- H5 W! g% [/ ?' r5
9 P3 C" U" U1 M6
0 T( `+ q4 K) q7
! ]- W% C2 v9 ~$ x, J8- x6 e* A1 L% W+ L5 ~; ]
99 w5 _# V1 `1 S9 x$ c
明显一个是 UTC,一个是 CST,不一样的时区,相差八个小时。
0 D* Q( n  X. N% p2 U* Y: E7 e# G9 ?6 \
二、分析问题* f  P; `. v6 }
: W" u: ?% x, K7 S
刚遇到的时候只知道是时区问题,最先想到的就是 tomcat 的时区设置不对,然后找了资料修改之后,发现并没有什么暖用,然后查资料的时候发现 docker 的时间也会出现这种情况,就把问题方向占时确认为 docker 问题(后面修改成功也证明了确实是 docker 的问题)。, j' `2 A2 y: P/ o1 z6 o& Z# m. G
# F. z  t6 t' A& g
三、修改 docker 容器的时区
$ ]( [' _$ `; n/ c% m4 Q) y# {, e
9 {6 J4 I- A/ X1 ]3 i1、进入需要修改时区的 docker 容器- d0 v$ @+ z* b$ l% K( I

8 q0 v$ r2 C7 Q  c# l9 \$ W; k[root@iZh4ntc7dmrvkzZ zxw]# docker exec -it 965abb1fb546 /bin/bash
/ f+ @" V4 l0 v( f+ R/ P, zroot@965abb1fb546:/usr/local/tomcat# cd /usr/share/zoneinfo/Asia # 进入亚洲时区文件夹& t7 {$ J5 m1 k" i) X
1
4 s' V5 ?+ ]3 v- t; a2、复制上海(Shanghai)时区到 localtime
2 z. _5 `0 Y1 X4 k7 ]) b: i& g
2 C( q9 o& T- M( Jroot@965abb1fb546:/usr/share/zoneinfo/Asia# cp Shanghai /etc/localtime # cp 直接复制
0 i2 y& ~- [( p# U; croot@965abb1fb546:/usr/share/zoneinfo/Asia# exit # 退出容器
) }! k* i( X  V  rexit
1 l+ w( p) g$ y$ l8 F) L. ^% i[root@iZh4ntc7dmrvkzZ zxw]# docker restart 965abb1fb546 # 重启容器
3 S$ w6 ~% ?) m3 |) X965abb1fb546: \5 Z3 H4 }! S8 @7 |$ |0 V# ^
[root@iZh4ntc7dmrvkzZ zxw]# docker exec 965abb1fb546 date # 再次查看,已经和现在的时间对应了,时区也变成了 CST 了1 w+ U" u# ~6 g: A, E" r4 X5 S$ m
Thu May 28 11:12:12 CST 2020
! T2 e! X+ B! x6 Y+ E1 ?: T17 c3 k+ r* a/ J6 [8 Y+ f& u
2
; J' E2 y, N% u3
5 [2 ~5 l4 ?7 f& u6 M5 E8 i4( z" l  @2 h3 w8 o% _% a: C
5
' Q/ [0 ^. _6 B1 g, W6
: ~/ h$ S% q) E  g4 p四、验证(重启容器并查看日志)% H4 N. y! x  `$ w" b# D* s

) b( f' l; s( i[root@iZh4ntc7dmrvkzZ zxw]# docker logs -f --tail 100 965abb1fb546& j  A6 x) r9 F- Y! b
28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux# g$ u) C; U+ z0 I5 S
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_648 l& y5 T& b) b; J
28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
: h* Y( G, F4 {& ?; L, u9 [1& J# [( u" W  E0 w/ k
2
. e' d$ \, p* {8 \$ c3
+ i# Z$ S  s9 l6 A  O$ `: o可以看到打印的日志已经和当前时间相同了。0 V( G9 }+ k& f$ I
3 M  c3 {' h% q$ ?% n  H
五、说明' c" W$ d0 m# k3 o$ @. g

. F+ A* `* M; I  @7 @为什么时区时间是少了8个小时,但是数据库的时间却比设置的时间多了8个小时?
2 i5 Z  [  |" j( k, A3 h/ V) N是因为数据库设置了操作时间为上海时间(Shanghai),所以插入的时候会自动在当前时间➕8个小时,指定的0点本来是指定的上海时间的0点,但是时区不对(执行的时候始终是0点),就是在另一个时区的零点执行的,另一个时区的零点其实就是 Shanghai 时间的八点中,所以数据库的时间是 Shanghai 时间的8点钟执行的,说白了就是时区把0点延后了8小时,但是保存到数据库是 Shanghai 时间,于是就➕了八个小时,有点小饶,但是想清楚了就完全能理解了。
. X% j" S0 z: O1 |: Z$ A1 M+ j2 E% J- ?; \0 n
六、参考+ e' [  e+ |2 X  a

" B; M2 N' I! N" F参考文章- e8 l  T! t; j1 b; O
/ p9 f1 a6 j/ q, ?! n
总结
/ X  ^' U% h0 x' f  v; d' O9 _6 E+ _5 ~# C
时区问题经常遇到,修改的地方也不尽相同,所以记录在此,下次遇到了能快速解决问题;这也只是其中一种修改 docker 容器的时区方法,还有其它的比如,启动的时候挂载宿主机的时区等,这里不再说明,网上也有很多资料,以后有遇到再记录。
, e% I- b/ V- w! h————————————————
# f9 ~. ^, p- m# c5 g3 ]版权声明:本文为CSDN博主「忧郁的白衬衫丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
) I" H2 m! }) \4 Z. A原文链接:https://blog.csdn.net/weixin_42816285/article/details/106403093; Z8 k5 a5 M+ `0 k6 o

6 V2 T" t1 @. Y& ^0 q# D# B6 j2 j* ~" X/ c' _# g& h' b! O

作者: 手可摘星陈    时间: 2020-6-1 12:25
发表回复谢谢啦
! h3 h, X% n* e8 i/ }8 E




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