数学建模社区-数学中国
标题:
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) W
28-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 A
Thu May 28 02:50:42 UTC 2020
# B' W* p& J4 M D/ M
[root@iZh4ntc7dmrvkzZ ~]# date # 查看 linux 的时间
; z6 {# o* s, Y( n5 E
Thu May 28 14:19:38 CST 2020
. _: ^8 c$ }1 k# v+ h; o
[root@iZh4ntc7dmrvkzZ ~]#
# j5 A. H$ G$ O. ^' l' ?. w) n
1
' P3 c1 U0 e# ]$ ]( u' N; \0 W
2
# }' f* f$ w7 p, L5 Z& f. C2 O5 s
3
2 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
8
9 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/bash
5 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- O
2、复制上海(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. R
exit
! 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 ~$ ]% G
1
* T5 Y. O5 Y) s& K
2
, a- y/ L9 O, c3 a: X
3
$ a6 I B1 i3 [1 ~ K2 v
4
5 F/ c* R' h7 p4 G/ ^3 B t6 x8 a
5
3 }3 n3 [ K* K. t5 p: x& J
6
/ 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& g
28-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 ~* v
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
- s7 Z. P! X$ F6 ^* A2 E* h9 U
28-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
1
6 ~7 ^9 O& {- {" ?. D
2
% y F' U7 F' K
3
% 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, ~& y
6 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