Wie kann sichergestellt werden, dass die Docker-Zeit mit der des Hosts synchronisiert wird?

79

Ich habe Docker auf Linode-Servern. Manchmal sehe ich, dass die Zeit auf den Hafenarbeitern nicht richtig ist. Derzeit habe ich das Ausführungsskript in jedem Docker so geändert, dass es die folgenden Codezeilen enthält.

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

Idealerweise möchte ich jedoch, dass der Docker die Zeit mit dem Host synchronisiert. Gibt es eine Möglichkeit, dies zu tun?

Ranjith Ramachandra
quelle
1
Mögliches Duplikat der automatischen Synchronisierungszeit
Ben Whaley
Der Container verwendet dieselbe Zeit wie der Host. In diesen Fragen und Antworten erhalten Sie eine Antwort von einem der Docker-Kernentwickler.
Ben Whaley
Dies ist eine eindeutige doppelte Frage, aber die Antwort auf die andere Frage bezieht sich auf die Zeitzone, die mich nicht wirklich stört. Der Kommentar zur Antwort macht deutlich, dass die Taktdrift nicht auftritt, da Docker und Host dieselbe Uhr verwenden. Danke Ben, dass du darauf hingewiesen hast.
Ranjith Ramachandra
8
WARNUNG : Es gibt einige Verwirrung darüber, was ein Host ist. Unter anderen Betriebssystemen als Linux und Windows 10+ mit Linux-Subsystem ist die Docker-Maschine (der Host) tatsächlich eine virtuelle Maschine. Wenn der Docker-Host nicht derselbe Computer ist wie der, auf dem Sie die dockerBefehle ausführen, kann es zu Zeitverzerrungen kommen, und Dinge wie das Mounten von Volumes funktionieren nicht wie erwartet. Dies geschieht auch, wenn Sie einen Remote-Docker-Computer einrichten, z. B. auf DigitalOcean.
Codebling

Antworten:

83

Die Quelle für diese Antwort ist der Kommentar zur Antwort unter: Wird die automatische Synchronisierungszeit des Docker-Containers mit dem Host-Computer?

Nachdem ich mir die Antwort angesehen hatte, stellte ich fest, dass auf dem Docker-Container keine Uhrendrift auftreten kann. Docker verwendet dieselbe Uhr wie der Host und der Docker kann sie nicht ändern. Dies bedeutet, dass ntpdatees nicht funktioniert , ein Docker zu erstellen.

Das Richtige ist, die Host-Zeit mit zu aktualisieren ntpdate

Funktioniert die Synchronisierung von Zeitzonen -v /etc/localtime:/etc/localtime:ro.

Ranjith Ramachandra
quelle
4
Sag mir, wie das sein kann? Wenn das Docket dieselbe Uhr wie das System verwendet. Wie kann sich die Docker-Uhr vom Host unterscheiden? Wenn eine Taktdrift auftritt, geschieht dies auf dem Host-Computer des Dockers, auf dem die Taktdrift behoben werden muss. Ich werde interessiert sein zu wissen, ob ich falsch liege.
Ranjith Ramachandra
10
Wenn Sie Docker auf einem Mac mit boot2docker verwenden, kann die boot2docker-VM Zeit verlieren. Docker bleibt mit seinem Host synchron, aber sein Host liefert die falsche Zeit. Ein Neustart der VM ist die einfachste Lösung dafür.
Nathaniel Waisbrot
56
Dies ist ein völlig anderes Problem, bei dem die VM ihre Zeit verliert. Technisch gesehen ist Docker immer noch mit seinem Host synchronisiert, der VM.
Ranjith Ramachandra
3
@ISJ: boot2docker restartOder wenn Sie Ihre eigene VM betreiben, können Sie ntpdatedort.
Nathaniel Waisbrot
3
Ich bin unter Windows. Host-Maschinenzeit ist 15:06, Containerzeit ist 18:41 ... wtf
Willem
35

Wenn Sie boot2docker verwenden und ntp in der Docker-VM nicht funktioniert (Sie befinden sich hinter einem Proxy, der keine ntp-Pakete weiterleitet), Ihr Host jedoch zeitsynchronisiert ist, können Sie Folgendes von Ihrem Host aus ausführen:

docker-machine ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"

Auf diese Weise senden Sie die aktuelle Zeit Ihres Computers (in der UTC-Zeitzone) als Zeichenfolge, um die Docker-VM-Zeit mithilfe date(erneut in der UTC-Zeitzone) festzulegen.

HINWEIS: Verwenden Sie unter Windows in einer Bash-Shell (vom msys git) Folgendes:

docker-machine.exe ssh default "sudo date -u $(date -u +%m%d%H%M%Y)"
gvlx
quelle
Perfekt! Das war genau mein Problem und es behebt es sofort, ohne dass die Docker-Maschine neu gestartet werden muss.
qwertzguy
1
Ist es möglich, die Sekunden einzustellen? Ich habe versucht,% S hinzuzufügen, aber ich bekomme eine ungültige Zeit
Sakib
@ Sakib, der dateBefehl akzeptiert nur das Format MMDDhhmm[[CC]YY][.ss]zum Festlegen des Datums. Um Sekunden hinzuzufügen, müssen Sie diese wie folgt am Ende der Zeichenfolge einfügen : +%m%d%H%M%Y.%S.
Gvlx
33

Sie können Ihre lokalen Dateien (/ etc / timezone und / etc / localtime) als Volume in Ihren Docker-Container einfügen.

Aktualisieren Sie Ihre docker-compose.ymlmit den folgenden Zeilen.

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

Jetzt ist die Containerzeit dieselbe wie auf Ihrem Host.

als
quelle
schön und sauber! ty!
Wopolow
27

Dies hat bei einem Fedora 20-Host funktioniert. Ich habe einen Container ausgeführt mit:

docker run -v /etc/localtime:/etc/localtime:ro -i -t mattdm/fedora /bin/bash

Anfangs /etc/localtimewar eine weiche Verbindung zur /usr/share/zoneinfo/Asia/Kolkataindischen Standardzeit. Die Ausführung dateim Container zeigte mir die gleiche Zeit wie auf dem Host. Ich verließ die Shell und stoppte den Container mit docker stop <container-id>.

Als nächstes entfernte ich diese Datei und stellte zu /usr/share/zoneinfo/SingaporeTestzwecken einen Link zu her . Die Host-Zeit wurde auf die Zeitzone von Singapur eingestellt. Und dann tat es docker start <container-id>. Dann wurde erneut mit auf die Shell zugegriffen nsenterund festgestellt, dass die Zeit jetzt auf die Zeitzone von Singapur eingestellt war.

docker start <container-id>
docker inspect -f {{.State.Pid}} <container-id>
nsenter -m -u -i -n -p -t <PID> /bin/bash

Der Schlüssel hier ist also, -v /etc/localtime:/etc/localtime:rowenn Sie den Container zum ersten Mal ausführen. Ich habe es auf diesem Link gefunden .

Ich hoffe es hilft.

Dharmit
quelle
Dies funktionierte für mich auf einer CentOS Linux-Version 7.6.1810
k4cy
24

Dadurch wird die Zeit auf dem Docker-Server zurückgesetzt:

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

Wenn Sie das nächste Mal einen Container erstellen, sollte die Uhr korrekt sein.

Quelle: https://github.com/docker/for-mac/issues/2076#issuecomment-353749995

cahen
quelle
3
Das ist das Geheimnis, nach dem ich gesucht habe! War tagelang weg und die Zertifikate waren mürrisch. Vielen Dank!
Josiah
2
Danke dafür. Lief wie am Schnürchen.
Ryan Nutt
Wie benutzt man es mit Docker-Compose?
Surya Swanoff
1
Ich habe gesehen, dass der vielbeschriebene Docker für Windows nach dem Schlafen keine Zeit synchronisiert hat. Dieses Update hat wie Magie funktioniert! Was macht es?
StackG
10

Wenn Sie eine Docker-Maschine verwenden, können die virtuellen Maschinen driften. So aktualisieren Sie die Uhr auf der virtuellen Maschine, ohne den Lauf neu zu starten:

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

Dadurch wird die Uhr auf der virtuellen Maschine mithilfe von NTP aktualisiert, und dann haben alle gestarteten Container das richtige Datum.

Lukecampbell
quelle
Der Befehl hat funktioniert und die Uhrzeit aktualisiert. Die Zeit begann jedoch wieder zu driften und ich musste den Befehl erneut ausführen. Wie kann die automatische Synchronisierung im Docker-Host erfolgen?
Chitti
10

Ich hatte einen Zeitversatz von -1 Stunde und 4 Minuten

Das Neustarten von Docker selbst hat das Problem für mich behoben.

So stellen Sie die Zeitzone im Allgemeinen ein:

  1. ssh in deinen container: docker exec -it my_website_name bash

  2. Lauf dpkg-reconfigure tzdata

  3. Lauf date
Stefan Diabo
quelle
Dies funktionierte für mich von der Konsole unter macOS High Sierra 10.13.6 (17G65) mit Docker-Compose :docker-compose exec <servicename> bundle exec dpkg-reconfigure tzdata
Zack Morris
9

Wenn Sie Docker Machine verwenden, kann es zu Zeitverschiebungen kommen, wie aus dieser Antwort hervorgeht: https://stackoverflow.com/a/26454059/105562 , aufgrund von VirtualBox.

Eine schnelle und einfache Lösung besteht darin, Ihre VM neu zu starten:

docker-machine restart default
Travis Reeder
quelle
1
In Docker Windows war kein Standardcomputer. Ich habe den Daemon über die Registerkarte "Zurücksetzen" im Docker-Konfigurationsprogramm neu gestartet, das mit Docker-Fenstern
geliefert
8

Ich habe Folgendes in der Erstellungsdatei

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

Dann alles gut in Gerrit Docker mit seinem replication_log mit korrektem Zeitstempel gesetzt.

j3ffyang
quelle
Ich habe Debian (9) -Container im CentOS (7) -Host und das Mounten der Ortszeit funktioniert, die Zeitzone jedoch nicht, da auf dem Host das Verzeichnis und im Container die Datei vorhanden ist.
Tometchy
6

Für Docker unter MacOS können Sie Docker-Time-Sync-Agent verwenden . Für mich geht das.

Cranehuang
quelle
Anscheinend ist dies jetzt behoben github.com/docker/for-mac/issues/17
Ryan R
Bei Docker-Version 18.03.1-ce-mac65 tritt immer noch eine Zeitüberschreitung bei der Synchronisierung auf, und diese Lösung behebt das Problem.
Hana Alaydrus
5

Mit Docker für Windows musste ich ankreuzen

MobyLinuxVM > Settings > Integration Services > Time synchronization 

im Hyper-V-Manager und es hat funktioniert

Christian Opitz
quelle
Es gibt jedoch ein Problem. Es scheint, dass nach dem Neustart des Hosts die Einstellung deaktiviert ist
user725408
Ja - dies scheint bei einigen Windows-Builds zu passieren (siehe github.com/docker/for-win/issues/409 )
Christian Opitz
1
In meinem Fall ist dieses Kontrollkästchen bereits aktiviert, aber die Containerzeit liegt drei Tage hinter der Hostzeit.
Scott Hutchinson
5

Docker-Compose-Verwendung:

In /etc/localtime:/etc/localtime:rozum volumesAttribute:

version: '3'

services:
  a-service:
      image: service-name
      container_name: container-name
      volumes:
        - /etc/localtime:/etc/localtime:ro
Benyamin Jafari
quelle
3

Obwohl dies nicht für jeden Host eine allgemeine Lösung ist, kann es für jemanden nützlich sein. Wenn Sie wissen, wo Sie sich befinden (UK für mich), sehen Sie sich die tianon'sAntwort hier an .

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

Dies ist, was ich zu meiner Docker-Datei ^ hinzugefügt habe und das Zeitzonenproblem wurde behoben.

batristio
quelle
1

Docker-Nutzung

Hier ist ein vollständiges Beispiel, das ein Docker-Image für eine Go-App in einem mehrstufigen Build erstellt. Es zeigt, wie Sie die Zeitzone in Ihr Bild aufnehmen können.

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"]
Markhorrocks
quelle