Как убедиться, что время докера синхронизируется со временем хоста?
У меня есть докеры, работающие на серверах Linode. Иногда я вижу, что время докеров не подходит. В настоящее время я изменил скрипт запуска в каждом докере, чтобы включить следующие строки кода.
yum install -y ntp
service ntpd stop
ntpdate pool.ntp.org
Однако в идеале я хотел бы, чтобы докер синхронизировал время с хостом. Есть ли способ сделать это?
22 ответа
Источником этого ответа является комментарий к ответу: Будет ли контейнер автоматической синхронизации Docker синхронизировать время с хостом?
Посмотрев на ответ, я понял, что в док-контейнере не будет никакого смещения часов. Докер использует те же часы, что и хост, и докер не может их изменить. Это означает, что делать ntpdate
внутри докера не работает.
Правильная вещь, чтобы сделать, это обновить время хоста с помощью ntpdate
Что касается синхронизации часовых поясов, -v /etc/localtime:/etc/localtime:ro
работает.
Вы можете добавить свои локальные файлы (/etc/timezone и /etc/localtime) в виде тома в ваш docker-контейнер.
Обновите свой docker-compose.yml
со следующими строками.
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
Теперь время контейнера такое же, как на вашем хосте.
Это сбросит время на док-сервере:
docker run --rm --privileged alpine hwclock -s
В следующий раз, когда вы создадите контейнер, часы должны быть правильными.
Если вы используете boot2docker и ntp не работает внутри виртуальной машины докера (вы находитесь за прокси-сервером, который не пересылает пакеты ntp), но ваш хост синхронизирован по времени, вы можете запустить следующее с вашего хоста:
docker-machine ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"
Таким образом, вы отправляете текущее время вашей машины (в часовом поясе UTC) в виде строки для установки времени виртуальной машины докера с помощью date
(снова в часовом поясе UTC).
ПРИМЕЧАНИЕ: в Windows, внутри оболочки bash (из msys git), используйте:
docker-machine.exe ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"
Это то, что работало для меня с хостом 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
когда вы запускаете контейнер в первый раз. Я нашел это по этой ссылке.
Надеюсь, поможет.
Это простое решение устранило нашу проблему синхронизации времени для ядра докера в WSL2.
Откройте PowerShell в Windows и выполните эту команду, чтобы повторно синхронизировать часы.
wsl -d docker-desktop -e /sbin/hwclock -s
Затем вы можете протестировать его, используя
docker run -it alpine date
Ссылка: https://github.com/docker/for-win/issues/10347#issuecomment-776580765
использование 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
У меня есть следующее в файле compose
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
Тогда все хорошо в Gerrit Docker с его набором replication_log с правильной отметкой времени.:-D
Если вы используете докер-машину, виртуальные машины могут дрейфовать. Чтобы обновить часы на виртуальной машине без перезапуска, выполните:
docker-machine ssh <machine-name|default>
sudo ntpclient -s -h pool.ntp.org
Это обновит часы на виртуальной машине, используя NTP, и тогда у всех запущенных контейнеров будет правильная дата.
Я столкнулся со смещением времени -1 час и 4 минуты
Перезапуск Docker сам по себе исправил проблему для меня.
Чтобы установить часовой пояс в целом:
SSH в ваш контейнер:
docker exec -it my_website_name bash
бежать
dpkg-reconfigure tzdata
- бежать
date
Похоже, это может со временем сместиться, если вы используете Docker Machine, как следует из этого ответа: /questions/43736775/budet-li-docker-kontejner-avtomaticheski-sinhronizirovat-vremya-s-hostom/43736792#43736792, из-за VirtualBox.
Быстрое и простое решение - просто перезапустить виртуальную машину:
docker-machine restart default
Пользователи Windows:
Решение очень простое. Просто откройте командную строку PowerShell и введите:
docker run --privileged --rm alpine date -s "$(Get-Date ([datetime]::UtcNow) -UFormat "+%Y-%m-%d %H:%M:%S")"
Чтобы проверить, что он работает, выполните команду:
docker run --rm -it alpine date
Мое решение вдохновлено тем, что я нашел в ветке форума докеров. В любом случае, это было единственное решение, которое сработало для меня на рабочем столе докера, за исключением перезапуска моей машины (что тоже работает). Вот ссылка на исходную ветку: https://forums.docker.com/t/syncing-clock-with-host/10432/23
Разница между ответом потока и моим в том, что мой преобразует время в UTC, что необходимо, например, для AWS. В противном случае исходный ответ форума выглядит так:
docker run --privileged --rm alpine date -s "$(date -u "+%Y-%m-%d %H:%M:%S")"
Для docker в macOS вы можете использовать docker-time-sync-agent. Меня устраивает.
С докером для windows пришлось поставить галочку
MobyLinuxVM > Settings > Integration Services > Time synchronization
в диспетчере Hyper-V и все заработало
Хотя это не универсальное решение для каждого хоста, кому-то оно может оказаться полезным. Если вы знаете, где живете (для меня Великобритания), посмотритеtianon's
ответьте здесь.
FROM alpine:3.6
RUN apk add --no-cache tzdata
ENV TZ Europe/London
Это то, что я добавил в свой Dockerfile ^, и проблема с часовым поясом была исправлена.
Я видел это в окнах, запуская Prometheus из docker-compose. У меня был 15-часовой временной сдвиг.
Если вы используете Docker Desktop на WSL, вы можете попробовать запустить
wsl --shutdown
из командной строки PowerShell.Docker Desktop должен перезапуститься, и вы можете снова попробовать запустить контейнер докеров.
У меня сработало, и мне не пришлось перезагружать.
Для меня перезапуск Docker Desktop не помог. Выключить Win10 и запустить его снова, действительно помогло.
Использование Docker
Вот полный пример, который создает образ докера для приложения go в многоступенчатой сборке. Он показывает, как включить часовой пояс в ваше изображение.
FROM golang:latest as builder
WORKDIR /app
ENV GO111MODULE=on \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o main
### Certs
FROM alpine:latest as locals
RUN apk --update --no-cache add ca-certificates
RUN apk add --no-cache tzdata
### App
FROM scratch
WORKDIR /root/
COPY --from=locals /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=builder app/main .
COPY --from=builder app/templates ./templates
COPY --from=locals /usr/share/zoneinfo /usr/share/zoneinfo
ENV TZ=Asia/Singapore
EXPOSE 8000
CMD ["./main"]
Я обнаружил, что если ваш компьютер переходит в спящий режим, то контейнер докера не синхронизируется.
https://forums.docker.com/t/time-in-container-is-out-of-sync/16566
Я написал об этом здесь. Сертификат всегда истекает 5 дней назад в Docker.
По какой-то причине ни один из этих ответов не решил мою проблему.
Это не имело ничего общего с датой и временем в докере для изображений, которые я создавал. Это было связано с моей местной датой WSL.
Однажды я сбежал
sudo ntpdate-debian
все заработало.
Если у вас нет ntp, просто установите его и выполните команду. Если вы не используете debian, вероятно, у вас не будет сценария оболочки ntpdate-debian, но вы можете использовать
ntpd -gq
также. В основном просто обновите дату для вашего основного дистрибутива WSL.
Включение Hyper-V в компонентах Windows решило проблему: компоненты Windows
Этот код работал для меня
docker run -e TZ="$(cat /etc/timezone)" myimage