如何确保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本身为我解决了这个问题。
一般设置时区:
-
ssh进入你的容器:
docker exec -it my_website_name bash
-
运行
dpkg-reconfigure tzdata
- 运行
date
我在撰写文件中有以下内容
volumes: - "/etc/timezone:/etc/timezone:ro" - "/etc/localtime:/etc/localtime:ro"
然后,Gerrit docker中的replication_log设置为正确的时间戳。 😀