docker容器内需要做时间同步么?

问题描述

Docker容器创建好之后,发现容器时间跟宿主机时间不一致,容器是UTC时间,宿主机是北京时间。 这个问题在Dockerfile中添加

RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

可以解决。 接着又想是不是要加一个ntp服务来同步时间呢? 于是进到容器里执行命令并遇到以下报错

sh-4.2# systemctl start ntpd
Failed to get D-Bus connection: Operation not permitted

问题分析

Docker的设计理念是在容器里面不运行后台服务,容器本身就是宿主机上的一个独立的主进程, 也可以间接的理解为就是容器里运行服务的应用进程。 一个容器的生命周期是围绕这个主进程存在的,所以正确的使用容器方法是将里面的服务运行在前台。 再说到systemd,这个套件已经成为主流Linux发行版(比如CentOS7、Ubuntu14+)默认的服务管理, 取代了传统的SystemV风格服务管理。systemd维护系统服务程序,它需要特权去会访问Linux内核。 而容器并不是一个完整的操作系统,只有一个文件系统, 而且默认启动只是普通用户这样的权限访问Linux内核,也就是没有特权,所以自然就用不了! 因此,请遵守容器设计原则,一个容器里运行一个前台服务!

场景测试

初始状态下,可以看到容器内时间和宿主机时间一致。

在宿主机上修改时间后,可以看到容器内的时间也是同步修改的。

执行ntpdate重新校准宿主机时间后,容器内的时间也得到了校准。

结论

docker容器内不需要做时间同步,只需要设置时区就可以。不需要另外再校准时间。

参考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章