Будет ли время автоматической синхронизации контейнера докеров с хост-машиной?


108

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

Ответы:


103

Если вы используете OSX и запускаете boot2docker, см. Эту проблему: https://github.com/boot2docker/boot2docker/issues/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 покончено с VirtualBox и Docker Machine. Последние сборки докера (в настоящее время 1.12.1-beta25 (сборка: 11807)), похоже, имеют возможность определять, когда произошел разрыв во времени, и соответствующим образом корректировать. Таким образом, это больше не должно быть проблемой ... ура !!


Спасибо, добрый сэр!
seanmcl

Огромное спасибо. Это было единственное, что сработало.
Марк Бао

1
См. Предполагаемое исправление / смягчение последствий: github.com/boot2docker/boot2docker/pull/661
Макс Гаснер,

7
Обратите внимание, что для Docker для бета-версии OSX перезапуск контейнера не помог мне, и я не смог его воссоздать. Вместо этого мне пришлось перезапустить сам Docker (с помощью значка в строке меню).
Pol

На основе этого ответа я написал инструмент CLI для синхронизации времени на виртуальных машинах докер-машин каждые 5 минут. Работает на моих OSX El Capitan и Windows 7 Pro
папы

50

https://github.com/sameersbn/docker-gitlab/issues/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
Я не знаю, был ли исходный вопрос больше о часовых поясах (например, убедиться, что контейнер будет учитывать изменения летнего времени и часового пояса) или точном времени (например, убедиться, что часы контейнера не будут дрейфовать). Если речь идет о часовых поясах, этот ответ идеален. Если речь идет о дрейфе часов, вам не о чем беспокоиться: часы контейнера такие же, как часы хоста (за исключением того, что контейнер не может их изменить, кроме случаев, когда он работает в --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 по умолчанию может монтировать только подкаталоги в / Users
menghan,

27

В Docker для Mac OS X Beta я испытал значительный дрейф виртуальной машины, основанной на 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 для Mac», но, похоже, оно было удалено. Мне посчастливилось показать это на Dockercon 2016. Похоже, Docker пытается полностью исключить виртуальную машину из опыта, что объясняет, почему она больше не документирована.


3
Это должен быть недавно принятый ответ для людей, использующих новые RC без прерывистой док-машины
Blizz

2

Текущее решение для смещения времени osx на докере (апрель 2018 г.):

У меня есть Mac на сервере NTP, но этот фиксированный дрейф часов с контейнерами:

С https://docs.docker.com/docker-for-mac/troubleshoot/#known-issues :

Если ваша система не имеет доступа к серверу 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.