数学建模社区-数学中国
标题:
Docker 中时区和宿主机相隔八个小时的解决方案之一
[打印本页]
作者:
杨利霞
时间:
2020-5-30 15:21
标题:
Docker 中时区和宿主机相隔八个小时的解决方案之一
Docker 中时区和宿主机相隔八个小时的解决方案之一
$ p' n( L2 g6 q- ]2 L/ v
前言
1 J7 {( _2 R) Y8 d- \9 p
/ d& X) g8 L. x9 K2 h1 B
项目部署在 tomcat 容器中,但是定时任务在凌晨插入数据到数据库后,第二天查看数据时间不对,时间延后的8个小时,于是踏上了解决之路。
4 g7 S2 }0 I4 i- E' u
& `9 C7 C0 v/ k! p e7 N7 p7 r+ ~
关键字:Linux、Docker、Tomcat
/ e# S& l& u* Y# O5 v5 E
7 h3 U/ ^$ [0 z2 h% l* b8 y8 |
一、问题重现
8 J G; }8 L+ W$ d% z9 h7 I- n
4 b4 m+ t9 Q( Z1 i& F& O
项目中设置的定时任务是凌晨0点整执行,但是第二天查看数据库发现插入的时间是当天的8点钟(为什么是延后后面会讲),然后查看日志发现,打印日志的时间也和现在对不上(比现在少八个小时),就已经很明了了,时区的问题,然后重要的是怎么解决,把这个打印时间变成和现在对应的时间。
$ |* j E }- t+ F4 z8 S" K
7 p5 R, A( q8 L5 k% W
[root@iZh4ntc7dmrvkzZ zxw]# docker logs -f --tail 100 965abb1fb546 # 查看 docker 容器日志的最后100行,动态的(新增继续打印)
2 Z; _' u0 p% l+ b
# 打的日志上面的信息会比当前的时间(北京时间)少8个小时
. u6 F, V8 O* y& X, F6 Q0 i9 _
28-May-2020 02:41:31.492 INFO [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
, j. ~& P; a. L5 x) n, u3 g! q2 o
28-May-2020 02:41:31.496 INFO [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]
8 }1 M8 @6 y1 b9 U7 }( Y
28-May-2020 02:41:31.498 INFO [Thread-9] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
. g9 _+ \) Y! h% j- D; L' M
[root@iZh4ntc7dmrvkzZ zxw]# docker exec 965abb1fb546 date # 查看指定容器的时区,965abb1fb546为容器 id
4 S4 u- ~( C- v0 j3 Z8 f
Thu May 28 02:50:42 UTC 2020
# [, q8 |: ~% _8 G& }1 }
[root@iZh4ntc7dmrvkzZ ~]# date # 查看 linux 的时间
( H& d- v! S3 s
Thu May 28 14:19:38 CST 2020
# y7 I# j% X4 H- Y% ^, j6 B
[root@iZh4ntc7dmrvkzZ ~]#
$ h; c8 n, W8 j2 ]! Y4 h
1
: N$ q$ J2 k* c
2
0 n9 U* V6 j: {5 _; {
3
# D6 K, r& L0 v) j& d
4
0 f( Q/ m3 a# `/ f
5
4 Q6 A+ d6 o4 W) g1 v
6
: S8 W5 U8 u& l- J! |* ?- m0 [; V& ?
7
! P5 y; z4 i7 c/ e# {
8
: O, F( z j8 _2 K+ }5 u1 ?
9
! j' E% b+ }0 R* T" {8 Z/ A% R3 r
明显一个是 UTC,一个是 CST,不一样的时区,相差八个小时。
$ T5 H8 x( t& G) B# v O B
+ f, \$ p3 g1 k- e$ R0 M3 e& ^
二、分析问题
1 B5 K( o: a, p5 Y: V* A
# u- X# v: P' R2 |) t4 r* L
刚遇到的时候只知道是时区问题,最先想到的就是 tomcat 的时区设置不对,然后找了资料修改之后,发现并没有什么暖用,然后查资料的时候发现 docker 的时间也会出现这种情况,就把问题方向占时确认为 docker 问题(后面修改成功也证明了确实是 docker 的问题)。
& u/ s; D* M2 |% F
2 x& B: _6 b7 M& x( m
三、修改 docker 容器的时区
8 {" C6 P1 L6 z! y
, {2 \5 S+ T* |
1、进入需要修改时区的 docker 容器
6 F' Z/ b( P7 x) f& y( z
, W: r9 F" v7 @- S1 U
[root@iZh4ntc7dmrvkzZ zxw]# docker exec -it 965abb1fb546 /bin/bash
$ Y; |9 U. Z: b' s6 w
root@965abb1fb546:/usr/local/tomcat# cd /usr/share/zoneinfo/Asia # 进入亚洲时区文件夹
/ q7 E& N" F$ X3 s: O
1
) ]7 r& e5 W2 S9 B5 P
2、复制上海(Shanghai)时区到 localtime
& m* Q M4 d9 z/ D/ U2 S) N( z
3 l4 r/ Y5 @# e- l: b- m
root@965abb1fb546:/usr/share/zoneinfo/Asia# cp Shanghai /etc/localtime # cp 直接复制
( q8 I% j/ {" f% X( a
root@965abb1fb546:/usr/share/zoneinfo/Asia# exit # 退出容器
/ N" J* m) Y3 o3 g4 [
exit
3 l$ Z* ~- I! @4 @! F
[root@iZh4ntc7dmrvkzZ zxw]# docker restart 965abb1fb546 # 重启容器
! i' R( L1 n+ f: L$ I2 p* V1 r" d
965abb1fb546
- u' Y0 v4 h2 }! @4 o7 Y( X
[root@iZh4ntc7dmrvkzZ zxw]# docker exec 965abb1fb546 date # 再次查看,已经和现在的时间对应了,时区也变成了 CST 了
* f; W" T. a6 h1 R- I5 P
Thu May 28 11:12:12 CST 2020
5 F. s* U+ f, e3 S
1
' |6 A; v3 t3 |/ i
2
; L' Z. W1 O! U' h. q. c2 g/ f; k
3
2 s: e& C# Q2 m
4
7 B6 Y/ i8 r. n& w- u
5
' f. V& ^: k% \0 d( `- S
6
3 C. Z8 c( Y. ~( C" j, {
四、验证(重启容器并查看日志)
, O3 |+ g6 e2 k+ Y' L
* ]5 x" s& x I4 {9 q# b
[root@iZh4ntc7dmrvkzZ zxw]# docker logs -f --tail 100 965abb1fb546
% r2 o, Q% k% c
28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux
% P; y* E V1 {6 M v: f4 b
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
9 h/ R) q# u1 v0 V* @
28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64
; g/ z9 B( D( f w6 l3 E
1
7 y* ^1 t9 O2 h
2
7 e' V2 C6 F" }1 u9 m' ?0 f
3
' p# H/ j4 q7 u" ~+ w
可以看到打印的日志已经和当前时间相同了。
E* A$ Y/ `3 d5 I$ k" n
: c% y# _8 C- K
五、说明
# i) {8 Z7 V- f1 j$ e2 D& ~
! U& y" {. b6 s" _
为什么时区时间是少了8个小时,但是数据库的时间却比设置的时间多了8个小时?
6 J! F1 {3 I6 {$ O" c2 w! _
是因为数据库设置了操作时间为上海时间(Shanghai),所以插入的时候会自动在当前时间➕8个小时,指定的0点本来是指定的上海时间的0点,但是时区不对(执行的时候始终是0点),就是在另一个时区的零点执行的,另一个时区的零点其实就是 Shanghai 时间的八点中,所以数据库的时间是 Shanghai 时间的8点钟执行的,说白了就是时区把0点延后了8小时,但是保存到数据库是 Shanghai 时间,于是就➕了八个小时,有点小饶,但是想清楚了就完全能理解了。
$ z& V0 E) s4 u) K) j
8 B) z) C2 L$ r: ?+ Y: O' X
六、参考
. q; b- F, U! b" n: i- H" r
6 |- ]/ q# g, ~
参考文章
2 k! r5 f8 W/ B$ J/ {9 y. E
' n, D4 y2 Q5 b* ?
总结
4 X9 a! Z& X7 R, Z4 P! s3 V2 _1 J
' P8 x# C4 h: @. E* c; v' G5 q
时区问题经常遇到,修改的地方也不尽相同,所以记录在此,下次遇到了能快速解决问题;这也只是其中一种修改 docker 容器的时区方法,还有其它的比如,启动的时候挂载宿主机的时区等,这里不再说明,网上也有很多资料,以后有遇到再记录。
& U' ^/ @* W1 m7 w& ~8 x) X: X% g+ N
————————————————
6 e7 t" t6 d3 \ t% U- a1 \% X8 ]
版权声明:本文为CSDN博主「忧郁的白衬衫丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
2 G: O$ U; y1 k% q+ W( g( Z
原文链接:https://blog.csdn.net/weixin_42816285/article/details/106403093
! D9 C+ G. j4 e# f" c: @
, C( k( [$ S6 [* }
1 |* Y6 l. f, Z. I. q* b: b" K' M
作者:
手可摘星陈
时间:
2020-6-1 12:25
发表回复谢谢啦
+ x1 F; h x6 ^0 ]' I8 c S
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5