摘要

在日常的开发中,我们常常涉及多台linux机器和多个docker容器的。在这样的环境下可能存在的是linux机器之间时间不统一,linux主机与docker容器的时间不一致情况。博文介绍linux 下时间同步问题的解决方法。

一、多台linux机器时间同步问题

Linux自带了ntp服务 -- /etc/init.d/ntpd,这个服务不仅可以设置让本机和某台/某些机器做时间同步,他本身还可以扮演一个time server的角色,让其他机器和他同步时间。如果没有那就使用的安装ntp:

linux  : apt-get install ntp

centos : yum install ntpdate

为了测试,设置让node2 -- 192.168.1.102和node1 -- 192.168.1.101做时间同步。

1.1 node1机器的时间调准

[root@node1 ~]date --set "01/23/2011 10:49"

[root@node1 ~]clock -w

[root@node1 ~]hwclock --systohc

后两个命令是把设置的时间写到硬件时间中去(也就是CMOS里面的时间)。

1.2 将node1配置成一个time server

然后将node1配置成一个time server,修改/etc/ntp.conf

[root@node1 ~]vi /etc/ntp.conf

其他的配置不怎么需要改,只需要关注restrict的配置:

1. 注释掉原来的restrict default ignore这一行,这一行本身是不响应任何的ntp更新请求,其实也就是禁用了本机的ntp server的功能,所以需要注释掉。

2. 加入:restrict 192.168.1.0 mask 255.255.255.0 -- 让192.168.1.0/24网段上的机器能和本机做时间同步

3. 这样就可以了,记得下面的:

server 127.127.1.0 # local clock

fudge 127.127.1.0 stratum 10

这两行需要,这是让本机的ntpd和本地硬件时间同步。

当然,我们也可以添加server xxx.xxx.xxx.xxx,让他和其他的time server时间同步。

4. /etc/init.d/ntpd restart

5. chkconfig ntpd on

6. 修改iptables配置,将tcp和udp 123端口开放,这是ntp需要的端口,在/etc/services中可以查到这个端口。

1.3 配置node2这台机器

这样node1就成为一台time server了,现在我们配置node2这台机器,也是修改/etc/ntp.conf ,

[root@node2 ~]vi /etc/ntp.conf

1. restrict default ignore这行保留为注释状态,因为sales不需要做time server

2. 注释掉server 127.127.1.0, fudge 127.127.1.0 stratum 10这两行,因为这台机器不需要和本地硬件时钟同步了。

3. 加入server 192.168.1.101这行,和node1机器同步。

这样就OK了。看看时间,已经和node1同步了。往后默认配置好像是5分钟和time server同步一次。ntpdate命令是显式的和某台机器做时间同步,以前将ntpdate放到crontab中定期同步也是可以的,但是既然ntpd本身就可以做这个时间

1.4 ntpdate放到crontab中定期步

[root@node2 ~]#vi ntpupdate.sh

/usr/sbin/ntpdate 192.168.1.101

[root@node2 ~]#chmod 755 ntpupdate.sh

[root@node2 ~]#crontab -e

*/1 * * * * /root/ntpupdate.sh

[root@node2 ~]#/etc/init.d/crond restart

二、dcoekr与主机时间同步问题

使用docker部署ntp服务_linux

2.1 命令直接设置

docker run -d <容器> -e TZ="Asia/Shanghai"

2.2 运行容器时,加上挂载参数

docker run -d <容器> -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime

2.3 使用拷贝命令

docker cp /etc/localtime [容器ID或者NAME]:/etc/localtime

2.4 修改dockerfile 来修改

通过dockerfile修改docker镜像时区, Dockerfile只需添加以下两行:

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

2.5 修改已运行容器的时区

第一步:进入需要更改时区的容器

docker exec -it <容器> /bin/bash

第二步:将宿主机的时区链接到容器里

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

如果本地时区不正确,可以本地的时区:

echo "Asia/Shanghai" > /etc/timezone

第三步:退出并重启容器

exec

docker restart <容器>

博文参考