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 容器会自动与其主机同步时间吗?的主要内容,如果未能解决你的问题,请参考以下文章