离线环境下多台服务器的时间同步

离线环境下多台服务器的时间同步

在互联网中,我们的服务器一般都是联网的,所以服务器的时间同步一般都是通过ntp服务来实现的。但是在离线环境下,我们的服务器是无法联网的,
因为无法联网,所以无法使用ntp服务来同步时间。那么在离线环境下,我们如何实现多台服务器的时间同步呢?这里我们可以使用docker来实现。

核心思想就是在一台服务器上启动一个ntp服务,然后将这个ntp服务的时间同步到其他服务器上。

为什么使用docker服务来构建ntp服务器,因为docker服务可以在离线环境下安装,而且安装非常方便,只需要将docker镜像文件拷贝到离线环境下的服务器上。
还有一方面原因,如果安装例如离线的ntp服务,那么需要安装很多依赖包,安装依赖包就意味着会面领依赖性冲突等问题,导致安装过程比较繁琐。

1. 在一台服务器上启动ntp服务(docker)

使用的是 cturra/ntp镜像,此镜像是使用chrony来构建ntp服务器的

  • docker 方式
    1
    2
    # 使用docker构建
    docker run -d --name ntp --restart=always --cap-add SYS_TIME -p 123:123/udp -v /etc/localtime:/etc/localtime:ro cturra/ntp

-d:以后台模式启动容器。
–name ntp:为容器指定名称为“ntp”。
–restart=always:当容器停止或重启时自动重新启动容器。
–cap-add SYS_TIME:向容器授予sys_time功能,该功能允许容器更改系统时间并与外部进行时间同步。
-p 123:123/udp:将容器的123端口映射到主机的123 UDP端口,用于接收NTP时间同步信息。
-v /etc/localtime:/etc/localtime:ro:将宿主机上的/etc/localtime文件挂载到容器中的相应位置,以便容器能够使用宿主机的时区设置。
cturra/ntp:镜像名称,表示要在容器中运行的NTP服务镜像。

实测可以不加 -v /etc/localtime:/etc/localtime:ro, 该容器可能同步了宿主机的时区, 如果不需要修改宿主机时间,则去除cap-add SYS_TIME

  • docker-compose 方式
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # docker-compose.yml
    version: '3.9'

    services:
    ntp:
    image: cturra/ntp:latest
    container_name: ntp
    restart: always
    ports:
    - 123:123/udp
    environment:
    - NTP_SERVERS=127.127.1.1
    - LOG_LEVEL=0
    - TZ=Asia/Shanghai
    - NOCLIENTLOG=false

NTP_SERVERS=127.127.1.1使用本地时间作为ntp服务器的时间源,如果不设置,则使用默认的时间源。由于是离线环境,所以使用本地时间作为时间源。
以供其他服务器同步。

2. 在其他服务器上同步ntp服务器的时间

1
2
3
4
5
6
# 修改timedatectl配置文件
vim /etc/systemd/timesyncd.conf

# 添加如下配置
[Time]
NTP=192.168.1.127

192.168.1.127为第一步的ntp服务器地址

3. 重启时间同步服务

1
2
3
4
5
# 重启时间同步服务
systemctl restart systemd-timesyncd

# 查看时间同步状态
timedatectl status
Donate comment here