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?

vantt
źródło

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 !!

esilver
źródło
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
50

https://github.com/sameersbn/docker-gitlab/issues/77

Zobacz odpowiedź sameersbn.

option 1: -v /etc/localtime:/etc/localtime:ro
option 2: -e "TZ=Asia/Shanghai"
user3908675
źródło
2
Opcja 2 zadziałała dla mnie. Właściwie podoba mi się, że jest to bardziej wyraźne niż inne opcje.
Ryan Walls
Dziękuję, opcja 2 również zadziałała dla mnie. Na moim Macu pojawia się błąd z opcją 1, ponieważ nie mam folderu etc / localtime.
Zergleb
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
shabbychef
źródło
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.

Martin Woolstenhulme
źródło
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
Steve Kallestad
źródło
1

użycie docker-compose:

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

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

Benyamin Jafari
źródło