如何确保docker的时间与主机的时间同步?

我有docker在Linode服务器上运行。 有时候,我发现docker上的时间不对。 目前,我已经在每个docker中更改了运行脚本,以包含以下代码行。

yum install -y ntp service ntpd stop ntpdate pool.ntp.org 

然而,我理想的做法是docker工人应该与主机同步。 有没有办法做到这一点?

这个答案的来源是在以下答案的评论: docker容器自动同步主机的时间?

在看了答案之后,我意识到docker集装箱上不会出现时钟漂移。 容器使用与主机相同的时钟,但容器不能更改它。 这意味着在ntpdate里面做一个ntpdate是毫无意义的。

因此,主机本身的ntpdate是必需的,而不是容器。

就同​​步时区而言, -v /etc/localtime:/etc/localtime:ro起作用。

如果您正在使用boot2docker,并且ntp docker虚拟机内无法工作 (您位于不转发ntp数据包的代理的后面),但是主机是时间同步的,则可以从主机运行以下命令:

 docker-machine ssh default "sudo date -u $(date -u +%m%d%H%M%Y)" 

通过这种方式,您可以将当前时间(以UTC时区为单位)作为string发送,以便使用date (UTC时区中的时间)设置docker VM时间。

注意:在Windows中,在bash shell(来自msys git)中,使用:

 docker-machine.exe ssh default "sudo date -u $(date -u +%m%d%H%M%Y)" 

这对Fedora 20主机来说是很有用的。 我运行一个容器使用:

 docker run -v /etc/localtime:/etc/localtime:ro -i -t mattdm/fedora /bin/bash 

最初/etc/localtime是印度标准时间的软链接/usr/share/zoneinfo/Asia/Kolkata 。 在容器内部执行date显示了与主机上相同的时间。 我退出了shell并使用docker stop <container-id>停止了容器。

接下来,我删除了这个文件,并将其链接到/usr/share/zoneinfo/Singapore进行testing。 主机时间设置为新加坡时区。 然后docker start <container-id> 。 然后用nsenter再次访问它的shell,发现时间现在被设置为新加坡时区。

 docker start <container-id> docker inspect -f {{.State.Pid}} <container-id> nsenter -m -u -i -n -p -t <PID> /bin/bash 

所以这里的关键是在第一次运行容器时使用-v /etc/localtime:/etc/localtime:ro 。 我在这个链接上find了它。

希望能帮助到你。

如果您使用docker机,虚拟机可能会漂移。 要在不重新启动运行的情况下更新虚拟机上的时钟:

 docker-machine ssh <machine-name|default> sudo ntpclient -s -h pool.ntp.org 

这将使用NTP更新虚拟机上的时钟,然后所有启动的容器将具有正确的date。

如果你使用的是Docker Machine,那么它可能会随着时间的推移而出现,正如这个回应所示: https : //stackoverflow.com/a/26454059/105562 ,由于VirtualBox的缘故。

快速简单的修复就是重新启动虚拟机:

 docker-machine restart default 

您可以将您的本地文件(/ etc / timezone和/ etc / localtime)作为卷添加到您的docker-container中。

用下面的行更新你docker-compose.yml

 volumes: - "/etc/timezone:/etc/timezone:ro" - "/etc/localtime:/etc/localtime:ro" 

现在容器的时间和你的主机一样

用docker的窗户,我不得不打勾

 MobyLinuxVM > Settings > Integration Services > Time synchronization 

在Hyper-Vpipe理器中,它工作

对于macOS上的docker,您可以使用docker-time-sync-agent 。 这个对我有用。

我正面临着-1小时和4分钟的时间偏移

重启Docker本身为我解决了这个问题。

一般设置时区:

  1. ssh进入你的容器: docker exec -it my_website_name bash

  2. 运行dpkg-reconfigure tzdata

  3. 运行date

我在撰写文件中有以下内容

 volumes: - "/etc/timezone:/etc/timezone:ro" - "/etc/localtime:/etc/localtime:ro" 

然后,Gerrit docker中的replication_log设置为正确的时间戳。 😀