发明内容
本申请的目的是解决现有技术的不足,提供一种基于分布式容器的文件拉取或推送方法及装置,能够获得方便地执行容器间、机器间及容器内外文件拷贝和移动操作的效果。
为了实现上述目的,本申请采用以下的技术方案。
首先,本申请提出一种基于分布式容器的文件拉取或推送方法,包括以下步骤:
S100)指定各个分布式容器内待拉取或推送文件的文件路径及文件名称,以及拉取或推送后文件的保存位置;
S200)记录各个分布式容器的自定义名称及所在主机的URL,形成各个分布式容器的配置文件;
S300)遍历配置文件上所记录URL对应的主机以远程连接相应的主机,并生成相应的容器客户端实例;
S400)根据各个分布式容器内待拉取或推送文件的文件路径及文件名称,以及拉取或推送后文件的保存位置,通过容器客户端实例进行文件的拷贝。
进一步地,在本申请的上述方法中,待拉取或推送文件的文件路径及文件名称和拉取或推送后文件的保存位置一并记录在所述配置文件内。
再进一步地,在本申请的上述方法中,所述配置文件以redis数据库的方式缓存。
进一步地,在本申请的上述方法中,所述步骤S300还包括以下子步骤:
S301)由Python脚本读取缓存在redis数据库内的所述配置文件;
S302)基于配置文件所记录主机的URL,通过docker-py库远程连接至各个分布式容器所在的主机;
S303)获取已远程连接主机的容器客户端实例。
进一步地,在本申请的上述方法中,所述步骤S300还包括以下后继处理步骤:
自动生成错误日志以记录远程连接失败的容器,所述错误日志至少包括相关主机的URL及失败类型。
再进一步地,在本申请的上述方法中,所述步骤S400包括以下子步骤:
S401)获取各个分布式容器内待拉取或推送文件的文件路径及文件名称,以及拉取或推送后文件的保存位置;
S402)调用各个容器客户端实例的get_archive接口,将指定的文件拷贝到相应容器指定的保存位置。
进一步地,在本申请的上述方法中,调用各个容器客户端实例的get_archive接口拷贝文件时,添加容器标识到被拷贝文件的文件名称。
其次,本申请还提出一种基于分布式容器的文件拉取或推送装置,包括以下模块:初始化模块,用于指定各个分布式容器内待拉取或推送文件的文件路径及文件名称,以及拉取或推送后文件的保存位置;记录模块,用于记录各个分布式容器的自定义名称及所述容器所在主机的URL,形成各个分布式容器的配置文件;遍历模块,用于遍历配置文件上所记录URL对应的主机以远程连接相应的主机,并生成相应的容器客户端实例;拷贝模块,用于根据各个分布式容器内待拉取或推送文件的文件路径及文件名称,以及拉取或推送后文件的保存位置,通过容器客户端实例进行文件的拷贝。
进一步地,在本申请的上述装置中,待拉取或推送文件的文件路径及文件名称和拉取或推送后文件的保存位置一并记录在所述配置文件内。
再进一步地,在本申请的上述装置中,所述配置文件以redis数据库的方式缓存。
进一步地,在本申请的上述装置中,所述遍历模块还包括以下子模块:读取模块,用于由Python脚本读取缓存在redis数据库内的所述配置文件;连接模块,用于基于配置文件所记录主机的URL,通过docker-py库远程连接至各个分布式容器所在的主机;第一获取模块,用于获取已远程连接主机的容器客户端实例。
进一步地,在本申请的上述装置中,所述遍历模块还包括以下后继处理模块:日志模块,用于自动生成错误日志以记录远程连接失败的容器,所述错误日志至少包括相关主机的URL及失败类型。
再进一步地,在本申请的上述装置中,所述拷贝模块包括以下子模块:第二获取模块,用于获取各个分布式容器内待拉取或推送文件的文件路径及文件名称,以及拉取或推送后文件的保存位置;调用模块,用于调用各个容器客户端实例的get_archive接口,将指定的文件拷贝到相应容器指定的保存位置。
进一步地,在本申请的上述装置中,调用各个容器客户端实例的get_archive接口拷贝文件时,添加容器标识到被拷贝文件的文件名称。
最后,本申请还提出一种计算机可读存储介质,其上存储有计算机指令。该指令被处理器执行时实现以下方法的步骤:
S100)指定各个分布式容器内待拉取或推送文件的文件路径及文件名称,以及拉取或推送后文件的保存位置;
S200)记录各个分布式容器的自定义名称及所在主机的URL,形成各个分布式容器的配置文件;
S300)遍历配置文件上所记录URL对应的主机以远程连接相应的主机,并生成相应的容器客户端实例;
S400)根据各个分布式容器内待拉取或推送文件的文件路径及文件名称,以及拉取或推送后文件的保存位置,通过容器客户端实例进行文件的拷贝。
进一步地,在本申请的上述指令被处理器执行的过程中,待拉取或推送文件的文件路径及文件名称和拉取或推送后文件的保存位置一并记录在所述配置文件内。
再进一步地,在本申请的上述指令被处理器执行的过程中,所述配置文件以redis数据库的方式缓存。
进一步地,在本申请的上述指令被处理器执行的过程中,所述步骤S300还包括以下子步骤:
S301)由Python脚本读取缓存在redis数据库内的所述配置文件;
S302)基于配置文件所记录主机的URL,通过docker-py库远程连接至各个分布式容器所在的主机;
S303)获取已远程连接主机的容器客户端实例。
进一步地,在本申请的上述指令被处理器执行的过程中,所述步骤S300还包括以下后继处理步骤:
自动生成错误日志以记录远程连接失败的容器,所述错误日志至少包括相关主机的URL及失败类型。
再进一步地,在本申请的上述指令被处理器执行的过程中,所述步骤S400包括以下子步骤:
S401)获取各个分布式容器内待拉取或推送文件的文件路径及文件名称,以及拉取或推送后文件的保存位置;
S402)调用各个容器客户端实例的get_archive接口,将指定的文件拷贝到相应容器指定的保存位置。
进一步地,在本申请的上述指令被处理器执行的过程中,调用各个容器客户端实例的get_archive接口拷贝文件时,添加容器标识到被拷贝文件的文件名称。
本申请的有益效果为:通过配置文件指定各个容器内拉取和推送文件及其拷贝和移动后的位置,实现了方便快捷地在多个分布式容器间的文件拷贝和移动。
具体实施方式
以下将结合实施例和附图对本申请的构思、具体结构及产生的技术效果进行清楚、完整的描述,以充分地理解本申请的目的、方案和效果。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
需要说明的是,如无特殊说明,当某一特征被称为“固定”、“连接”在另一个特征,它可以直接固定、连接在另一个特征上,也可以间接地固定、连接在另一个特征上。此外,本申请中所使用的上、下、左、右等描述仅仅是相对于附图中本申请各组成部分的相互位置关系来说的。在本申请和所附权利要求书中所使用的单数形式的“一种”、“该”和“所述”也旨在包括多数形式,除非上下文清楚地表示其他含义。
此外,除非另有定义,本文所使用的所有的技术和科学术语与本技术领域的技术人员通常理解的含义相同。本文说明书中所使用的术语只是为了描述具体的实施例,而不是为了限制本申请。本文所使用的术语“和/或”包括一个或多个相关的所列项目的任意的组合。
应当理解,尽管在本申请中可能采用术语第一、第二、第三等来描述各种元件,但这些元件不应限于这些术语。这些术语仅用来将同一类型的元件彼此区分开。例如,在不脱离本申请范围的情况下,第一元件也可以被称为第二元件,类似地,第二元件也可以被称为第一元件。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”。
参考图1所示的现有的虚拟机和容器结构示意图。作为虚拟化技术的两个典型例子,虚拟机和容器包含应用程序及运行该应用程序的所必需的组件(例如系统的二进制文件及库),并分别通过运行在物理计算机上的虚拟机监控器(Hypervisor)和容器引擎(Docker Engine)申请位于系统底层的计算机硬件资源。对于虚拟机和容器,底层的单个计算机硬件资源(例如服务器、存储设备、中央处理器、I/O端口和网络端口等)由于被虚拟化而可以充当多个可被共享的逻辑资源。同时,主机操作系统(Operation System,OS)亦可以为上述虚拟机监控器和容器引擎与底层计算机硬件资源的交互提供进一步优化。例如,主机OS可支持多个空间上相互隔离的用户通过虚拟机或容器共享底层的计算机硬件资源。其中主机OS的一些示例可以是
和
然而,正如前文所指出,虚拟机由于其自身操作系统需要专门占用更多的资源并包含更多的处理开销,从而降低了主机设备的总体性能。虽然容器通过共享主机OS的内核而实现自身的轻量化,但是由于同一机器上容器之间共享该物理机器的网络资源,因此容器的原生拷贝命令docker cp只能实现在本机器上的容器之间的文件拷贝操作。
因此,为了充分利用容器的轻量化优势,并实现分布式容器之间的文件拉取或推送,本申请提出了一种基于分布式容器的文件拉取或推送方法。参考图2所示的方法流程图,在本申请的一个或多个实施例中,上述基于分布式容器的文件拉取或推送方法包括以下步骤:
S100)指定各个分布式容器内待拉取或推送文件的文件路径及文件名称,以及拉取或推送后文件的保存位置;
S200)记录各个分布式容器的自定义名称及所在主机的URL,形成各个分布式容器的配置文件;
S300)遍历配置文件上所记录URL对应的主机以远程连接相应的主机,并生成相应的容器客户端实例;
S400)根据各个分布式容器内待拉取或推送文件的文件路径及文件名称,以及拉取或推送后文件的保存位置,通过容器客户端实例进行文件的拷贝。
具体地,待拉取或推送文件的文件路径及文件名称和拉取或推送后文件的保存位置可采用以下方法,与各个分布式容器的自定义名称及所在主机的URL一并记录在所述配置文件内。
[pull]
local_path=/home/logs/containers/
container_file=/home/work/server/logs/error.log
[push]
container_path=/home/work/server/conf/
local_path=/home/demo/server/conf/proxy.conf
[container]
c780a139_slaver_74=tcp://10.20.77.94:2375
c780a139_slaver_72=tcp://10.20.69.251:2375
c780a139_slaver_73=tcp://10.20.77.96:2375
c780a139_slaver_34=tcp://10.20.77.99:2375
c780a139_slaver_47=tcp://10.20.69.251:2375
c780a139_slaver_10=tcp://10.20.75.122:2375
其中,pull配置下的local_path和container_file变量分别指定拉取后本机文件路径和容器内需要被拉取的文件;相应地,push配置下的local_file和container_path变量分别指定了需要推送的本机文件和容器内需要被推送文件保存的路径。container配置指定了分布式容器的自定义名称及该容器所在机器的URL。上述配置文件可以文本文件的方法存储,从而可以方便快捷地读/写该配置文件。例如分布式容器的维护人员可以动态地定期更新各台机器所分配的URL,或者增加/删除容器。可替代地,在本申请的一个或多个实施例中,上述配置也可以直接通过批处理文件以命令行的方式实现。此时,分布式容器的维护人员只需要维护用于执行上述方法的批处理文件内与分布式容器相关的配置参数(例如上述拉取后本机文件路径和容器内需要被拉取的文件等等),然后再直接执行该批处理文件以实现相关文件的拉取或推送。
进一步地,在本申请的上述一个或多个实施例中,所述配置文件以redis数据库的方式缓存。尤其是当在多台分布式机器上搭建大量容器时,由于redis是一个高性能的key-value数据库,同时能够支持主从同步(即数据可以从主服务器向任意数量的从服务器上同步,且从服务器可以是关联其他从服务器的主服务器),从而更为方便快捷地获取全部分布式容器的上述配置参数,并进行管理。
具体地,参照图3所示的子方法流程图,在本申请的上述一个或多个实施例中,所述步骤S300还包括以下子步骤:
S301)由Python脚本读取缓存在redis数据库内的所述配置文件;
S302)基于配置文件所记录主机的URL,通过docker-py库远程连接至各个分布式容器所在的主机;
S303)获取已远程连接主机的容器客户端实例。
具体地,分布式容器之间的远程连接可以通过docker-py库中所提供的API接口实现。分布式容器的远程操作(例如文件的拷贝和移动)也可以通过已远程连接主机的容器客户端实例而方便地执行,从而实现多个分布式容器之间的文件拷贝转移操作。
然而,可能由于分布式容器的各个模块之间版本不切合、机器所配置的URL错误等原因而导致利用上述docker-py库实现分布式容器之间的远程连接可能会导致失败。为了方便调整各个分布式容器的参数以实现它们之间的远程连接,在本申请的上述一个或多个实施例中,所述步骤S300还包括以下后继处理步骤:自动生成错误日志以记录远程连接失败的容器,所述错误日志至少包括相关主机的URL及失败类型。错误日志可以保存为可读的外部文件,以方便分布式容器的维护人员针对性地对调整各个分布式容器的配置。
参照图4所示的子方法流程图,在本申请的上述一个或多个实施例中,所述步骤S400包括以下子步骤:
S401)获取各个分布式容器内待拉取或推送文件的文件路径及文件名称,以及拉取或推送后文件的保存位置;
S402)调用各个容器客户端实例的get_archive接口,将指定的文件拷贝到相应容器指定的保存位置。
上述执行步骤可以Python脚本的方式实现,从而实现一键完成相关文件的拉取或推送。同时,由于上述方法所调用到的get_archive等接口都是原生的,因此相关命令的执行稳定高效。此外,为了方便地区别从各个分布式容器所拉取的文件,在本申请的上述一个或多个实施例中,在调用各个容器客户端实例的get_archive接口拷贝文件时,添加容器标识到被拷贝文件的文件名称。例如,该容器标识可以是被拉取的文件名称的前缀,该前缀为各个分布式容器的名称。
本申请还提出了一种基于分布式容器的文件拉取或推送装置。参考图5所示的模块结构图,在本申请的一个或多个实施例中,上述基于分布式容器的文件拉取或推送装置包括以下模块:初始化模块,用于指定各个分布式容器内待拉取或推送文件的文件路径及文件名称,以及拉取或推送后文件的保存位置;记录模块,用于记录各个分布式容器的自定义名称及所述容器所在主机的URL,形成各个分布式容器的配置文件;遍历模块,用于遍历配置文件上所记录URL对应的主机以远程连接相应的主机,并生成相应的容器客户端实例;拷贝模块,用于根据各个分布式容器内待拉取或推送文件的文件路径及文件名称,以及拉取或推送后文件的保存位置,通过容器客户端实例进行文件的拷贝。具体地,待拉取或推送文件的文件路径及文件名称和拉取或推送后文件的保存位置可采用以下方法,与各个分布式容器的自定义名称及所在主机的URL一并记录在所述配置文件内。
[pull]
local_path=/home/logs/containers/
container_file=/home/work/server/logs/error.log
[push]
container_path=/home/work/server/conf/
local_path=/home/demo/server/conf/proxy.conf
[container]
c780a139_slaver_74=tcp://10.20.77.94:2375
c780a139_slaver_72=tcp://10.20.69.251:2375
c780a139_slaver_73=tcp://10.20.77.96:2375
c780a139_slaver_34=tcp://10.20.77.99:2375
c780a139_slaver_47=tcp://10.20.69.251:2375
c780a139_slaver_10=tcp://10.20.75.122:2375
其中,pull配置下的local_path和container_file变量分别指定拉取后本机文件路径和容器内需要被拉取的文件;相应地,push配置下的local_file和container_path变量分别指定了需要推送的本机文件和容器内需要被推送文件保存的路径。container配置指定了分布式容器的自定义名称及该容器所在机器的URL。上述配置文件可以文本文件的方法存储,从而可以方便快捷地读/写该配置文件。例如分布式容器的维护人员可以动态地定期更新各台机器所分配的URL,或者增加/删除容器。可替代地,在本申请的一个或多个实施例中,上述配置也可以直接通过批处理文件以命令行的方式实现。此时,分布式容器的维护人员只需要维护用于执行上述方法的批处理文件内与分布式容器相关的配置参数(例如上述拉取后本机文件路径和容器内需要被拉取的文件等等),然后再直接执行该批处理文件以实现相关文件的拉取或推送。
进一步地,在本申请的上述一个或多个实施例中,所述配置文件以redis数据库的方式缓存。尤其是当在多台分布式机器上搭建大量容器时,由于redis是一个高性能的key-value数据库,同时能够支持主从同步(即数据可以从主服务器向任意数量的从服务器上同步,且从服务器可以是关联其他从服务器的主服务器),从而更为方便快捷地获取全部分布式容器的上述配置参数,并进行管理。
具体地,在本申请的上述一个或多个实施例中,所述遍历模块还包括以下子模块:读取模块,用于由Python脚本读取缓存在redis数据库内的所述配置文件;连接模块,用于基于配置文件所记录主机的URL,通过docker-py库远程连接至各个分布式容器所在的主机;第一获取模块,用于获取已远程连接主机的容器客户端实例。具体地,分布式容器之间的远程连接可以通过docker-py库中所提供的API接口实现。分布式容器的远程操作(例如文件的拷贝和移动)也可以通过已远程连接主机的容器客户端实例而方便地执行,从而实现多个分布式容器之间的文件拷贝转移操作。
然而,可能由于分布式容器的各个模块之间版本不切合、机器所配置的URL错误等原因而导致利用上述docker-py库实现分布式容器之间的远程连接可能会导致失败。为了方便调整各个分布式容器的参数以实现它们之间的远程连接,在本申请的上述一个或多个实施例中,所述遍历模块还包括以下后继处理模块:日志模块,用于自动生成错误日志以记录远程连接失败的容器,所述错误日志至少包括相关主机的URL及失败类型。错误日志可以保存为可读的外部文件,以方便分布式容器的维护人员针对性地对调整各个分布式容器的配置。
在本申请的上述一个或多个实施例中,所述拷贝模块包括以下子模块:第二获取模块,用于获取各个分布式容器内待拉取或推送文件的文件路径及文件名称,以及拉取或推送后文件的保存位置;调用模块,用于调用各个容器客户端实例的get_archive接口,将指定的文件拷贝到相应容器指定的保存位置。上述模块可以Python脚本的方式实现,从而实现一键完成相关文件的拉取或推送。同时,由于上述方法所调用到的get_archive等接口都是原生的,因此相关命令的执行稳定高效。此外,为了方便地区别从各个分布式容器所拉取的文件,在本申请的上述一个或多个实施例中,在调用各个容器客户端实例的get_archive接口拷贝文件时,添加容器标识到被拷贝文件的文件名称。例如,该容器标识可以是被拉取的文件名称的前缀,该前缀为各个分布式容器的名称。
应当认识到,本申请的实施例可以由计算机硬件、硬件和软件的组合、或者通过存储在非暂时性计算机可读存储器中的计算机指令来实现或实施。该方法可以使用标准编程技术-包括配置有计算机程序的非暂时性计算机可读存储介质在计算机程序中实现,其中如此配置的存储介质使得计算机以特定和预定义的方式操作——根据在具体实施例中描述的方法和附图。每个程序可以以高级过程或面向对象的编程语言来实现以与计算机系统通信。然而,若需要,该程序可以以汇编或机器语言实现。在任何情况下,该语言可以是编译或解释的语言。此外,为此目的该程序能够在编程的专用集成电路上运行。
进一步地,该方法可以在可操作地连接至合适的任何类型的计算平台中实现,包括但不限于个人电脑、迷你计算机、主框架、工作站、网络或分布式计算环境、单独的或集成的计算机平台、或者与带电粒子工具或其它成像装置通信等等。本申请的各方面可以以存储在非暂时性存储介质或设备上的机器可读代码来实现,无论是可移动的还是集成至计算平台,如硬盘、光学读取和/或写入存储介质、RAM、ROM等,使得其可由可编程计算机读取,当存储介质或设备由计算机读取时可用于配置和操作计算机以执行在此所描述的过程。此外,机器可读代码,或其部分可以通过有线或无线网络传输。当此类媒体包括结合微处理器或其他数据处理器实现上文该步骤的指令或程序时,本文所述的申请包括这些和其他不同类型的非暂时性计算机可读存储介质。当根据本申请所述的方法和技术编程时,本申请还包括计算机本身。
计算机程序能够应用于输入数据以执行本文所述的功能,从而转换输入数据以生成存储至非易失性存储器的输出数据。输出信息还可以应用于一个或多个输出设备如显示器。在本申请优选的实施例中,转换的数据表示物理和有形的对象,包括显示器上产生的物理和有形对象的特定视觉描绘。
因此,应以说明性意义而不是限制性意义来理解本说明书和附图。然而,将明显的是:在不脱离如权利要求书中阐述的本申请的更宽广精神和范围的情况下,可以对本申请做出各种修改和改变。
其他变型在本申请的精神内。因此,尽管所公开的技术可容许各种修改和替代构造,但在附图中已示出并且在上文中详细描述所示的其某些实施例。然而,应当理解,并不意图将本申请局限于所公开的一种或多种具体形式;相反,其意图涵盖如所附权利要求书中所限定落在本申请的精神和范围内的所有修改、替代构造和等效物。