Docker容器会自动与其宿主机同步时间吗?

117

我是否需要在 Docker 容器内部设置 NTP 服务器来定期同步时间,或者容器是否会重新与其主机同步时间?Docker 容器的时区已经正确设置。

7个回答

104

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

由于boot2docker主机在您的操作系统睡眠时时间会漂移,时间同步成为一个问题。通过使用-v /etc/localtime:/etc/localtime:ro选项来运行容器无法解决与您的Docker容器的时间同步问题。

所以,目前你需要定期在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'

针对新版Docker for OSX的用户更新

新版Docker Beta取消了VirtualBox和Docker Machine。最新版本的docker(目前为1.12.1-beta25(build:11807))似乎有能力检测时间不连续的情况并进行相应的调整。因此,这个问题现在不再是个问题了...太好了!


非常感谢。这是唯一有效的方法。 - Mark Bao
1
请查看所谓的修复/缓解措施:https://github.com/boot2docker/boot2docker/pull/661 - Max Gasner
7
请注意,对于Docker for OSX Beta版本,重新启动容器对我没有起作用,重新创建容器也不行。相反,我必须重启Docker本身(从菜单栏图标中)。 - Pol
我根据这个答案编写了一个CLI工具,用于每5分钟同步docker-machine虚拟机上的时间。在我的OSX El Capitan和Windows 7 Pro上运行良好。(请注意,链接已经直接翻译为“http://github.com/dikarel/docker-machine-timesync”而不是在中文环境下显示该链接) - dadads

54

3
选项2对我有用。实际上,我喜欢它比其他选项更明确。 - Ryan Walls
谢谢,选项2对我也起作用了。使用选项1时,我的Mac会出现错误,因为我没有etc/localtime文件夹。 - Zergleb

53

最简单的解决方案似乎是使用-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

30
我不知道原问题更多地是关于时区(例如确保容器遵守DST和时区变化)还是准确的时间保持(例如确保容器时钟不会漂移)。如果是关于时区,那个回答很完美。如果是关于时钟漂移的话,你不用担心:容器的时钟与主机的时钟相同(除了容器不能改变它之外,除非在“--privileged”模式下运行)。 - jpetazzo
@jpetazzo同意;我应该在我的MWE中包含对主机上的date的调用,否则容器从主机获取时间可能不太清楚。 - shabbychef
1
setup mount namespace mounting /etc/localtime into /mnt/sda1/var/lib/docker/aufs/mnt/.../etc/localtime not a directory - Brian Tingle
这似乎在OSX上的docker 1.3上无法工作。与Brian Tingle相同的错误。 - esilver
1
@esilver 默认情况下,boot2docker 只能挂载 /Users 目录下的子目录。 - menghan

28

在Mac OS X Beta版本的Docker中,我发现基于Alpine Linux的虚拟机时钟存在显著的漂移。根据Alpine Linux FAQ,您可以使用以下命令将虚拟机的时钟进行同步。

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

然而,要在虚拟机上获得终端访问权限是另一个问题,如果您使用 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故障排除文档中记录下来,但现在似乎已经被删除了。我在2016年的Dockercon上有幸看到了它。看起来Docker正在尝试完全抽象出虚拟机体验,这就解释了为什么不再有文件记录。


3
对于使用新RC版本而没有间歇式docker-machine的用户来说,这应该是最新被接受的答案。 - Blizz

3

解决方案(截至2018年4月):

我将我的Mac连接到了一个NTP服务器,但这并不能修复容器中的时钟漂移问题:

根据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

2

docker-compose使用方法:

volumes属性中添加/etc/localtime:/etc/localtime:ro

请查看此链接以演示示例。


1
如果您更喜欢使用TZ解决方案,那么尽管您请求自己的时区(目前是11:09 CDT),您可能会惊讶地看到显示的是UTC时间。
$ docker run --rm -it -e "TZ=America/Chicago" ubuntu date
Mon Oct 26 16:09:04 America 2020

从实验结果看,似乎您需要使用 POSIX TZ 格式:

$ docker run --rm -it -e "TZ=CST6CDT" ubuntu date
Mon Oct 26 11:09:17 CDT 2020

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接