- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 555901 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172143
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
Docker 中时区和宿主机相隔八个小时的解决方案之一' @5 f | H# `- V. t6 m
前言7 V" J, j5 F f! A' g! Q7 V
# T4 b: y+ K9 b1 t) w- L项目部署在 tomcat 容器中,但是定时任务在凌晨插入数据到数据库后,第二天查看数据时间不对,时间延后的8个小时,于是踏上了解决之路。3 d1 X, Y+ R, l0 m1 U
% P' O2 k" @6 U
关键字:Linux、Docker、Tomcat
$ A& ?5 f: U5 G# b# `+ m4 }4 ]9 h, K) B R+ n$ ^# T) V$ ~
一、问题重现) X' ^# X g: }3 p# u" |( F8 U
7 _& i. C0 q" ?7 h4 x4 c5 J! u
项目中设置的定时任务是凌晨0点整执行,但是第二天查看数据库发现插入的时间是当天的8点钟(为什么是延后后面会讲),然后查看日志发现,打印日志的时间也和现在对不上(比现在少八个小时),就已经很明了了,时区的问题,然后重要的是怎么解决,把这个打印时间变成和现在对应的时间。. Z S% a) x" U
* @1 `$ G" Y+ Y- g[root@iZh4ntc7dmrvkzZ zxw]# docker logs -f --tail 100 965abb1fb546 # 查看 docker 容器日志的最后100行,动态的(新增继续打印)
# p3 T0 s. F6 U( B: @/ m# 打的日志上面的信息会比当前的时间(北京时间)少8个小时
. a4 O# ]; M+ |+ x7 w28-May-2020 02:41:31.492 INFO [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
5 M% {- d- B+ q( K% m) V$ E6 h28-May-2020 02:41:31.496 INFO [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]. p1 F0 ]. q4 a3 p* s! z
28-May-2020 02:41:31.498 INFO [Thread-9] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
% R& e( I5 t( Q& |8 }6 T[root@iZh4ntc7dmrvkzZ zxw]# docker exec 965abb1fb546 date # 查看指定容器的时区,965abb1fb546为容器 id
/ \1 s! ~8 h7 y: p1 g: ZThu May 28 02:50:42 UTC 20204 d& R7 k' D% w% M1 c5 M
[root@iZh4ntc7dmrvkzZ ~]# date # 查看 linux 的时间 m0 J2 V1 H3 B# e
Thu May 28 14:19:38 CST 2020/ P; p, N; j! m
[root@iZh4ntc7dmrvkzZ ~]#
( z: f& j7 {: P8 o1
8 J0 n& S( E9 u8 b, [2
# U1 o7 A. l; ^) u% q" N3
& N* o! P! j& y9 y) o( I) ~+ \4 A4
: F0 L: b) w9 w5
3 e6 b/ V* s6 v2 b# @; `+ H e' \, `6
/ ?! q# `- N P9 G0 C4 P. \ h7+ n& j7 v/ y! T# j9 i: [" t
8+ K# e% ]5 x! i: V6 Y" n
9# R N" T5 R- N+ K8 R
明显一个是 UTC,一个是 CST,不一样的时区,相差八个小时。, B( t# O' h6 g
# e: ?7 n, G2 M# `二、分析问题7 S8 U3 i2 E5 P/ X( Y
# ]9 T4 E/ i$ f7 R: l刚遇到的时候只知道是时区问题,最先想到的就是 tomcat 的时区设置不对,然后找了资料修改之后,发现并没有什么暖用,然后查资料的时候发现 docker 的时间也会出现这种情况,就把问题方向占时确认为 docker 问题(后面修改成功也证明了确实是 docker 的问题)。
/ d: m, b S/ ]; p7 j) E* G: J5 B2 h
三、修改 docker 容器的时区
' s6 v; @. P0 @( X5 ^, B+ Y4 @9 W" _/ o
1、进入需要修改时区的 docker 容器
' T4 C' O4 {, b- F& j4 M( _) z# P( R8 [! b
[root@iZh4ntc7dmrvkzZ zxw]# docker exec -it 965abb1fb546 /bin/bash
& F+ y! V$ \! j7 C4 R8 {' Nroot@965abb1fb546:/usr/local/tomcat# cd /usr/share/zoneinfo/Asia # 进入亚洲时区文件夹% n! D- [8 R) H
1+ ]; T! v& i I/ X' E
2、复制上海(Shanghai)时区到 localtime( _4 t7 C0 U& H" {% X+ d
! C0 B* L2 `# J! J& }/ \; Sroot@965abb1fb546:/usr/share/zoneinfo/Asia# cp Shanghai /etc/localtime # cp 直接复制
6 | c* x2 J; I% x. u. w. u) zroot@965abb1fb546:/usr/share/zoneinfo/Asia# exit # 退出容器
% c0 I! ]9 k/ S" b, ` ~$ texit, R7 T4 S# t! R4 M+ A; w$ Q2 \
[root@iZh4ntc7dmrvkzZ zxw]# docker restart 965abb1fb546 # 重启容器
( q. ]3 Z- }0 A5 E/ ?; c+ T/ ^) s965abb1fb5466 u5 U% _* V3 }
[root@iZh4ntc7dmrvkzZ zxw]# docker exec 965abb1fb546 date # 再次查看,已经和现在的时间对应了,时区也变成了 CST 了
. }3 @/ ^6 w r2 B4 C# ^8 j. g2 ?Thu May 28 11:12:12 CST 2020
1 J8 l& J; _6 A9 F1
" ]% Y ^! ?7 o4 D2
! s9 N1 B' z) I! e: K1 @" {. |# t3
4 N+ P2 O) y3 V3 [4
! d5 P9 d$ w) d1 x' d8 C; o5
& D9 E9 J- W) @. Z3 s6
* h; A8 V, I: v( o+ s& v: r+ H四、验证(重启容器并查看日志)/ W) l3 I: U0 a* x0 U
# m9 T9 h, d z1 t# e
[root@iZh4ntc7dmrvkzZ zxw]# docker logs -f --tail 100 965abb1fb546" R7 h% p, W$ v7 d' A5 u" |
28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux
1 R# M: B; I( I6 F9 F28-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
" F# c6 \$ U+ j$ u5 W, Z" m- i7 B28-May-2020 11:16:56.191 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64: M; `. N* z% {8 ?+ w: V9 U
1: G* o( {$ o2 v( `
2 C* v' j/ k! A4 M" i2 `+ `% O
3
) K1 T) _4 |+ j1 w+ _4 b" T+ p! d可以看到打印的日志已经和当前时间相同了。& A7 b, \ \* \. K
, `4 I1 N) C6 E$ N# F五、说明
3 E9 M+ A3 a* j' r' V! N: j$ i5 V& }" x4 v2 `
为什么时区时间是少了8个小时,但是数据库的时间却比设置的时间多了8个小时?& a. p1 L0 n2 R- B5 q# L
是因为数据库设置了操作时间为上海时间(Shanghai),所以插入的时候会自动在当前时间➕8个小时,指定的0点本来是指定的上海时间的0点,但是时区不对(执行的时候始终是0点),就是在另一个时区的零点执行的,另一个时区的零点其实就是 Shanghai 时间的八点中,所以数据库的时间是 Shanghai 时间的8点钟执行的,说白了就是时区把0点延后了8小时,但是保存到数据库是 Shanghai 时间,于是就➕了八个小时,有点小饶,但是想清楚了就完全能理解了。
4 x# T; Z% D8 S, K; v( v3 d. A. N
* h6 x8 R4 e- y( T六、参考
% H9 b1 C, Z" P+ {! \- r6 l0 j8 f! J" _
7 l5 }, r2 G) x参考文章+ B$ k0 Q H9 \8 e" d8 ?5 J) J& U
& a( I- r8 l- h: O7 d总结$ z8 i8 w, o4 U2 n$ @9 O6 f4 z d
0 L) X6 b7 b6 T8 {: }, M时区问题经常遇到,修改的地方也不尽相同,所以记录在此,下次遇到了能快速解决问题;这也只是其中一种修改 docker 容器的时区方法,还有其它的比如,启动的时候挂载宿主机的时区等,这里不再说明,网上也有很多资料,以后有遇到再记录。
5 |, x; B2 N5 F h) Z: e4 U' |, ~# N————————————————
; {. P/ i: e) Q1 p版权声明:本文为CSDN博主「忧郁的白衬衫丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 ^5 a$ M* s! Y4 E0 J- |
原文链接:https://blog.csdn.net/weixin_42816285/article/details/106403093
: u$ B% c& w" t6 ^. l$ Q3 g2 {
$ \& e2 ?+ G) e3 y2 K" U, }( Z
8 E" p7 Y4 m9 O4 Z6 o$ F |
zan
|