zoukankan      html  css  js  c++  java
  • 关于docker下容器和宿主机器时间不一致问题

    1.1 背景

    在前几天,在阿里云的ECS上部署一个docker应用时,写了一个定时同步任务,发现任务未正常的同步数据,仔细观察了一下,发现是对应的任务是有跑,但是跑的时间不对,后来仔细核对了一下数据,发现有些猫腻,数据时间对应不上,仔细观察了一下,发现还真是差了8个小时。

    Docker容器时间与主机时间不一致

    通过date命令查看时间

    查看主机时间

    [root@izuf6gb2498ykvhcb4np5pz ~]# date
    Sun Jul 15 15:30:41 CST 2018

    查看容器时间

    进入容器
    
    root@b43340ecf5ef: docker exec -it 容器名称 /bin/bash
    root@b43340ecf5ef:/#date 
    Sun Jul 15 15:31:10 UTC 2018

    可以发现,他们相隔了8小时。

    • CST应该是指(China Shanghai Time,东八区时间)
    • UTC应该是指(Coordinated Universal Time,标准时间)

    所以,只需要容器时区和宿主一致即可。

    共享主机的localtime (方法一)

    创建容器的时候指定启动参数,挂载localtime文件到容器内 ,保证两者所采用的时区是一致的。

    docker run --name <name> -v /etc/localtime:/etc/localtime:ro
    

    复制主机的localtime (方法二)

    docker cp /etc/localtime:【容器ID或者NAME】/etc/localtime

    在完成后,再通过date命令进行查看当前时间。

    创建自定义的dockerfile (方法三)

    创建dockerfile文件,其实没有什么内容,就是自定义了该镜像的时间格式及时区。

    FROM redis
    FROM tomcat
    ENV CATALINA_HOME /usr/local/tomcat
    #设置时区
    RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
      && echo 'Asia/Shanghai' >/etc/timezone 
    

      

    保存后,利用docker build命令生成镜像使用即可。

    Docker容器时间与tomcat时间不一致

    在容器和宿主一致后,在满怀欣喜的重启容器后,发现最后时间还是不对。。发现tomcat输出的日志还是不一致的,这人生就很尴尬了。。

    在tomcat/bin/catalina.sh文件中修改tomcat JAVA_OPTS,添加如下内容

    JAVA_OPTS="$JAVA_OPTS -Duser.timezone=GMT+08"

    自此,问题解决。访问第三方应用也一切正常了,它真的是莫名躺枪了。哈哈哈

  • 相关阅读:
    [React]核心概念
    [算法]复杂度分析
    [算法]移除指定元素&strSr()的实现
    [算法]合并链表&删除数组重复项
    php _weakup()反序列化漏洞
    Java 注解详解
    MyBatis入门
    Spring 事务管理
    Spring AOP
    Spring JDBC
  • 原文地址:https://www.cnblogs.com/antonyhubei/p/13589020.html
Copyright © 2011-2022 走看看