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

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

6 ответов

Если вы работаете в 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. Последние сборки Docker (в настоящее время 1.12.1-бета25 (сборка: 11807)), похоже, способны обнаруживать разрыв во времени и соответственно корректироваться. Таким образом, это больше не должно быть проблемой... ура!!

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

Смотрите ответ Sameersbn.

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

Самым простым решением, по-видимому, является запуск вашего контейнера с -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

В Docker для Mac OS X Beta я испытал значительный дрейф на виртуальной машине, которая основана на Alpine Linux. Из FAQ по Alpine Linux вы можете синхронизировать часы виртуальной машины с помощью следующей команды.

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 пытается полностью абстрагировать виртуальную машину от опыта, что объясняет, почему она больше не документирована.

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

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

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

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

использование docker-compose:

добавлять /etc/localtime:/etc/localtime:ro к volumes приписывать.

Посмотрите на эту ссылку, чтобы продемонстрировать пример.

Если вы предпочитаете TZ Тогда вы можете быть удивлены, увидев время в формате UTC, несмотря на ваш запрос о вашем часовом поясе (сейчас 11:09 CDT):

$ docker run --rm -it -e "TZ=America/Chicago" ubuntu date
Mon Oct 26 16:09:04 America 2020

Экспериментально кажется, что вам нужен POSIX TZ формат:

$ docker run --rm -it -e "TZ=CST6CDT" ubuntu date
Mon Oct 26 11:09:17 CDT 2020
Другие вопросы по тегам