Linodeサーバーで実行しているドッカーがあります。時々、ドッカーの時刻が正しくないことがわかります。現在、すべてのドッカーの実行スクリプトを変更して、次のコード行を含めています。
yum install -y ntp
service ntpd stop
ntpdate pool.ntp.org
ただし、理想的には、Dockerがホストと時刻を同期する必要があるということです。これを行う方法はありますか?
この回答のソースは、次の場所にある回答に対するコメントです。 ホストマシンとdocker container auto sync time?
答えを見て、ドッカーコンテナーでクロックドリフトが発生することはないことに気付きました。 Dockerはホストと同じクロックを使用し、Dockerはそれを変更できません。これは、ドッカー内でntpdate
を実行しても機能しないことを意味します。
正しいことは、ntpdate
を使用してホスト時間を更新することです
タイムゾーンの同期に関する限り、-v /etc/localtime:/etc/localtime:ro
は機能します。
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)"
これが、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
を使用することです。 このリンク で見つけました。
それが役に立てば幸い。
Docker-containerのローカルファイル(/ etc/timezoneおよび/ etc/localtime)をボリュームとして追加できます。
docker-compose.yml
を次の行で更新します。
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
コンテナの時間はホストの時間と同じです
Docker-machineを使用している場合、仮想マシンがドリフトする可能性があります。再起動せずに仮想マシンのクロックを更新するには:
docker-machine ssh <machine-name|default>
Sudo ntpclient -s -h pool.ntp.org
これにより、NTPを使用して仮想マシンのクロックが更新され、起動されたすべてのコンテナーに正しい日付が設定されます。
私は-1時間4分の時間オフセットに直面していました
Docker自体を再起動すると、問題が修正されました。
一般にタイムゾーンを設定するには:
コンテナーにssh:docker exec -it my_website_name bash
dpkg-reconfigure tzdata
を実行します
date
を実行しますこの応答が示唆しているように、Docker Machineを使用している場合、時間の経過によってドリフトする可能性があります: https://stackoverflow.com/a/26454059/105562 、VirtualBoxのため。
すばやく簡単に修正するには、VMを再起動するだけです。
docker-machine restart default
MacOS上のdockerの場合、 docker-time-sync-agent を使用できます。わたしにはできる。
Windows用のdockerでは、チェックする必要がありました
MobyLinuxVM > Settings > Integration Services > Time synchronization
hyper-Vマネージャーで動作しました
作成ファイルに次のものがあります
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
次に、Replication_logに正しいタイムスタンプが設定されたGerritドッカーですべて正常に動作します。 :-D
これにより、Dockerサーバーの時間がリセットされます。
docker run --rm --privileged Alpine hwclock -s
次回コンテナを作成するとき、時計は正しいはずです。
ソース: https://github.com/docker/for-mac/issues/2076#issuecomment-353749995
/etc/localtime:/etc/localtime:ro
をvolumes
属性に追加します。
version: '3'
services:
a-service:
build: .
image: service-name
container_name: container-name
volumes:
- /etc/localtime:/etc/localtime:ro
これはすべてのホストに対する一般的な解決策ではありませんが、誰かが役に立つと思うかもしれません。拠点の場所がわかっている場合(英国では私にとって)、tianon's
answer here をご覧ください。
FROM Alpine:3.6
RUN apk add --no-cache tzdata
ENV TZ Europe/London
これがDockerfile ^に追加したものであり、タイムゾーンの問題が修正されました。