docker容器会自动与主机同步时间吗?


108

鉴于我已经正确更改了Docker容器的时区。我是否需要在docker容器内安装NTP服务器以定期同步时间,否则容器将从其主机同步时间?

Answers:


103

如果您在运行boot2docker的OSX上,请参见以下问题:https : //github.com/boot2docker/boot2docker/issues/290

时间同步成为一个问题,因为boot2docker主机在OS睡眠时会发生时间漂移。与docker容器的时间同步无法通过使用以下命令运行容器来解决-v /etc/localtime:/etc/localtime:ro

相反,现在,您必须定期在OSX上运行此命令:

/usr/local/bin/boot2docker ssh sudo ntpclient -s -h pool.ntp.org

Kitematic用户的更新

如果您正在运行Kitematic,这是现在建议的在OSX中的Docker上启动和运行的机制,则必须定期运行以下命令:

docker-machine ssh default 'sudo ntpclient -s -h pool.ntp.org'

或者,对于较旧版本的Docker

docker-machine ssh dev 'sudo ntpclient -s -h pool.ntp.org'

适用于OSX的新本机Docker用户的更新

新的Docker Beta不再使用VirtualBox和Docker Machine。最新版本的docker(当前为1.12.1-beta25(内部版本:11807))似乎具有检测时间不连续性并进行相应调整的能力。因此,这不再是问题...万岁!


谢谢你,先生!
seanmcl 2014年

非常感谢。这是唯一有效的方法。
Mark Ba​​o

1
请参阅声称的修复/缓解措施:github.com/boot2docker/boot2docker/pull/661
Max Gasner 2015年

7
请注意,对于OSX Beta的Docker,重新启动容器对我没有用,也没有重新创建容器。相反,我不得不重启Docker本身(从菜单栏图标)。
波尔

我根据此答案编写了一个CLI工具,用于每5分钟同步docker-machine VM上的时间。可在我的OSX El Capitan和Windows 7 Pro上运行
dadad


46

最简单的解决方案似乎是使用该-v /etc/localtime:/etc/localtime:ro选项运行容器。从而:

#run without tz info:
docker run --rm -t -i ubuntu date
Wed Apr  2 18:40:07 UTC 2014
# run with tz info:
docker run --rm -t -i -v /etc/localtime:/etc/localtime:ro ubuntu date
Wed Apr  2 11:40:29 PDT 2014

25
我不知道最初的问题是关于时区(例如,确保容器将遵守DST和时区更改)还是精确的计时(例如,确保容器时钟不会漂移)。如果是关于时区的,那答案是完美的。如果是关于时钟漂移的,则不必担心:容器的时钟与主机的时钟相同(除了容器无法更改,除非容器在--privileged模式下运行)。
jpetazzo 2014年

@jpetazzo同意;我应该date在MWE中包含对主机的调用,因为否则可能不清楚容器是否从主机获取时间。
shabbychef 2014年

1
setup mount namespace mounting /etc/localtime into /mnt/sda1/var/lib/docker/aufs/mnt/.../etc/localtime not a directory
Brian Tingle 2014年

对于OSX上的docker 1.3,这似乎不起作用。与Brian Tingle相同的错误。
esilver 2014年

1
@esilver boot2docker默认只能在/ Users下挂载子目录
menghan 2014年

27

在Mac OS X Beta版Docker上,我在基于Alpine Linux的VM上经历了重大漂移。从Alpine Linux FAQ中,您可以使用以下命令同步VM的时钟。

ntpd -d -q -n -p pool.ntp.org

但是,要访问VM上的终端是另一个问题,如果使用screen命令,可以完成此操作。

screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty

该路径是一个符号链接,在我的系统上指向/dev/ttys003

进入后,请注意moby login只是root没有密码。完成后,CTRL-A,D将与屏幕会话断开连接。

注意:这曾经在Docker for Mac疑难解答中有记录,但似乎已被删除。我很幸运在Dockercon 2016上展示了它。看来Docker试图将VM完全从经验中抽象出来,这解释了为什么不再对其进行记录。


3
对于使用没有间歇式docker-machine的新RC的人们来说,这应该是新近接受的答案
Blizz

2

Docker上OSX时间漂移的当前解决方案(2018年4月):

我的确在NTP服务器上安装了mac,但是此固定时钟随容器漂移:

https://docs.docker.com/docker-for-mac/troubleshoot/#known-issues

如果您的系统无法访问NTP服务器,则在休眠后,Docker for Mac看到的时间可能与主机不同步。此外,在使用过程中,时间可能会缓慢地偏离同步。要在休眠后手动重置时间,请运行:

docker run --rm --privileged alpine hwclock -s

或者,要解决这两个问题,可以将本地时钟添加为主机的低优先级(高层次)后备NTP时间源。为此,请编辑主机的/etc/ntp-restrict.conf以添加:

server 127.127.1.1              # LCL, local clock
fudge  127.127.1.1 stratum 12   # increase stratum

然后使用以下命令重新启动NTP服务:

sudo launchctl unload /System/Library/LaunchDaemons/org.ntp.ntpd.plist
sudo launchctl load /System/Library/LaunchDaemons/org.ntp.ntpd.plist

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.