数学建模社区-数学中国
标题:
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 h
28-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% H
Thu 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 e
2
8 m* D+ w0 e2 }4 J% s
3
5 V+ e2 H# E8 r1 J
4
- H5 W! g% [/ ?' r
5
9 P3 C" U" U1 M
6
0 T( `+ q4 K) q
7
! ]- W% C2 v9 ~$ x, J
8
- x6 e* A1 L% W+ L5 ~; ]
9
9 w5 _# V1 `1 S9 x$ c
明显一个是 UTC,一个是 CST,不一样的时区,相差八个小时。
0 D* Q( n X. N% p
2 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 i
1、进入需要修改时区的 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, z
root@965abb1fb546:/usr/local/tomcat# cd /usr/share/zoneinfo/Asia # 进入亚洲时区文件夹
& t7 {$ J5 m1 k" i) X
1
4 s' V5 ?+ ]3 v- t; a
2、复制上海(Shanghai)时区到 localtime
2 z. _5 `0 Y1 X4 k7 ]) b: i& g
2 C( q9 o& T- M( J
root@965abb1fb546:/usr/share/zoneinfo/Asia# cp Shanghai /etc/localtime # cp 直接复制
0 i2 y& ~- [( p# U; c
root@965abb1fb546:/usr/share/zoneinfo/Asia# exit # 退出容器
) }! k* i( X V r
exit
1 l+ w( p) g$ y$ l8 F) L. ^% i
[root@iZh4ntc7dmrvkzZ zxw]# docker restart 965abb1fb546 # 重启容器
3 S$ w6 ~% ?) m3 |) X
965abb1fb546
: \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 ?: T
1
7 c3 k+ r* a/ J6 [8 Y+ f& u
2
; J' E2 y, N% u
3
5 [2 ~5 l4 ?7 f& u6 M5 E8 i
4
( z" l @2 h3 w8 o% _% a: C
5
' Q/ [0 ^. _6 B1 g, W
6
: ~/ 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_64
8 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 \$ c
3
+ 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' O
9 _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