Czy czas automatycznej synchronizacji kontenera platformy Docker z maszyną hosta?


108

Podając już poprawnie zmieniłem strefę czasową kontenera dockerowego. Czy muszę zainstalować serwer NTP wewnątrz kontenera Docker, aby okresowo synchronizować czas, czy też kontener będzie synchronizował czas z maszyną hosta?

Odpowiedzi:


103

Jeśli używasz systemu OSX z uruchomionym boot2dockerem, zobacz ten problem: https://github.com/boot2docker/boot2docker/issues/290

Synchronizacja czasu staje się problemem, ponieważ host boot2docker ma dryf czasu, gdy system operacyjny śpi. Nie można rozwiązać synchronizacji czasu z kontenerem docker, uruchamiając kontener z-v /etc/localtime:/etc/localtime:ro

Zamiast tego na razie musisz okresowo uruchamiać to na OSX:

/usr/local/bin/boot2docker ssh sudo ntpclient -s -h pool.ntp.org

Aktualizacja dla użytkowników Kitematic

Jeśli używasz Kitematic , który jest teraz sugerowanym mechanizmem uruchamiania i uruchamiania na Dockerze w OSX, będziesz musiał okresowo uruchamiać to polecenie:

docker-machine ssh default 'sudo ntpclient -s -h pool.ntp.org'

Lub w przypadku starszych wersji docker

docker-machine ssh dev 'sudo ntpclient -s -h pool.ntp.org'

Aktualizacja dla użytkowników nowej natywnej platformy Docker dla OSX

Nowa Docker Beta eliminuje VirtualBox i Docker Machine. Wydaje się, że najnowsze wersje dockera (obecnie 1.12.1-beta25 (kompilacja: 11807)) mają zdolność wykrywania nieciągłości czasu i odpowiednich dostosowań. Dlatego nie powinno to już stanowić problemu ... hura !!


Uprzejmie panu dziękuję!
— seanmcl

Dziękuję bardzo. To była jedyna rzecz, która działała.
— Mark Bao,

1
Zobacz rzekomą poprawkę / złagodzenie: github.com/boot2docker/boot2docker/pull/661
— Max Gasner

7
Zwróć uwagę, że w przypadku Docker for OSX Beta ponowne uruchomienie kontenera nie działało, podobnie jak jego odtworzenie. Zamiast tego musiałem zrestartować samego Dockera (z ikony paska menu).
— Pol

Napisałem narzędzie CLI oparte na tej odpowiedzi, aby synchronizować czas na maszynach wirtualnych docker-machine co 5 minut. Działa na moim OSX El Capitan i Windows 7 Pro
— dadads


46

Najprostszym rozwiązaniem wydaje się być uruchomienie kontenera z -v /etc/localtime:/etc/localtime:roopcją. A zatem:

#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

25
Nie wiem, czy pierwotne pytanie dotyczyło bardziej stref czasowych (np. Upewnienia się, że kontener będzie przestrzegał czasu letniego i zmian stref czasowych) lub dokładnego przechowywania czasu (np. Upewnienia się, że zegar kontenera nie będzie dryfował). Jeśli chodzi o strefy czasowe, ta odpowiedź jest idealna. Jeśli chodzi o dryf zegara, nie musisz się martwić: zegar kontenera jest taki sam jak zegar hosta (z wyjątkiem tego, że kontener nie może go zmienić, z wyjątkiem sytuacji, gdy działa w --privilegedtrybie).
— jpetazzo,

@jpetazzo zgodził się; Powinienem był dołączyć wywołanie do datena maszynie hosta w moim MWE, ponieważ w przeciwnym razie być może nie jest jasne, że kontener pobiera swój czas od hosta.
— shabbychef

1
setup mount namespace mounting /etc/localtime into /mnt/sda1/var/lib/docker/aufs/mnt/.../etc/localtime not a directory
— Brian Tingle

Wydaje się, że nie działa to w wersji docker 1.3 na OSX. Ten sam błąd co Brian Tingle.
— esilver

1
@esilver boot2docker może domyślnie montować tylko podkatalogi w / Users
— menghan

27

Na platformie Docker dla systemu Mac OS X Beta doświadczyłem znacznego dryfu na maszynie wirtualnej opartej na Alpine Linux. Z Alpine Linux FAQ można zsynchronizować zegar maszyny wirtualnej za pomocą następującego polecenia.

ntpd -d -q -n -p pool.ntp.org

Jednak uzyskanie dostępu do terminala na maszynie wirtualnej to kolejna kwestia, którą można zrobić, używając polecenia screen.

screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty

Ta ścieżka jest dowiązaniem symbolicznym, które w moim systemie wskazuje na /dev/ttys003 .

Po wejściu zwróć uwagę, że moby loginjest to po prosturoot nie ma hasła. Po zakończeniu CTRL-A, D rozłącza się z sesją screen.

UWAGA: Było to udokumentowane w Docker for Mac Trouble Shooting, ale wydaje się, że zostało usunięte. Miałem szczęście, że pokazano mi to podczas Dockercon 2016. Wygląda na to, że Docker próbuje całkowicie wyodrębnić maszynę wirtualną z doświadczenia, co wyjaśnia, dlaczego nie jest już udokumentowane.


3
To powinna być nowo przyjęta odpowiedź dla osób używających nowych RC bez przerywanej maszyny
— dokującej

2

Aktualne rozwiązanie dla osx time drift w dockerze (kwiecień 2018):

Mam komputer Mac na serwerze NTP, ale ten stały dryf zegara z kontenerami:

Z https://docs.docker.com/docker-for-mac/troubleshoot/#known-issues :

Jeśli twój system nie ma dostępu do serwera NTP, to po hibernacji czas widoczny przez Docker for Mac może być znacznie niezsynchronizowany z hostem. Ponadto czas może powoli tracić synchronizację podczas użytkowania. Aby ręcznie zresetować czas po hibernacji, uruchom:

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

Lub, aby rozwiązać oba problemy, można dodać zegar lokalny jako rezerwowe źródło czasu NTP o niskim priorytecie (o wysokim priorytecie) dla hosta. Aby to zrobić, edytuj plik /etc/ntp-restrict.conf hosta, aby dodać:

server 127.127.1.1              # LCL, local clock
fudge  127.127.1.1 stratum 12   # increase stratum

Następnie uruchom ponownie usługę NTP za pomocą:

sudo launchctl unload /System/Library/LaunchDaemons/org.ntp.ntpd.plist
sudo launchctl load /System/Library/LaunchDaemons/org.ntp.ntpd.plist

1

użycie docker-compose:

Dodaj /etc/localtime:/etc/localtime:rodovolumes atrybutu.

Spójrz na ten link, aby zademonstrować przykład.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.