解决 Docker容器时间与主机时间不一致的问题 的三个方法

本文介绍了当Docker容器时间与主机时间不一致时的三种解决方法:1) 创建容器时挂载主机的localtime;2) 复制主机的localtime到容器;3) 创建自定义Dockerfile设置时区。对于容器内运行的服务如mysql,可能需要重启服务以使时间更新生效。

查看主机时间

[root@localhost ~]# date
2016年 07月 27日 星期三 22:42:44 CST
查看容器时间

root@b43340ecf5ef:/# date                                                                                                                                                                                                                                                    
Wed Jul 27 14:43:31 UTC 2016
可以发现,他们相隔了8小时。

CST应该是指(China Shanghai Time,东八区时间)
UTC应该是指(Coordinated Universal Time,标准时间)
所以,这2个时间实际上应该相差8个小时。

所以,必须统一两者的时区。

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

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

复制主机的localtime
docker cp /etc/localtime:【容器ID或者NAME】/etc/localtime

在完成后,再通过date命令进行查看当前时间。
但是,在容器中运行的程序的时间不一定能更新过来,比如在容器运行的mysql服务,在更新时间后,通过sql查看mysql的时间

select now() from dual;

 

先查看当前系统时间

root@ubuntu:/# date -R   
结果时区是:-0500
我需要的是东八区,这儿显示不是,所以需要设置一个时区

1.运行tzselect

root@ubuntu:/# tzselect


在这里我们选择亚洲 Asia,确认之后选择中国(China),最后选择北京(Beijing)

2.复制文件到/etc目录下

root@ubuntu:/# cp /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime

### 如果报错 cp: failed to access '/etc/localtime': Too many levels of symbolic links 
     cat  /etc/localtime   先rm 再cp
3.再次查看时间date -R,已经修改为北京时间


docker cp /etc/localtime  containerName:/etc/localtime

docker cp /usr/share/zoneinfo/Asia/Shanghai containername:/usr/share/zoneinfo/Asia/Shanghai
#  没有Error: No such container:path: beautiful_fermat:/usr/share/zoneinfo/Asia

docker exec -it containername bash  mkdir  /usr/share/zoneinfo/Asia


改时间
修改时间

sudo date -s MM/DD/YY //修改日期
sudo date -s hh:mm:ss //修改时间
在修改时间以后,修改硬件CMOS的时间

sudo hwclock --systohc //非常重要,如果没有这一步的话,后面时间还是不准
 



可以发现,时间并没有更改过来。
这时候必须要重启mysql服务或者重启docker容器,mysql才能读取到更改过后的时间。

创建自定义的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命令生成镜像使用即可。

原文链接:https://blog.csdn.net/xinluke/article/details/52050371

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值