我是否需要在 Docker 容器内部设置 NTP 服务器来定期同步时间,或者容器是否会重新与其主机同步时间?Docker 容器的时区已经正确设置。
如果您在运行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))似乎有能力检测时间不连续的情况并进行相应的调整。因此,这个问题现在不再是个问题了...太好了!
https://github.com/sameersbn/docker-gitlab/issues/77
请查看sameersbn的回答。
option 1: -v /etc/localtime:/etc/localtime:ro
option 2: -e "TZ=Asia/Shanghai"
最简单的解决方案似乎是使用-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
date
的调用,否则容器从主机获取时间可能不太清楚。 - shabbychefsetup mount namespace mounting /etc/localtime into /mnt/sda1/var/lib/docker/aufs/mnt/.../etc/localtime not a directory
- Brian Tingle在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正在尝试完全抽象出虚拟机体验,这就解释了为什么不再有文件记录。
解决方案(截至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
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