Назад | Перейти на главную страницу

Неправильное время в контейнере Debian Docker, несмотря на NTP

Я создаю простой докер на основе Debian (php:7-apache). Для его создания я использую:

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

Я заметил, что мой докер, возможно, страдает от этот проблема, поэтому теперь каждый раз, когда я запускаю контейнер, я также запускаю:

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)

Это устранило мою проблему. Часы теперь в порядке. Однако, прежде чем попробовать это, я просто попытался установить 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 4.2.8p10@1.3728-o 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

EDIT2: найдено решение!

Решение следует. Ответ @kubanczyk правильный, но в специфике Docker нам нужно усилить ручное обновление времени:

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

В 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