web-dev-qa-db-ja.com

Dockerの時間をホストの時間と確実に同期させる方法は?

Linodeサーバーで実行しているドッカーがあります。時々、ドッカーの時刻が正しくないことがわかります。現在、すべてのドッカーの実行スクリプトを変更して、次のコード行を含めています。

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

ただし、理想的には、Dockerがホストと時刻を同期する必要があるということです。これを行う方法はありますか?

49

この回答のソースは、次の場所にある回答に対するコメントです。 ホストマシンとdocker container auto sync time?

答えを見て、ドッカーコンテナーでクロックドリフトが発生することはないことに気付きました。 Dockerはホストと同じクロックを使用し、Dockerはそれを変更できません。これは、ドッカー内でntpdateを実行しても機能しないことを意味します。

正しいことは、ntpdateを使用してホスト時間を更新することです

タイムゾーンの同期に関する限り、-v /etc/localtime:/etc/localtime:roは機能します。

55

boot2dockerおよびntpが使用されていない場合、Docker VM(背後にある)内で動作しません ntpパケットを転送しないプロキシ)がホストが時間同期されている場合、ホストから次を実行できます。

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

このように、dateを使用してドッカーVM時間を設定するための文字列としてマシンの現在の時間(UTCタイムゾーン)を送信しています(再びUTCタイムゾーン)。

注:Windowsでは、bashシェル(msys gitから)内で、次を使用します。

docker-machine.exe ssh default "Sudo date -u $(date -u +%m%d%H%M%Y)"
32
gvlx

これが、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を使用することです。 このリンク で見つけました。

それが役に立てば幸い。

22
Dharmit

Docker-containerのローカルファイル(/ etc/timezoneおよび/ etc/localtime)をボリュームとして追加できます。

docker-compose.ymlを次の行で更新します。

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

コンテナの時間はホストの時間と同じです

16
thhan

Docker-machineを使用している場合、仮想マシンがドリフトする可能性があります。再起動せずに仮想マシンのクロックを更新するには:

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

これにより、NTPを使用して仮想マシンのクロックが更新され、起動されたすべてのコンテナーに正しい日付が設定されます。

10
lukecampbell

私は-1時間4分の時間オフセットに直面していました

Docker自体を再起動すると、問題が修正されました。

一般にタイムゾーンを設定するには:

  1. コンテナーにssh:docker exec -it my_website_name bash

  2. dpkg-reconfigure tzdataを実行します

  3. dateを実行します
7
Stefan Diabo

この応答が示唆しているように、Docker Machineを使用している場合、時間の経過によってドリフトする可能性があります: https://stackoverflow.com/a/26454059/105562 、VirtualBoxのため。

すばやく簡単に修正するには、VMを再起動するだけです。

docker-machine restart default
6
Travis Reeder

MacOS上のdockerの場合、 docker-time-sync-agent を使用できます。わたしにはできる。

6
cranehuang

Windows用のdockerでは、チェックする必要がありました

MobyLinuxVM > Settings > Integration Services > Time synchronization 

hyper-Vマネージャーで動作しました

5
Christian Opitz

作成ファイルに次のものがあります

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

次に、Replication_logに正しいタイムスタンプが設定されたGerritドッカーですべて正常に動作します。 :-D

5
j3ffyang

これにより、Dockerサーバーの時間がリセットされます。

docker run --rm --privileged Alpine hwclock -s

次回コンテナを作成するとき、時計は正しいはずです。

ソース: https://github.com/docker/for-mac/issues/2076#issuecomment-353749995

2
cahen

docker-composeの使用法:

/etc/localtime:/etc/localtime:rovolumes属性に追加します。

version: '3'

services:
  a-service:
      build: .
      image: service-name
      container_name: container-name
      volumes:
        - /etc/localtime:/etc/localtime:ro
2
Benyamin Jafari

これはすべてのホストに対する一般的な解決策ではありませんが、誰かが役に立つと思うかもしれません。拠点の場所がわかっている場合(英国では私にとって)、tianon's answer here をご覧ください。

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

これがDockerfile ^に追加したものであり、タイムゾーンの問題が修正されました。

0