前文
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などで時刻同期をしていれば、コンテナ内の時刻管理は必要がない