尽管有 NTP,Docker Debian 容器上的时间仍然错误

尽管有 NTP,Docker Debian 容器上的时间仍然错误

我正在创建一个简单的基于 debian 的 docker ( php:7-apache)。要创建它,我使用:

docker run -d -p 80:80 --name myname -v "$PWD":/var/www/html php:7-apache

我注意到我的docker可能患有问题,因此现在,每次我运行容器时,我也会运行:

docker run -it --rm --privileged --pid=host php:7-apache nsenter -t 1 -m -u -n -i date -u $(date -u +%m%d%H%M%Y)

这解决了我的问题。时钟现在正常了。但是,在尝试此操作之前,我只是尝试在 docker 上安装 ntp 并进行设置:

# apt-get install ntp
# vi /etc/ntp.conf # commented pools and added these servers http://www.pool.ntp.org/zone/europe
# /etc/init.d/ntp start
# /usr/bin/ntpq -p    
remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
v.bsod.fr       193.190.230.66   2 u   24   64    1   32.924  -117284   0.004
tomia.ordimatic 62.210.36.58     3 u   23   64    1   26.158  -117286   0.004
pacifica.ufp.ne 162.23.41.10     2 u   25   64    1   27.922  -117281   0.004
aquila.init7.ne 189.247.1.117    2 u   24   64    1   34.736  -117291   0.004

# date
...WRONG DATE!!!

那么,为什么 ntp 不工作?我认为最好让 NTP 工作,这样如果出现漂移,它们会自动纠正,而不是手动设置主机系统的时钟。

谢谢

编辑:第二次尝试

apt-get install ntp 

# setting time
sed 's/pool /#pool /g' /etc/ntp.conf > /tmp/ntp.conf.tmp
echo "server 0.europe.pool.ntp.org" >> /tmp/ntp.conf.tmp
echo "server 1.europe.pool.ntp.org" >> /tmp/ntp.conf.tmp
echo "server 2.europe.pool.ntp.org" >> /tmp/ntp.conf.tmp
echo "server 3.europe.pool.ntp.org" >> /tmp/ntp.conf.tmp
mv /tmp/ntp.conf.tmp /etc/ntp.conf
ntpd -qxg | grep "ntpd:"
/etc/init.d/ntp start
echo "Date on ws container: `date` - correct: `(curl time.correct.com?iso)2>/dev/null`"

给我:

13 Apr 11:40:47 ntpd[922]: ntpd: time slew +14.502687 s
ntpd: time slew +14.502687s
[ ok ] Starting NTP server: ntpd.
Date on ws container: Fri Apr 13 11:40:47 UTC 2018 - correct: 2018-04-13T11:41:02Z

因此,尽管尝试使用 ntpd 手动设置时间(ntpdate 已被弃用,因为http://doc.ntp.org/4.1.0/ntpd.htm),并且确实发现我落后了 14 秒,容器没有设置时间。 对我的错误有什么想法吗? 上面的脚本是使用docker exec(带或不带 --privilege 都没有区别) 运行的。

完整输出ntpd -qxg如下:

13 Apr 12:52:43 ntpd[922]: ntpd [email protected] Sun Feb 25 21:22:55 UTC 2018 (1): Starting
13 Apr 12:52:43 ntpd[922]: Command line: ntpd -qxg
13 Apr 12:52:43 ntpd[922]: proto: precision = 3.398 usec (-18)
13 Apr 12:52:43 ntpd[922]: Listen and drop on 0 v6wildcard [::]:123
13 Apr 12:52:43 ntpd[922]: Listen and drop on 1 v4wildcard 0.0.0.0:123
13 Apr 12:52:43 ntpd[922]: Listen normally on 2 lo 127.0.0.1:123
13 Apr 12:52:43 ntpd[922]: Listen normally on 3 eth0 172.17.0.3:123
13 Apr 12:52:43 ntpd[922]: Listening on routing socket on fd #21 for interface updates
13 Apr 12:52:50 ntpd[922]: ntpd: time slew -2.923397 s
ntpd: time slew -2.923397s

编辑2:找到了解决方案!

解决方案如下。@kubanczyk 的回答是正确的,但在 Docker 的具体细节中,我们需要超级支持手动时间更新:

# apt-get install ntp
# nsenter -t 1 -m -u -n -i ntpd -qxg
# /etc/init.d/ntp start

答案1

偏移ntpq量以毫秒为单位,例如offset -117291转换为大约 117 秒的差异。

UDP 连接正确。如果不正确,则不会获得偏移量。

保守ntpd地拒绝设置时钟。通常,它只能通过稍微减慢/加快时钟来工作。(并且当时间偏移大于 1000 秒时,它会完全忽略源)。

您需要停下来ntpd并跑起来ntpdate设置时钟。现在重新开始。偏移量会更小,因此同步速度会更快。当显示如下内容ntpd时,时间就会精确同步:ntpq*

# ntpq -pn
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*10.0.21.44      10.0.21.1        6 u  370 1024  377    1.570   -0.926   6.177
+10.0.21.46      10.0.21.1        6 u  246 1024  377    2.616    2.904   6.750
-10.0.21.45      192.168.1.1      6 u  391 1024  377    1.620   13.230   9.495
+10.0.21.47      192.168.1.1      6 u  327 1024  377    2.463    2.994  11.56
-10.0.192.50     10.0.21.44       7 u  213 1024  377    0.357   -5.926  11.969

相关内容