#概要
Docker for Macをサーバ用途などで1日以上起動したままにすると徐々にコンテナ内の時刻がずれてしまいます。
検索しても自分の環境と条件が違うものが多かったので、Docker for Macでの同期についてやってみました。
#環境
OS: Mac OS Sierra 10.12.3
Docker for Mac: 1.13.0
#手順
1 ターミナルを開いて以下を実行する
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
2 空の端末が起動するので、次のコマンドを実行する
hwclock -s
これでコンテナ内の時刻がホストのmac OSの時刻と同期しているかと思います。
#手順の内容
##Docker for Macコンテナの階層
公式のDocker for Mac vs. Docker Toolboxには以下のように記載されています
Docker for Mac does not use VirtualBox, but rather HyperKit, a lightweight macOS virtualization solution built on top of Hypervisor.framework in macOS 10.10 Yosemite and higher.
Docker for MacではMacの上にHyperKitという仮想化ソリューションを用いてAlpine Linuxベースの仮想環境を構築し、その上にDockerコンテナが乗ることになります。
##時刻がずれる要因
本来Dockerではホストの時刻を参照するため、時刻がずれることはないのですが、上記の通りHyperKit上の仮想OSがDockerコンテナにとってのホストとなり、そのホストの時刻がずれていくことで、コンテナ上の時刻もずれていきます。
##HyperKit上の時刻をハードウェアクロックと同期させる
手順1.で実行しているのは、HyperKit上のLinuxへのアクセスで、手順2.では、ハードウェアクロックをシステムクロックに同期させています。
ハードウェアクロックは文字通りmacのハードで刻んでいるクロックで、ホストはNTPで適宜正しい時刻をハードウェアクロックに反映していますので、ハードウェアクロックをHyperKit上のLinuxに反映させることで、それを参照するコンテナの時刻同期を図っています。
HyperKit上のLinuxにはcronが入っていたので、
crontab -e
でスケジューリングしてやれば、定期的にハードウェアクロックと同期させることもできます。
#参照
How to access the VM created by docker's HyperKit?
Docker for Mac vs. Docker Toolbox