- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563376 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174236
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
Docker 中时区和宿主机相隔八个小时的解决方案之一
U* `* N$ U9 W& \2 s前言5 \8 D& y, o- |4 m g
. _1 a8 B3 @5 x" ]
项目部署在 tomcat 容器中,但是定时任务在凌晨插入数据到数据库后,第二天查看数据时间不对,时间延后的8个小时,于是踏上了解决之路。; J! M8 V+ |, Q* v5 _
" k" a+ C ^8 D4 o4 K8 d关键字:Linux、Docker、Tomcat" v# V, Q/ X/ l* Z4 D, w
, e# y' }0 F; S. f& \: T- S
一、问题重现& e, O; {7 E( ^% `
5 i; t, ~; z1 k% @
项目中设置的定时任务是凌晨0点整执行,但是第二天查看数据库发现插入的时间是当天的8点钟(为什么是延后后面会讲),然后查看日志发现,打印日志的时间也和现在对不上(比现在少八个小时),就已经很明了了,时区的问题,然后重要的是怎么解决,把这个打印时间变成和现在对应的时间。0 ^% p* {5 ]; d& S% g! S+ p2 g6 A# z8 J+ U
9 ]4 {' Q# y- J0 \
[root@iZh4ntc7dmrvkzZ zxw]# docker logs -f --tail 100 965abb1fb546 # 查看 docker 容器日志的最后100行,动态的(新增继续打印)" m% u1 H7 X( M4 B
# 打的日志上面的信息会比当前的时间(北京时间)少8个小时
7 @. F( F n/ p+ M, g" ^28-May-2020 02:41:31.492 INFO [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]& R% D; ]6 i) K+ q
28-May-2020 02:41:31.496 INFO [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]; U, _7 M4 v6 G3 j
28-May-2020 02:41:31.498 INFO [Thread-9] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]+ J( B, g0 r, y/ x
[root@iZh4ntc7dmrvkzZ zxw]# docker exec 965abb1fb546 date # 查看指定容器的时区,965abb1fb546为容器 id
, m7 r- O2 O9 gThu May 28 02:50:42 UTC 2020
) t$ F5 j1 v& |- t5 b5 x% N0 `[root@iZh4ntc7dmrvkzZ ~]# date # 查看 linux 的时间
5 c& V$ D% I- X, HThu May 28 14:19:38 CST 20203 z8 D" x2 q& p
[root@iZh4ntc7dmrvkzZ ~]#
, f2 D' l+ F4 L7 k! t+ Q1
. C7 ]! N# [# X; O8 e8 v4 z/ `2
. r+ X6 }. Z, V# V! l k' ]3
" R/ n( t; `4 |* C0 ]( O& Y$ H& N) v40 `; N% a y4 I& k
5# O7 F! q( i+ D3 z$ v
6) w3 ]7 @! b* @" O' y, b
7
, Q3 i: E( o$ u. q. ?8
+ c* s o4 }6 W& w9
. p( n: ~, p+ T* N明显一个是 UTC,一个是 CST,不一样的时区,相差八个小时。8 f+ L" n7 }" \* W
; n' |) z; f( V6 _! \- ^二、分析问题1 e$ J5 r! H2 o
, m4 t3 J3 [6 h7 F$ H T
刚遇到的时候只知道是时区问题,最先想到的就是 tomcat 的时区设置不对,然后找了资料修改之后,发现并没有什么暖用,然后查资料的时候发现 docker 的时间也会出现这种情况,就把问题方向占时确认为 docker 问题(后面修改成功也证明了确实是 docker 的问题)。) |1 }8 L Z; R/ t% B, s
; J2 c }8 |) Z( r
三、修改 docker 容器的时区
/ E3 Z7 s$ e& I, W% n" \
4 D/ @ p% Y; D- r5 h7 p5 q8 ^- t5 j1、进入需要修改时区的 docker 容器; O3 j/ S" S* a! M$ f
2 j2 h- j% H z G7 \4 ^[root@iZh4ntc7dmrvkzZ zxw]# docker exec -it 965abb1fb546 /bin/bash
& _: q' b0 u; s c# t' ~2 H9 d: I- nroot@965abb1fb546:/usr/local/tomcat# cd /usr/share/zoneinfo/Asia # 进入亚洲时区文件夹
5 r# H' _ b: E. X1
1 c+ V7 t9 x* ]8 ], t2 l2、复制上海(Shanghai)时区到 localtime
& @" N6 s4 Q1 A2 e# |. w, m1 A) U5 }
root@965abb1fb546:/usr/share/zoneinfo/Asia# cp Shanghai /etc/localtime # cp 直接复制1 j6 G$ Y# |- B0 K" j, c5 m4 a
root@965abb1fb546:/usr/share/zoneinfo/Asia# exit # 退出容器9 c" x a7 D- }7 ^
exit% I9 Q r' v) |% @
[root@iZh4ntc7dmrvkzZ zxw]# docker restart 965abb1fb546 # 重启容器
7 A- N' O1 x, n: [+ l965abb1fb546
1 V/ h: a; l0 |[root@iZh4ntc7dmrvkzZ zxw]# docker exec 965abb1fb546 date # 再次查看,已经和现在的时间对应了,时区也变成了 CST 了
+ E# p, K& t6 V$ g$ NThu May 28 11:12:12 CST 2020
8 |$ l& N% W0 e1
5 b$ h: P( O# C8 O( v2& L6 |5 |0 i& W: Z X+ b: a
3
+ n! C# @2 t0 z2 N0 |3 H( L8 M4- p2 i; [+ |% v
5, o0 z" w/ {, Z% Y3 g3 O( r
6
: F4 R$ W& @+ D( h3 |( N R* }四、验证(重启容器并查看日志)
4 o! N/ Z. j) Q+ B/ D6 N
X8 K1 b5 u+ S3 E[root@iZh4ntc7dmrvkzZ zxw]# docker logs -f --tail 100 965abb1fb546
6 Q* {1 u* P+ ^5 @' o2 B* c/ Z28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux" h& T/ t/ r+ I4 z
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
& `# x& t: o4 d8 V# y$ B! ?28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd649 w' p4 T( U/ m/ C
1
0 z6 r/ q: F5 M: k% K. G2
Z0 q9 l; j7 ^3 D0 D4 o: l3
3 r2 K d/ Z$ C* L4 j可以看到打印的日志已经和当前时间相同了。
4 ]/ E3 M" e( K/ a# Q: i$ _. n: s M. m4 Z' M' v$ @
五、说明
0 |+ z' \* z' U0 @2 [
7 _1 x$ O( A; |. H0 W为什么时区时间是少了8个小时,但是数据库的时间却比设置的时间多了8个小时?
1 n. f( Q: M+ w9 M# x* |是因为数据库设置了操作时间为上海时间(Shanghai),所以插入的时候会自动在当前时间➕8个小时,指定的0点本来是指定的上海时间的0点,但是时区不对(执行的时候始终是0点),就是在另一个时区的零点执行的,另一个时区的零点其实就是 Shanghai 时间的八点中,所以数据库的时间是 Shanghai 时间的8点钟执行的,说白了就是时区把0点延后了8小时,但是保存到数据库是 Shanghai 时间,于是就➕了八个小时,有点小饶,但是想清楚了就完全能理解了。0 N, c4 k: g% K' o9 B
% k, B7 { C( a Y2 @. ]' o# Y5 z
六、参考0 f/ r/ L, ?3 }- P" a* x. Y* v4 q0 M
/ m5 c- ?+ F7 N参考文章/ J5 u+ \0 k. w2 `- O
' `1 r i. n3 u% F# y' [7 _% y
总结: N+ \7 P! G6 \3 A/ o! _6 _
1 [ ?$ O* ~$ |8 U% T* d时区问题经常遇到,修改的地方也不尽相同,所以记录在此,下次遇到了能快速解决问题;这也只是其中一种修改 docker 容器的时区方法,还有其它的比如,启动的时候挂载宿主机的时区等,这里不再说明,网上也有很多资料,以后有遇到再记录。) l% N! ]+ d" Q! F" a7 R* l2 H
————————————————6 Z# Q* O9 T* f. @ A5 H7 r
版权声明:本文为CSDN博主「忧郁的白衬衫丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
; _, s% g l& B0 S1 @原文链接:https://blog.csdn.net/weixin_42816285/article/details/106403093
2 W/ S0 c' w/ G- f7 S# a0 A9 }* v3 Z& z5 `6 B0 a
/ O3 V+ G! `+ t+ u0 a" O
|
zan
|