Wird die Docker-Container-Zeit automatisch mit dem Host-Computer synchronisiert?

108

Ich habe die Zeitzone des Docker-Containers bereits korrekt geändert. Muss ich einen NTP-Server im Docker-Container installieren, um die Zeit regelmäßig zu synchronisieren, oder synchronisiert der Container die Zeit von seinem Host-Computer?

vantt
quelle

Antworten:

103

Wenn Sie unter OSX boot2docker ausführen, sehen Sie dieses Problem: https://github.com/boot2docker/boot2docker/issues/290

Die Zeitsynchronisierung wird zu einem Problem, da der Boot2docker-Host seine Zeitverschiebung aufweist, während Ihr Betriebssystem schläft. Die Zeitsynchronisierung mit Ihrem Docker-Container kann nicht durch Ausführen Ihres Containers mit aufgelöst werden-v /etc/localtime:/etc/localtime:ro

Stattdessen müssen Sie dies vorerst regelmäßig unter OSX ausführen:

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

Update für Benutzer von Kitematic

Wenn Sie Kitematic ausführen , das jetzt der vorgeschlagene Mechanismus zum Starten und Ausführen unter Docker in OSX ist, müssen Sie diesen Befehl regelmäßig ausführen:

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

Oder für ältere Docker-Versionen

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

Update für Benutzer des neuen nativen Docker für OSX

Die neue Docker Beta macht VirtualBox und Docker Machine überflüssig. Die neuesten Docker-Builds (derzeit 1.12.1-beta25 (Build: 11807)) scheinen die Fähigkeit zu haben, zu erkennen, wann eine Zeitdiskontinuität aufgetreten ist, und sie entsprechend anzupassen. Somit sollte dies kein Problem mehr sein ... Hurra !!

Silber
quelle
Ich danke Ihnen lieber Herr!
Seanmcl
Ich danke dir sehr. Dies war das einzige, was funktionierte.
Mark Bao
1
Siehe die angebliche Korrektur / Minderung: github.com/boot2docker/boot2docker/pull/661
Max Gasner
7
Beachten Sie, dass der Neustart des Containers für Docker für OSX Beta nicht funktioniert hat und auch nicht neu erstellt wurde. Stattdessen musste ich Docker selbst neu starten (über das Menüleisten-Symbol).
Pol
Basierend auf dieser Antwort habe ich ein CLI-Tool geschrieben , um die Zeit auf Docker-VMs alle 5 Minuten zu synchronisieren. Funktioniert auf meinem OSX El Capitan und Windows 7 Pro
Dadads
50

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

Siehe die Antwort von sameersbn.

option 1: -v /etc/localtime:/etc/localtime:ro
option 2: -e "TZ=Asia/Shanghai"
user3908675
quelle
2
Option 2 hat bei mir funktioniert. Ich mag eigentlich, dass das expliziter ist als die anderen Optionen.
Ryan Walls
Danke, Option 2 hat auch bei mir funktioniert. Auf meinem Mac wird eine Option mit Option 1 angezeigt, da ich keinen Ordner etc / localtime habe.
Zergleb
46

Die einfachste Lösung scheint darin zu bestehen, Ihren Container mit der -v /etc/localtime:/etc/localtime:roOption auszuführen . So:

#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
quelle
25
Ich weiß nicht, ob die ursprüngliche Frage mehr Zeitzonen betraf (z. B. Sicherstellen, dass der Container Sommer- und Zeitzonenänderungen berücksichtigt) oder genaue Zeitmessung (z. B. Sicherstellen, dass die Containeruhr nicht driftet). Wenn es um Zeitzonen geht, ist diese Antwort perfekt. Wenn es um Uhrendrift geht, müssen Sie sich keine Sorgen machen: Die Uhr des Containers ist dieselbe wie die Uhr des Hosts (außer dass der Container sie nicht ändern kann, außer wenn er im --privilegedModus ausgeführt wird).
Jpetazzo
@jpetazzo stimmte zu; Ich hätte einen Anruf dateauf dem Host-Computer in mein MWE aufnehmen sollen, da es ansonsten vielleicht unklar ist, ob der Container seine Zeit vom Host erhält.
Shabbychef
1
setup mount namespace mounting /etc/localtime into /mnt/sda1/var/lib/docker/aufs/mnt/.../etc/localtime not a directory
Brian Tingle
Dies scheint unter Docker 1.3 unter OSX nicht zu funktionieren. Gleicher Fehler wie Brian Tingle.
Silber
1
@esilver boot2docker kann standardmäßig nur Unterverzeichnisse unter / Users mounten
menghan
27

Unter Docker für Mac OS X Beta habe ich auf der VM, die auf Alpine Linux basiert, erhebliche Abweichungen festgestellt. In den häufig gestellten Fragen zu Alpine Linux können Sie die Uhr der VM mit dem folgenden Befehl synchronisieren.

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

Der Zugriff auf ein Terminal auf der VM ist jedoch eine weitere Frage, die Sie mit dem Befehl screen ausführen können.

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

Dieser Pfad ist ein Symlink, auf den mein System verweist /dev/ttys003.

Beachten Sie beim Einsteigen, dass das moby logineinfach rootkein Passwort hat. Nachdem Sie fertig sind, wird STRG-A, D von der Bildschirmsitzung getrennt.

HINWEIS: Früher wurde dies in Docker für die Fehlerbehebung für Mac dokumentiert, aber das scheint behoben worden zu sein. Ich hatte das Glück, es auf der Dockercon 2016 zu sehen. Es scheint, dass Docker versucht, die VM vollständig aus der Erfahrung heraus zu abstrahieren, was erklärt, warum sie nicht mehr dokumentiert ist.

Martin Woolstenhulme
quelle
3
Dies sollte die neu akzeptierte Antwort für Leute sein, die die neuen RCs ohne die intermittierende Docker-Maschine verwenden
Blizz
2

Die aktuelle Lösung für die Osx-Zeitdrift auf Docker (April 2018):

Ich habe meinen Mac auf einem NTP-Server, aber diese feste Taktverschiebung mit Containern:

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

Wenn Ihr System keinen Zugriff auf einen NTP-Server hat, ist die von Docker für Mac angezeigte Zeit nach einem Ruhezustand möglicherweise nicht mehr mit dem Host synchron. Darüber hinaus kann die Zeit während des Gebrauchs langsam nicht mehr synchron sein. Führen Sie Folgendes aus, um die Zeit nach dem Ruhezustand manuell zurückzusetzen:

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

Um beide Probleme zu beheben, können Sie die lokale Uhr als Fallback-NTP-Zeitquelle mit niedriger Priorität (hohe Schicht) für den Host hinzufügen. Bearbeiten Sie dazu die Datei /etc/ntp-restrict.conf des Hosts, um Folgendes hinzuzufügen:

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

Starten Sie dann den NTP-Dienst neu mit:

sudo launchctl unload /System/Library/LaunchDaemons/org.ntp.ntpd.plist
sudo launchctl load /System/Library/LaunchDaemons/org.ntp.ntpd.plist
Steve Kallestad
quelle
1

Docker-Compose-Verwendung:

In /etc/localtime:/etc/localtime:roan das volumesAttribut.

Schauen Sie sich diesen Link an, um ein Beispiel zu demonstrieren.

Benyamin Jafari
quelle