Как убедиться, что время докера синхронизируется с временем хоста?
У меня есть докеры, работающие на серверах Linode. Время от времени я вижу, что время не подходит для докеров. В настоящее время я изменил прогон script в каждом докере, чтобы включить следующие строки кода.
yum install -y ntp
service ntpd stop
ntpdate pool.ntp.org
То, что я в идеале хотел бы сделать, заключается в том, что докер должен синхронизировать время с хостом. Есть ли способ сделать это?
Ответы
Ответ 1
Источником этого ответа является комментарий к ответу по адресу: Будет ли контейнер Docker автоматически синхронизировать время с хостом?
Посмотрев на ответ, я понял, что на док-контейнере не будет никакого смещения часов. Докер использует те же часы, что и хост, и докер не может их изменить. Это означает, что выполнение ntpdate
внутри докера не работает.
Правильная вещь, чтобы сделать, это обновить время хоста с помощью ntpdate
Что касается синхронизации часовых -v/etc/localtime: /etc/localtime:ro
, то -v/etc/localtime: /etc/localtime:ro
работает.
Ответ 2
Если вы используете boot2docker, а ntp не работает внутри VM Docker (вы находитесь за прокси-сервером, который не передает пакеты ntp), но ваш хост синхронизирован по времени, вы можете запустить после вашего хоста:
docker-machine ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"
Таким образом, вы отправляете текущее время вашего компьютера (в часовой пояс UTC) в виде строки, чтобы установить время VM в докере, используя date
(снова в часовом поясе UTC).
ПРИМЕЧАНИЕ. В Windows внутри оболочки bash (из msys git) используйте:
docker-machine.exe ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"
Ответ 3
Это то, что сработало для меня с хостом Fedora 20. Я запустил контейнер, используя:
docker run -v /etc/localtime:/etc/localtime:ro -i -t mattdm/fedora /bin/bash
Изначально /etc/localtime
была мягкой ссылкой на /usr/share/zoneinfo/Asia/Kolkata
, в индийском стандартном времени. Выполнение date
внутри контейнера показало мне то же время, что и на хосте. Я вышел из оболочки и остановил контейнер, используя docker stop <container-id>
.
Затем я удалил этот файл и привязал его к /usr/share/zoneinfo/Singapore
для целей тестирования. Время пребывания было установлено в часовом поясе Сингапура. А затем сделал docker start <container-id>
. Затем снова получил доступ к своей оболочке с помощью nsenter
и обнаружил, что время теперь установлено на часовой пояс в Сингапуре.
docker start <container-id>
docker inspect -f {{.State.Pid}} <container-id>
nsenter -m -u -i -n -p -t <PID> /bin/bash
Итак, ключ здесь - использовать -v /etc/localtime:/etc/localtime:ro
при первом запуске контейнера. Я нашел его на этой ссылке.
Надеюсь, что это поможет.
Ответ 4
Вы можете добавить локальные файлы (/etc/timezone и /etc/localtime ) в качестве тома в контейнере докеров.
Обновите docker-compose.yml
следующими строками.
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
Теперь время контейнера такое же, как на вашем хосте
Ответ 5
Если вы используете докер-машину, виртуальные машины могут дрейфовать. Чтобы обновить часы на виртуальной машине без перезапуска, выполните следующие действия:
docker-machine ssh <machine-name|default>
sudo ntpclient -s -h pool.ntp.org
Это приведет к обновлению часов на виртуальной машине с использованием NTP, а затем все запущенные контейнеры будут иметь правильную дату.
Ответ 6
Я столкнулся со смещением по времени на 1 час и 4 мин
Перезапуск Docker сам исправил проблему для меня.
Чтобы установить часовой пояс в целом:
Ответ 7
Похоже, что при использовании Docker Machine может произойти дрейф времени, поскольку этот ответ подсказывает: fooobar.com/questions/67794/... из-за VirtualBox.
Быстрое и простое исправление - просто перезапустить виртуальную машину:
docker-machine restart default
Ответ 8
Для docker в macOS вы можете использовать docker-time-sync-agent. Меня устраивает.
Ответ 9
У меня есть следующее в файле компоновки
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
Затем все хорошее в докере Gerrit с его установкой replication_log w/correct timestamp.:-D
Ответ 10
С докере для окон мне нужно было отметить
MobyLinuxVM > Settings > Integration Services > Time synchronization
в диспетчере Hyper-V, и он работал
Ответ 11
использование docker-compose:
Добавьте /etc/localtime: /etc/localtime:ro
в атрибут volumes
:
version: '3'
services:
a-service:
build: .
image: service-name
container_name: container-name
volumes:
- /etc/localtime:/etc/localtime:ro
Ответ 12
Это сбросит время на док-сервере:
docker run --rm --privileged alpine hwclock -s
В следующий раз, когда вы создадите контейнер, часы должны быть правильными.
Источник: https://github.com/docker/for-mac/issues/2076#issuecomment-353749995
Ответ 13
Хотя это не общее решение для каждого хоста, кто-то может найти его полезным. Если вы знаете, где находитесь (Великобритания для меня), посмотрите ответ tianon's
здесь.
FROM alpine:3.6
RUN apk add --no-cache tzdata
ENV TZ Europe/London
Это то, что я добавил в свой Dockerfile ^, и проблема с часовым поясом была исправлена.