Чи автоматично синхронізує докер-контейнер час з хост-машиною?


108

Даючи, я вже правильно змінив часовий пояс контейнера докера. Чи потрібно мені встановлювати сервер NTP всередині контейнера докера, щоб періодично синхронізувати час, або контейнер буде синхронізувати час з його хост-машини?

Відповіді:


103

Якщо ви працюєте на OSX під керуванням boot2docker, перегляньте цю проблему: https://github.com/boot2docker/boot2docker/isissue/290

Синхронізація часу стає проблемою, оскільки хост boot2docker має час руху, поки ваша ОС спить. Час синхронізації з вашим контейнером докера не може бути вирішений, запустивши його-v /etc/localtime:/etc/localtime:ro

Натомість наразі вам доведеться періодично запускати це на OSX:

/usr/local/bin/boot2docker ssh sudo ntpclient -s -h pool.ntp.org

Оновлення для користувачів Kitematic

Якщо ви запускаєте Kitematic , який зараз є запропонованим механізмом для встановлення та запуску на Docker в OSX, вам доведеться періодично запускати цю команду:

docker-machine ssh default 'sudo ntpclient -s -h pool.ntp.org'

Або для старих версій докера

docker-machine ssh dev 'sudo ntpclient -s -h pool.ntp.org'

Оновлення для користувачів нового нативного Docker для OSX

Нова Docker Beta не відповідає VirtualBox та Docker Machine. Останні версії докера (наразі, 1.12.1-beta25 (збірка: 11807)), здається, мають можливість виявляти, коли відбувся перерив часу, та коригувати відповідно. Таким чином, це більше не повинно бути проблемою ... ура!


Дякую, добрий пане!
seanmcl

Дуже дякую. Це було єдине, що спрацювало.
Марк Бао

1
Дивіться, як стверджується, виправлення / пом’якшення: github.com/boot2docker/boot2docker/pull/661
Макс Гаснер

7
Зауважте, що для Docker для OSX Beta перезапуск контейнера не працював і не відтворював його. Натомість мені довелося перезапустити сам Докер (з піктограми меню).
Пол

Я написав інструмент CLI, заснований на цій відповіді, щоб синхронізувати час на VM машин докер-машини кожні 5 хвилин. Працює на моїх OSX El Capitan та Windows 7 Pro
dadads

50

https://github.com/sameersbn/docker-gitlab/isissue/77

Дивіться відповідь sameersbn.

option 1: -v /etc/localtime:/etc/localtime:ro
option 2: -e "TZ=Asia/Shanghai"

2
Варіант 2 працював на мене. Мені справді подобається, що це явніше, ніж інші варіанти.
Райан Уоллс

Дякую, варіант 2 також працював для мене. Я отримую помилку на своєму Mac з варіантом 1, оскільки у мене немає папки etc / localtime.
Zergleb

46

Найпростішим рішенням є запуск контейнера з -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

25
Я не знаю, чи було в первісному питанні більше про часові пояси (наприклад, переконайтеся, що контейнер буде вшановувати зміни DST та часового поясу) або точне збереження часу (наприклад, переконайтесь, що годинник контейнера не переміститься). Якщо мова йде про часові пояси, то ця відповідь ідеальна. Якщо мова йде про переміщення годин, вам не доведеться турбуватися: годинник контейнера такий же, як годинник хоста (за винятком того, що контейнер не може його змінити, за винятком випадків, коли він працює в --privilegedрежимі).
jpetazzo

@jpetazzo погодився; Я повинен був включити виклик dateна хост-машині у свій MWE, оскільки інакше можливо не зрозуміло, що контейнер отримує свій час від хоста.
shabbychef

1
setup mount namespace mounting /etc/localtime into /mnt/sda1/var/lib/docker/aufs/mnt/.../etc/localtime not a directory
Брайан Тінгл

Схоже, це не працює на докер 1.3 в OSX. Та ж помилка, що і Брайан Тінгл.
esilver

1
@esilver boot2docker може монтувати лише підкаталоги під / Користувачі за замовчуванням
menghan

27

На Docker для Mac OS X Beta я відчув суттєвий дрейф VM, який базується на Alpine Linux. З питань FAQ Alpine Linux ви можете синхронізувати годинник VM за допомогою наступної команди.

ntpd -d -q -n -p pool.ntp.org

Однак отримати доступ до терміналу на VM - це ще одне питання, яке можна зробити, якщо використовувати екранну команду.

screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty

Цей шлях - це симпосилання, яке в моїй системі вказує на /dev/ttys003.

Як тільки ви заходите, зауважте, що moby loginце просто rootбез пароля. Після закінчення CTRL-A, D відключиться від екранного сеансу.

ПРИМІТКА. Це раніше було задокументовано на Docker для Mac Trouble Shooting, але це, здається, було знято. Мені пощастило, щоб його показали під час Dockercon 2016. Схоже, Докер намагається повністю абстрагувати ВМ із досвіду, що пояснює, чому це більше не документально підтверджено.


3
Це має бути нещодавно прийнята відповідь для людей, які використовують нові RC без переривчастої докер-машини
Blizz

2

Поточне рішення для дрейфу часу на OSX на докер (квітень 2018):

У мене є Mac на сервері NTP, але це фіксований дрейф годинника з контейнерами:

З https://docs.docker.com/docker-for-mac/troubleshoot/#known-isissue :

Якщо у вашій системі немає доступу до сервера NTP, то після сплячого часу час, який бачив Docker для 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.