Edited at

Docker コンテナの時刻同期(時刻データ)について

More than 1 year has passed since last update.


前文

dockerのコンテナに対する時刻同期はどうするのか?

NTPを動かして同期してもいいが、1コンテナには1サービスというdockerのポリシーに反するし、どうなのかなぁ、、、と思っていた。

よくよく考えると、あれ? そもそもdockerってハードウェアの仮想化しないんだよなぁ、あれ? どうやってクロック信号を採っているんだ? って部分に行き着いた。

公式のドキュメントやソースコードを詳しく読めば、確実に判明はするのだけど、英語のドキュメントページの要点を斜め読みするだけだし、ソースコードを読むのはスキル的に至難の業だし、、、

そこで、自分だったらどう設計するかを考えてみる、自分だったらホストとclockデータを共有させる!

それなら確認してみましょう


検証作業


環境


  • Dockerホスト : CentOS

  • 検証用コンテナ : 公式のtomcatコンテナ(ベースOSはdebian)


ホストでの作業

# 最新のコンテナイメージの取得

docker pull tomcat

# コンテナの作成
docker run --name test-tomcat -p 8080:8080 -d tomcat

# コンテナの状態確認
docker ps
#=> CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#=> 5ba5742562ee tomcat "catalina.sh run" 6 seconds ago Up 5 seconds 0.0.0.0:8080->8080/tcp test-tomcat


コンテナ側の作業

ホストのtimezoneはJST設定にしてあり、コンテナのデフォルトのUTCでは検証として面倒なのでJSTに合わせる

# ログイン

docker exec -ti test-tomcat /bin/bash

# コンテナにログイン後
root@5ba5742562ee:/usr/local/tomcat# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# 現時刻確認
root@5ba5742562ee:/usr/local/tomcat# date
#=> Tue Dec 20 10:50:02 JST 2016


ホストで時刻を変更

# 変更

date --set "2016/12/20 09:00:00"

# 確認
date
#=> 2016年 12月 20日 火曜日 09:00:04 JST


コンテナ側で確認



# 確認
root@5ba5742562ee:/usr/local/tomcat# date
#=> Tue Dec 20 09:00:04 JST 2016


ホストで再度変更

# 変更

date --set "2016/12/20 11:00:00"

# 確認
date
#=> 2016年 12月 20日 火曜日 11:00:02 JST


コンテナ側で再度確認



# 確認
root@5ba5742562ee:/usr/local/tomcat# date
#=> Tue Dec 20 11:00:02 JST 2016


検証結果

dockerのコンテナはハードウェアを仮想化しないので、clockデータはホストを共有している、

そのため、ホスト側の時刻変更を即コンテナにも影響する。

つまり、ホスト側でNTPDなどで時刻同期をしていれば、コンテナ内の時刻管理は必要がない