Як переконатися, що час докера синхронізується з часом хоста?


84

У мене є докери, що працюють на серверах Linode. Іноді я бачу, що на докерах не той час. На даний момент я змінив сценарій запуску в кожному докері, щоб включити наступні рядки коду.

yum install -y ntp
service ntpd stop
ntpdate pool.ntp.org

Однак в ідеалі я хотів би зробити так, щоб докер синхронізував час із хостом. Чи є спосіб зробити це?



Контейнер використовуватиме той самий час, що і хост. Перегляньте це запитання та відповідь одного з розробників ядра Docker.
Ben Whaley

Це однозначне повторюване запитання, але відповідь навіть на інше питання говорить про часовий пояс, який мене насправді не турбує. Коментар до відповіді дає зрозуміти, що зміщення годинника не відбувається, оскільки докер і хост використовують один і той же годинник. Дякуємо Бену, що вказав на це.
Ранджит Рамачандра

9
ПОПЕРЕДЖЕННЯ : існує певна плутанина щодо того, що таке господар . В операційних системах, відмінних від Linux та Windows 10+ з підсистемою Linux, машина-докер (хост) насправді є віртуальною машиною. Коли хост докера не та машина, на якій ви виконуєте dockerкоманди, ви можете побачити перебіг часу, і такі речі, як монтажні томи, працюватимуть не так, як ви могли очікувати. Це також трапляється, коли ви налаштовуєте віддалений докер-апарат, наприклад, на DigitalOcean.
Codebling

Відповіді:


84

Джерелом цієї відповіді є коментар до відповіді за адресою: Чи автоматично синхронізуватиметься докер-контейнер з автоматичною машиною?

Подивившись на відповідь, я зрозумів, що ніяк не може відбутися зсув годинника на контейнері докера. Docker використовує той самий годинник, що і хост, і докер не може його змінити. Це означає, що робитиntpdate всередині докера не працює.

Правильне, що потрібно зробити, це оновити час хосту за допомогою ntpdate

Що стосується синхронізації часових поясів, це -v /etc/localtime:/etc/localtime:roпрацює.


4
Скажи мені, як це може бути? Якщо докет використовує той самий годинник, що і система. чим може відрізнятися годинник докера від хоста. Якщо відбудеться зсув годинника, це відбудеться на хост-машині докера, де і потребує виправлення зсув годинника. Мені буде цікаво дізнатись, чи я помиляюся.
Ранджит Рамачандра

10
Під час використання Docker на Mac із boot2docker, віртуальна машина boot2docker може втратити час. Docker залишається синхронізованим із хостом, але хост надає неправильний час. Перезавантаження віртуальної машини є найпростішим виправленням для цього.
Натаніель Вайсброт,

56
Це зовсім інша проблема, коли ВМ втрачає час. Технічно докер все ще синхронізується зі своїм хостом, яким є ВМ.
Ранджит Рамачандра,

3
@ISJ: boot2docker restartАбо якщо у вас є власна віртуальна машина, ви можете ntpdateтам.
Натаніель Вайсброт,

5
Я на Windows. Час приймаючої машини - 15:06, час контейнера - 18:41 ... wtf
willem

37

Ви можете додати свої локальні файли (/ etc / timezone та / etc / localtime) як том у ваш контейнер Docker.

Оновіть свій текст docker-compose.ymlза допомогою таких рядків.

volumes:
    - "/etc/timezone:/etc/timezone:ro"
    - "/etc/localtime:/etc/localtime:ro"

Тепер час контейнера такий же, як і на вашому хості.


приємно і чисто! ти!
wopolow

35

Якщо ви використовуєте boot2docker, а ntp не працює у віртуальній машині докера ( ви стоїте за проксі-сервером, який не пересилає пакети 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)"

Ідеально! Це було точно моєю проблемою, і це миттєво виправляє, не потребуючи перезавантаження докер-машини.
qwertzguy

1
Чи можна встановити секунди? Я спробував додати% S, але отримую недійсний час
Сакіб

@Sakib, то dateкоманда приймає тільки формат , MMDDhhmm[[CC]YY][.ss]щоб встановити дату, так щоб додати секунд, ви повинні помістити їх в кінці рядка , як це: +%m%d%H%M%Y.%S.
gvlx

28

Це те, що мені вдалося з хостом 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при запуску контейнера вперше. Я знайшов його за цим посиланням .

Сподіваюся, це допоможе.


це спрацювало для мене у випуску CentOS Linux 7.6.1810
k4cy

26

Це скине час на сервері докера:

docker run --rm --privileged alpine hwclock -s

Наступного разу, коли ви створите контейнер, годинник повинен бути правильним.

Джерело: https://github.com/docker/for-mac/issues/2076#issuecomment-353749995


3
Ось це таємниця, яку я шукав! Вимикався днями, а сертифікати були сварливими. Дякую!
Джосія

2
Дякую за це. Працював як оберіг.
Райан Натт

як використовувати його з docker-compose?
Surya Swanoff

1
Я бачив, як Docker для Windows, про який часто повідомляли, не синхронізував час після сплячої помилки, це виправлення працювало як магія! Що це робить?
StackG

11

Якщо ви використовуєте докер-машину, віртуальні машини можуть дрейфувати. Щоб оновити годинник на віртуальній машині без перезапуску:

docker-machine ssh <machine-name|default>
sudo ntpclient -s -h pool.ntp.org

Це оновить годинник на віртуальній машині за допомогою NTP, і тоді всі запущені контейнери матимуть правильну дату.


Команда спрацювала і оновила час. Однак час знову почав дрейфувати, і мені довелося знову запустити команду. Як зробити так, щоб він автоматично синхронізувався всередині хоста докера?
chitti

10

Я зіткнувся з часовим зсувом -1 години та 4 хвилини

Перезапуск самого Docker вирішив проблему для мене.

Щоб встановити часовий пояс загалом:

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

  2. бігти dpkg-reconfigure tzdata

  3. бігти date

Це спрацювало для мене з консолі на macOS High Sierra 10.13.6 (17G65) з використанням docker -compose :docker-compose exec <servicename> bundle exec dpkg-reconfigure tzdata
Zack Morris

9

Здається, там може змінюватися час, якщо ви використовуєте Docker Machine, як випливає з цієї відповіді: https://stackoverflow.com/a/26454059/105562 , через VirtualBox.

Швидке та просте виправлення полягає у простому перезавантаженні віртуальної машини:

docker-machine restart default

1
у вікнах докера не було машини за замовчуванням, я перезапустив демон на вкладці скидання в програмі конфігурації докера, що постачається з вікнами докера, після цього час закінчився
докера, що докера

9

У мене є наступне у файлі створення

volumes:
  - "/etc/timezone:/etc/timezone:ro"
  - "/etc/localtime:/etc/localtime:ro"

Тоді все добре в док-станції Gerrit з набором replication_log із правильною позначкою часу.


У мене є контейнери Debian (9) на хості CentOS (7), і монтування localtime працює, але часовий пояс не може, оскільки на хості це каталог, а в контейнері це файл.
tometchy


5

З докером для вікон мені довелося ставити галочку

MobyLinuxVM > Settings > Integration Services > Time synchronization 

в менеджері Hyper-V і це спрацювало


Однак є одна проблема. Здається, після перезапуску хоста налаштування не встановлено
user725408

Так - здається, це трапляється у деяких збірках Windows (див. Github.com/docker/for-win/issues/409 )
Крістіан Опіц

1
У моєму випадку цей прапорець уже встановлений, але час контейнера на три дні відстає від часу хосту.
Скотт Хатчінсон,

5

використання docker-compose:

Додайте /etc/localtime:/etc/localtime:roдо volumesатрибута:

version: '3'

services:
  a-service:
      image: service-name
      container_name: container-name
      volumes:
        - /etc/localtime:/etc/localtime:ro

3

Хоча це не загальне рішення для кожного хоста, комусь це може виявитися корисним. Якщо ви знаєте, де ви знаходитесь (для мене Великобританія), тоді подивіться на tianon'sвідповідь тут .

FROM alpine:3.6
RUN apk add --no-cache tzdata
ENV TZ Europe/London

Це те, що я додав у свій Dockerfile ^, і проблема з часовим поясом була виправлена.



1

Використання докера

Ось повний приклад, який створює образ докера для програми 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"]

1

Для мене перезавантаження Docker Desktop не допомогло. Вимкнення Win10 і запуск знову, це допомогло.


1

Користувачі 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


Моє рішення натхнене чимось, що я знайшов у форумі docker. У будь-якому випадку, це було єдине рішення, яке працювало для мене на робочому столі docker, за винятком перезапуску моєї машини (що також працює). Ось посилання на початкову тему: 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")"


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.