Как убедиться, что время докера синхронизируется со временем хоста?

У меня есть докеры, работающие на серверах 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

В следующий раз, когда вы создадите контейнер, часы должны быть правильными.

Источник: https://github.com/docker/for-mac/issues/2076

Если вы используете 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 сам по себе исправил проблему для меня.

Чтобы установить часовой пояс в целом:

  1. SSH в ваш контейнер:docker exec -it my_website_name bash

  2. бежать dpkg-reconfigure tzdata

  3. бежать 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
Другие вопросы по тегам