问题描述:
在我们平时使用docker,运行我们的应用的时候,访问应用页面的时间与现在相差8个小时

无法结合时间点去判断当时服务的异常

同样,当我们在docker上运行某些服务时,需要时间与宿主机同步,否则会发生异常

原因:
宿主机设置了时区,而Docker容器并没有设置,导致两者相差8小时

解决办法:
为了保证容器和宿主机之间的时间同步:

可以使用以下几种办法:

1.Docker run

使用docker run运行容器时,添加如下参数

-v /etc/localtime:/etc/localtime:ro
验证:

[root@uat-app01 ~]# date   #当前宿主机时间
Tue Jul 10 11:18:41 CST 2018
[root@uat-app01 ~]# docker run -it -v /etc/localtime:/etc/localtime:ro centos  #运行docker,添加我们的参数
[root@df22a5da9c77 /]# date    #当前容器时间
Tue Jul 10 11:18:47 CST 2018

2.DockerFile

在Docker File中添加如下参数:

将时区配置添加到环境变量,并使用软连接,并将时区配置文件覆盖

ENV TimeZone=Asia/Shanghai   
RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone   

实例DockerFile如下:

FROM centos   # Centos 基础镜像
MAINTAINER louisvv<648555416@qq.com>
ENV TimeZone=Asia/Shanghai    #添加时区环境变量,亚洲,上海
RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone   #使用软连接,并且将时区配置覆盖/etc/timezone

构建镜像

docker build -t centos:time .
验证:

[root@uat-app01 ~]# date   #当前宿主机时间
Tue Jul 10 11:08:39 CST 2018
[root@uat-app01 ~]# docker run -it centos:time /bin/bash  #启动刚构建的 centos:time 镜像
[root@f35e963f9e8b /]# date  #容器时间
Tue Jul 10 11:08:44 CST 2018

正在运行的容器,时间如何同步?

有些同学看到这里,不禁会问,如果是一个正在运行的docker容器,如何同步时间呢?

这种方式同样适用于,构造镜像完成后,时间不同步的状况

在宿主机执行命令如下:
docker cp -L /usr/share/zoneinfo/Asia/Shanghai 【容器名】:/etc/localtime
验证:

当前宿主机时间如下:

[root@uat-app01 ~]# date
Tue Jul 10 11:27:01 CST 2018

启动一个docker容器

[root@uat-app01 ~]# docker run -itd  centos
fe51fba60df5c2425991aab0922c7318d2c3cf2c27b817632765ed24e7486ce6

进入该容器查看时间,发现与现在相差8个小时,退出exec

[root@uat-app01 ~]# docker exec -it fe51 /bin/bash
[root@fe51fba60df5 /]# date
Tue Jul 10 03:27:11 UTC 2018
[root@fe51fba60df5 /]# exit
exit

在宿主机,执行我们提供的命令,将容器名改为对应的即可
[root@uat-app01 ~]# docker cp -L /usr/share/zoneinfo/Asia/Shanghai fe51:/etc/localtime
再次进入容器查看时间,发现时间同步过来了

[root@uat-app01 ~]# docker exec -it fe51 /bin/bash
[root@fe51fba60df5 /]# date
Tue Jul 10 11:27:17 CST 2018

参考http://www.louisvv.com/archives/1716.html