
simonrupf/chronyd的多功能实现。它可以将系统时钟与NTP服务器、参考时钟(如GPS接收器)同步,也可通过手表和键盘手动输入同步。同时,它还能作为NTPv4(RFC 5905)服务器和对等节点,为网络中的其他计算机提供时间服务。
本Docker容器官方支持的架构。直接从Docker Hub拉取容器即可获取适用于您架构的正确镜像。
!Linux x86-64 !ARMv8 64位 !IBM POWER8 !IBM Z Systems !Linux x86/i686 !ARMv7 32位 !ARMv6 32位
拉取并运行——就是这么简单。
bash# 从Docker Hub拉取镜像 $> docker pull simonrupf/chronyd # 运行NTP服务 $> docker run --name=ntp \ --restart=always \ --detach \ --publish=123:123/udp \ simonrupf/chronyd # 或使用更高安全性运行NTP服务 $> docker run --name=ntp \ --restart=always \ --detach \ --publish=123:123/udp \ --read-only \ --tmpfs=/etc/chrony:rw,mode=1750 \ --tmpfs=/run/chrony:rw,mode=1750 \ --tmpfs=/var/lib/chrony:rw,mode=1750 \ simonrupf/chronyd
使用本Git仓库中包含的docker-compose.yml文件,您可以自行构建容器(如果需要)。
注意:此docker-compose文件使用3.9格式,需要Docker Engine 19.03.0+版本。
bash# 运行NTP服务 $> docker compose up -d ntp # (可选)查看NTP日志 $> docker compose logs ntp
(以下说明假设您已拥有Swarm集群)
bash# 将NTP栈部署到Swarm $> docker stack deploy -c docker-compose.yml chronyd # 检查服务是否运行 $> docker stack services chronyd # (可选)查看NTP日志 $> docker service logs -f chronyd-ntp
使用本Git仓库中的vars文件,您可以更新任何变量以反映您的环境。更新后,只需执行构建和运行脚本即可。
bash# 构建NTP镜像 $> ./build.sh # 运行NTP服务 $> ./run.sh
默认情况下,本容器使用NTP池的时间服务器。如果您想使用一个或多个不同的NTP服务器,可以通过NTP_SERVERS环境变量传递给容器。这可以通过更新vars、docker-compose.yml文件或手动向docker run传递--env=NTP_SERVERS="..."实现。
以下是配置常见NTP服务器的示例。请注意,配置多个服务器时,必须使用逗号分隔的列表,且不能包含空格。
bash# (默认)NTP池 NTP_SERVERS="0.pool.ntp.org,1.pool.ntp.org,2.pool.ntp.org,3.pool.ntp.org" # Cloudflare NTP_SERVERS="time.cloudflare.com" # Google NTP_SERVERS="time1.google.com,time2.google.com,time3.google.com,time4.google.com" # 阿里云 NTP_SERVERS="ntp1.aliyun.com,ntp2.aliyun.com,ntp3.aliyun.com,ntp4.aliyun.com" # 本地(离线) NTP_SERVERS="127.127.1.1"
如果您需要公共的一级(stratum 1)服务器列表,可以查看以下链接。请注意验证服务器是否活跃,因为该列表中可能包含一些不再活跃的服务器。
此选项为可选,默认未启用。如果提供NOCLIENTLOG=true环境变量,chrony将配置为:
指定不记录客户端访问。默认情况下会记录客户端访问,允许使用chronyc中的clients命令报告统计信息。此选项也会有效禁用服务器对NTP交错模式的支持。
默认情况下,本项目将信息性消息记录到stdout,这在运行NTP服务时很有帮助。如果您想更改日志详细级别,可以在首次启动容器时传递LOG_LEVEL环境变量,指定级别(#)。此选项对应chrony的-L选项,支持以下级别:0(信息)、1(警告)、2(非致命错误)和3(致命错误)。
有关更多信息,请查看项目文档:
默认使用UTC时区,但如果您想将NTP服务器调整为本地时区,只需提供TZ环境变量,遵循标准TZ数据格式。例如,在docker-compose.yaml中,如果您位于加拿大温哥华,配置如下:
yaml... environment: - TZ=America/Vancouver ...
如果您配置的所有NTP_SERVERS都支持NTS(网络时间安全),可以传递ENABLE_NTS=true选项给容器以启用它。例如,在docker-compose.yaml中,配置如下:
yaml... environment: - NTP_SERVER=time.cloudflare.com - ENABLE_NTS=true ...
如果您配置的任何NTP_SERVERS不支持NTS,启动时会看到类似以下消息:
NTS-KE session with 164.67.62.194:4460 (tick.ucla.edu) timed out
此选项允许控制系统时钟。
默认情况下,chronyd不会尝试调整时钟。它假设时钟自由运行,并仍会跟踪其相对于估计真实时间的偏移和频率。这允许chronyd在没有调整或设置系统时钟能力的情况下作为NTP服务器运行。
启用控制需要授予SYS_TIME权限,且容器运行时允许该访问:
yaml... cap_add: - SYS_TIME environment: - ENABLE_SYSCLK=true ...
在任何安装了ntpdate的机器上,您可以使用以下命令查询新的NTP容器:
bash$> ntpdate -q <DOCKER_HOST_IP>
以下是我的环境中的示例输出:
bash$> ntpdate -q 10.13.13.9 server 10.13.1.109, stratum 4, offset 0.000642, delay 0.02805 14 Mar 19:21:29 ntpdate[26834]: adjust time server 10.13.13.109 offset 0.000642 sec
如果看到以下消息,可能是时钟尚未同步。稍等片刻后再次查询,该消息应消失:
bash$> ntpdate -q 10.13.13.9 server 10.13.13.9, stratum 16, offset 0.005689, delay 0.02837 11 Dec 09:47:53 ntpdate[26030]: no server suitable for synchronization found
要查看容器的NTP状态,可在Docker主机上运行以下命令:
bash$> docker exec ntp chronyc tracking Reference ID : D8EF2300 (time1.google.com) Stratum : 2 Ref time (UTC) : Sun Mar 15 04:33:30 2020 System time : 0.000054161 seconds slow of NTP time Last offset : -0.000015060 seconds RMS offset : 0.000206534 seconds Frequency : 5.626 ppm fast Residual freq : -0.001 ppm Skew : 0.118 ppm Root delay : 0.022015510 seconds Root dispersion : 0.001476757 seconds Update interval : 1025.2 seconds Leap status : Normal
以下命令可查看对等列表,验证每个配置的NTP源状态:
bash$> docker exec ntp chronyc sources 210 Number of sources = 2 MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^+ time.cloudflare.com 3 10 377 404 -623us[ -623us] +/- 24ms ^* time1.google.com 1 10 377 1023 +259us[ +244us] +/- 11ms
最后,如果想查看每个配置的NTP源的测量统计信息:
bash$> docker exec ntp chronyc sourcestats 210 Number of sources = 2 Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev ============================================================================== time.cloudflare.com 35 18 139m +0.014 0.141 -662us 530us time1.google.com 33 13 128m -0.007 0.138 +318us 460us
如果看到类似以下消息,想知道原因:
$ docker logs -f ntps [...] 2021-05-25T18:41:40Z System clock wrong by -2.535004 seconds 2021-05-25T18:41:40Z Could not step system clock 2021-05-25T18:42:47Z System clock wrong by -2.541034 seconds 2021-05-25T18:42:47Z Could not step system clock
原因是:chronyd运行时带有-x标志,不会尝试控制系统(容器主机)时钟。这是必要的,因为该进程没有修改系统时钟的权限(出于安全考虑)。
与网络中的任何主机一样,只需使用您偏好的NTP客户端从容器主机上运行的NTP容器拉取时间即可。
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务