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

Posted

技术标签:

【中文标题】docker 容器会自动与其主机同步时间吗?【英文标题】:Will a docker container auto sync time with its host machine? 【发布时间】:2014-05-13 02:19:50 【问题描述】:

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

【问题讨论】:

【参考方案1】:

如果您在 OSX 上运行 boot2docker,请查看此问题: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'

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

新的 Docker Beta 取消了 VirtualBox 和 Docker Machine。 docker 的最新版本(目前为 1.12.1-beta25(build: 11807))似乎能够检测何时出现时间不连续性并进行相应调整。因此,这应该不再是问题......万岁!!

【讨论】:

非常感谢。这是唯一有效的方法。 查看声称的修复/缓解措施:github.com/boot2docker/boot2docker/pull/661 请注意,对于 Docker for OSX Beta,重新启动容器对我不起作用,重新创建容器也不起作用。相反,我不得不重新启动 Docker 本身(从菜单栏图标)。 我根据这个答案写了一个CLI tool,以每 5 分钟同步一次 docker-machine VM 上的时间。适用于我的 OSX El Capitan 和 Windows 7 Pro【参考方案2】:

https://github.com/sameersbn/docker-gitlab/issues/77

查看sameersbn的回答。

option 1: -v /etc/localtime:/etc/localtime:ro
option 2: -e "TZ=Asia/Shanghai"

【讨论】:

选项 2 对我有用。我实际上喜欢这比其他选项更明确。 谢谢选项 2 也对我有用。由于没有 etc/localtime 文件夹,我在 Mac 上使用选项 1 时出现错误。【参考方案3】:

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

【讨论】:

我不知道最初的问题是更多关于时区(例如确保容器将遵守 DST 和时区更改)还是准确的时间保持(例如确保容器时钟不会漂移)。如果是关于时区,那么这个答案是完美的。如果是关于时钟漂移,你不用担心:容器的时钟和宿主机的时钟是一样的(除了容器不能改变它,除非它运行在--privileged模式下)。跨度> @jpetazzo 同意;我应该在我的 MWE 中包含对主机上的 date 的调用,否则可能不清楚容器是否从主机获取时间。 setup mount namespace mounting /etc/localtime into /mnt/sda1/var/lib/docker/aufs/mnt/.../etc/localtime not a directory 这似乎不适用于 OSX 上的 docker 1.3。与 Brian Tingle 相同的错误。 @esilver boot2docker 默认只能挂载/Users下的子目录【参考方案4】:

在 Docker for Mac OS X Beta 上,我在基于 Alpine Linux 的 VM 上经历了明显的偏差。在Alpine Linux FAQ 中,您可以使用以下命令同步虚拟机的时钟。

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 Trouble Shooting,但似乎已被删除。我很幸运在 2016 年 Dockercon 上展示了它。似乎 Docker 试图将虚拟机完全从体验中抽象出来,这就解释了为什么不再记录它。

【讨论】:

对于没有间歇性 docker-machine 的使用新 RC 的人来说,这应该是新接受的答案【参考方案5】:

docker 上 osx 时间漂移的当前解决方案(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

【讨论】:

【参考方案6】:

docker-compose 用法:

/etc/localtime:/etc/localtime:ro 添加到volumes 属性。

看看这个link 来演示一个例子。

【讨论】:

【参考方案7】:

如果您更喜欢 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

【讨论】:

以上是关于docker 容器会自动与其主机同步时间吗?的主要内容,如果未能解决你的问题,请参考以下文章

Docker 容器与主机不同步

Docker容器学习梳理-容器时间跟宿主机时间同步

如何解决Docker容器和宿主机时间同步问题

在 Docker 容器中安装 node_modules 并与主机同步

解决Docker容器时区及时间不同步问题

Docker容器与宿主机时间同步解决方案