我正在创建一个简单的基于 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