QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5845|回复: 1
打印 上一主题 下一主题

Docker 中时区和宿主机相隔八个小时的解决方案之一

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-5-30 15:21 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    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
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    0

    主题

    1

    听众

    6

    积分

    升级  1.05%

    该用户从未签到

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-18 20:12 , Processed in 0.342150 second(s), 56 queries .

    回顶部