QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5541|回复: 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 中时区和宿主机相隔八个小时的解决方案之一' @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
    转播转播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, 2025-6-24 21:31 , Processed in 0.416027 second(s), 55 queries .

    回顶部