数学建模社区-数学中国
标题:
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、Tomcat
1 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
2
9 d& j) t2 p% ?
3
7 e. ~4 C9 H% R
4
) x8 q3 x* W" j# x5 ~
5
1 x. Z3 u0 Q) F( C8 o7 D
6
4 G# d! X: L! x) x' S
7
4 X/ x$ L y+ l; X& f( ]: L
8
2 u0 b) g$ c$ U" W8 ?1 x
9
: {, g+ ^/ s& F- ?' p
明显一个是 UTC,一个是 CST,不一样的时区,相差八个小时。
1 U' H1 A: J( c* M+ P# a( S
8 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" j
4 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/bash
6 w% X8 g0 P, X& i
root@965abb1fb546:/usr/local/tomcat# cd /usr/share/zoneinfo/Asia # 进入亚洲时区文件夹
! t& N6 t. j5 |) c) m
1
7 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 M
exit
5 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 c
Thu 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- j
3
; a, F8 ?4 h! d% T3 V/ q, v
4
+ i" ]0 k- L* o4 t; F( h h
5
2 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, i
28-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: amd64
9 i) I0 R! Z9 J: H/ ~
1
. ]8 b. u( F7 X6 G. S. }' }
2
- m+ D, j9 c3 U3 ~2 }( W
3
3 }, {& |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