- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565543 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174886
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
Docker 中时区和宿主机相隔八个小时的解决方案之一 ?8 E. r( \ h) g$ J
前言& \( z0 W0 H: Y7 o/ o
, s- b9 w/ U. q8 G项目部署在 tomcat 容器中,但是定时任务在凌晨插入数据到数据库后,第二天查看数据时间不对,时间延后的8个小时,于是踏上了解决之路。8 u$ W$ y; [$ Z! ?" B/ J7 k
- D: a, G' f- e1 f8 b5 r" X4 h; `
关键字:Linux、Docker、Tomcat) a3 M+ S5 P2 p& x& C$ r8 J: Q
" H: |) b4 L, J& i2 G8 y/ k. P一、问题重现: L+ ?9 W. u2 g* N
/ t$ i5 c; P( Y. @5 g: U项目中设置的定时任务是凌晨0点整执行,但是第二天查看数据库发现插入的时间是当天的8点钟(为什么是延后后面会讲),然后查看日志发现,打印日志的时间也和现在对不上(比现在少八个小时),就已经很明了了,时区的问题,然后重要的是怎么解决,把这个打印时间变成和现在对应的时间。2 ~0 N3 L8 |& E9 V9 n
3 W9 W* v8 Y0 |" |) r3 ^; k[root@iZh4ntc7dmrvkzZ zxw]# docker logs -f --tail 100 965abb1fb546 # 查看 docker 容器日志的最后100行,动态的(新增继续打印)7 o& D! g) w0 g, e0 b; u
# 打的日志上面的信息会比当前的时间(北京时间)少8个小时
6 Y/ s8 M! }) K" @0 B28-May-2020 02:41:31.492 INFO [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
. C& Q+ W @$ ]9 o! }28-May-2020 02:41:31.496 INFO [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]# e S( \" q" r. X& G
28-May-2020 02:41:31.498 INFO [Thread-9] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]8 I8 K3 I* E1 ^; R
[root@iZh4ntc7dmrvkzZ zxw]# docker exec 965abb1fb546 date # 查看指定容器的时区,965abb1fb546为容器 id
: Z- Q* J, x$ S% r6 o! s/ s" _& PThu May 28 02:50:42 UTC 2020' u% K5 w- L- K+ m/ [2 q; v
[root@iZh4ntc7dmrvkzZ ~]# date # 查看 linux 的时间
. |7 c( X2 _6 M0 a- Y- g! A9 WThu May 28 14:19:38 CST 2020" ?9 K2 P$ ^! h/ m
[root@iZh4ntc7dmrvkzZ ~]#
( l8 X. k T- m# F* p% J10 a) A% c. {; |1 ~ E9 q
2" @( V' z1 E x9 o, p; r
3; I) X/ f7 F+ u- ]+ u) ^( x+ y# t
4/ g0 k" H9 M6 ~# r) p$ ?" T6 K3 Z% I4 d
5
; J8 p& d+ A6 l- k9 g* A6/ x4 ^# e* I" r; v N; s* W
7
% M+ x* Y+ V+ x2 n3 R4 x8
- ^# ^0 k/ L$ i5 m1 j) _ A9
$ {3 z) O4 [, v明显一个是 UTC,一个是 CST,不一样的时区,相差八个小时。
/ ?$ R# ~8 A/ M3 Q H- D* n) q& r. r D- {' f' _/ x8 y. l& g
二、分析问题
( G" s% r" t H) p% b! z& E
3 G# O! m( R' t刚遇到的时候只知道是时区问题,最先想到的就是 tomcat 的时区设置不对,然后找了资料修改之后,发现并没有什么暖用,然后查资料的时候发现 docker 的时间也会出现这种情况,就把问题方向占时确认为 docker 问题(后面修改成功也证明了确实是 docker 的问题)。
/ m) b' [) a) S1 N, G( _- I3 Q2 q$ Y% U; R, \! H% R' e, T( S, W9 O
三、修改 docker 容器的时区
3 i: }- B) E: R5 j% x- z; a8 y' R# a. d9 Q: \6 c- V2 M
1、进入需要修改时区的 docker 容器
& o% ~" T3 e l" G; H+ e% M$ h' F# T7 k, w: i' m" ]3 _. A5 _3 _
[root@iZh4ntc7dmrvkzZ zxw]# docker exec -it 965abb1fb546 /bin/bash
) ]! q8 B6 x/ Aroot@965abb1fb546:/usr/local/tomcat# cd /usr/share/zoneinfo/Asia # 进入亚洲时区文件夹
4 U9 {7 n7 Y% |4 S" ~8 J9 Y1
9 T$ P0 U1 P# M3 p3 g2、复制上海(Shanghai)时区到 localtime
) I8 O% x& P) V8 D' ^: i+ Z, y. M4 a) u
4 r% [+ W8 ?/ s. C0 y. |root@965abb1fb546:/usr/share/zoneinfo/Asia# cp Shanghai /etc/localtime # cp 直接复制/ D+ Y/ D8 Z: u. r# y% @& K/ [
root@965abb1fb546:/usr/share/zoneinfo/Asia# exit # 退出容器
( p( z6 z* ^8 X% Xexit
+ x1 J! U1 C" f[root@iZh4ntc7dmrvkzZ zxw]# docker restart 965abb1fb546 # 重启容器3 I8 F. W9 z- m5 i
965abb1fb546
5 L! ^/ e* J! P+ e7 I[root@iZh4ntc7dmrvkzZ zxw]# docker exec 965abb1fb546 date # 再次查看,已经和现在的时间对应了,时区也变成了 CST 了( P% w {- D. R( Q
Thu May 28 11:12:12 CST 2020: D! F I& E) o; Z
1
) b) W6 e! T3 O B% H8 G2
! F, t, {( ?4 I- B" `* |- X1 ~3! h2 v' X5 ?7 I8 \: E" K- t; E
4
3 Q/ C. X+ i# ~5
8 [1 s- R: B% U6
: j+ _" d6 E/ S1 G+ \四、验证(重启容器并查看日志)5 E# R6 P" z) N u
7 W3 ]) b ?! p. F. n8 l6 O4 D7 y
[root@iZh4ntc7dmrvkzZ zxw]# docker logs -f --tail 100 965abb1fb546% Y# s- h6 R% r; q, m
28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux2 E" V7 [( K- y- _4 p) O
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& H3 }' O* I% E6 w3 v/ l0 ]7 s; O
28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64
) X0 K& C; Z* L/ y8 @, h1& `8 C: i8 j8 F
2* f0 g" h0 z2 `: W/ N5 b
3
5 {# B$ a3 M* ]* _1 ]8 L可以看到打印的日志已经和当前时间相同了。, w9 [$ X1 ?; W6 s+ t; n
3 L) ]# L' W) N% a. a9 H8 r
五、说明5 N% ^* R$ F8 L v" v4 v
- A9 k4 u, }" \/ ?3 S0 o
为什么时区时间是少了8个小时,但是数据库的时间却比设置的时间多了8个小时?
4 @ J$ i4 `( d7 f" N是因为数据库设置了操作时间为上海时间(Shanghai),所以插入的时候会自动在当前时间➕8个小时,指定的0点本来是指定的上海时间的0点,但是时区不对(执行的时候始终是0点),就是在另一个时区的零点执行的,另一个时区的零点其实就是 Shanghai 时间的八点中,所以数据库的时间是 Shanghai 时间的8点钟执行的,说白了就是时区把0点延后了8小时,但是保存到数据库是 Shanghai 时间,于是就➕了八个小时,有点小饶,但是想清楚了就完全能理解了。
9 Q0 m; w1 [4 y: D' f- ]
( R& r- u5 W, K+ H: ? h/ W" U六、参考
7 U. W% Y! Q( r% a( a; D& ?3 p3 A0 B, r& z6 ]# H5 S8 F# M
参考文章
5 K2 B( n( f$ D/ `# _& ^
/ a* N3 Z4 ^ N7 R3 d总结# U* g3 w! _8 p5 n, R
5 K6 l. f; n5 Z; N
时区问题经常遇到,修改的地方也不尽相同,所以记录在此,下次遇到了能快速解决问题;这也只是其中一种修改 docker 容器的时区方法,还有其它的比如,启动的时候挂载宿主机的时区等,这里不再说明,网上也有很多资料,以后有遇到再记录。( T' P# r9 r1 U3 N- o0 i
————————————————4 {2 u& O4 p8 w4 C j; C
版权声明:本文为CSDN博主「忧郁的白衬衫丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ A( N" w; }( Z- }3 u
原文链接:https://blog.csdn.net/weixin_42816285/article/details/106403093
# ^* c+ O- @% \) Q
% M! A, Q+ R* |9 v& M( {( ~2 v8 B0 F7 A) q& ?
|
zan
|