Login| Sign Up| Help| Contact|

Patent Searching and Data


Title:
METHOD AND SYSTEM FOR STARTING APPLICATION IN LINUX CONTAINER
Document Type and Number:
WIPO Patent Application WO/2012/167529
Kind Code:
A1
Abstract:
A method for starting an application in a Linux container, including: a container starting process creating a container according to a command that a user inputs, creating a first application starting process, and putting the first application starting process into the container for performing same; the first application starting process acquiring the number N of applications to be started according to the command that the user inputs, and creating N-1 second application starting processes, wherein N is a positive integer not less than 2; and the first application starting process and the N-1 second application starting processes starting the N applications in the container, wherein each application starting process starts one application. Also provided correspondingly is a Linux system. The technical solution of the present invention adopts the technical solution that, when creating a container, a plurality of application starting processes is created, with each application starting process starting one application, meaning that a plurality of applications can be started simultaneously when creating a container.

Inventors:
ZHANG HONGHUI (CN)
Application Number:
PCT/CN2011/081168
Publication Date:
December 13, 2012
Filing Date:
October 24, 2011
Export Citation:
Click for automatic bibliography generation   Help
Assignee:
HUAWEI TECH CO LTD (CN)
ZHANG HONGHUI (CN)
International Classes:
G06F9/445
Foreign References:
CN101639787A2010-02-03
CN101178662A2008-05-14
CN1890643A2007-01-03
Other References:
See also references of EP 2746936A4
None
Attorney, Agent or Firm:
SHENPAT INTELLECTUAL PROPERTY AGENCY (CN)
深圳市深佳知识产权代理事务所(普通合伙) (CN)
Download PDF:
Claims:
权 利 要 求

1、 一种在 Linux容器中启动应用程序的方法, 其特征在于, 包括: 容器启动进程根据用户输入的命令创建容器,随后所述容器启动进程作为 所述容器的容器守护进程存在;

所述容器启动进程创建第一应用启动进程,并将所述第一应用启动进程放 入所述容器中执行;

所述第一应用启动进程根据用户输入的命令获取待启动的应用程序的个 数 N, 并创建 N-1个第二应用启动进程, N为不小于 2的正整数;

所述的第一应用启动进程和 N- 1个第二应用启动进程在所述容器中启动所 述的 N个待启动的应用程序, 其中每个第一或第二应用启动进程启动一个待启 动的应用程序。

2、根据权利要求 1所述的方法, 其特征在于, 所述容器启动进程根据用户 输入的命令创建容器还包括:

容器启动进程获取用户输入的命令;

根据容器名称和配置文件路径名称创建容器,所述容器名称是所述命令中 指定的, 所述配置文件路径名称是所述命令中指定的或者是默认的。

3、根据权利要求 1所述的方法, 其特征在于, 所述的第一应用启动进程和 N-1个第二应用启动进程在所述容器中启动所述的 N个待启动的应用程序包 括:

所述第一或第二应用启动进程按照设定的对应关系启动相应的待启动的 应用程序, 所述对应关系为应用启动进程与待启动的应用程序的对应关系。

4、 根据权利要求 1至 3中任一所述的方法, 其特征在于, 所述的第一应用 启动进程和 N-1个第二应用启动进程在所述容器中启动所述的 N个待启动的应 用程序之后还包括:

所述容器守护进程收到容器销毁命令后, 终止所述容器中的所有进程; 所述容器守护进程检测到所述容器中的初始进程终止后, 将所述容器销 毁。

5、根据权利要求 4所述的方法, 其特征在于, 所述终止所述容器中的所有 进程包括:

向容器内的进程组发送 SIGKILL信号或者向容器内的所有进程分別发送 SIGKILL信号, 将容器中的所有进程终止。

6、一种 Linux系统, 包括中央处理器, 其特征在于, 所述中央处理器包括: 容器启动进程单元, 第一应用启动进程单元, 和第二应用启动进程;

所述容器启动进程单元, 用于根据用户输入的命令创建容器, 随后作为容 器守护进程单元存在,创建所述第一应用启动进程单元, 并将所述第一应用启 动进程单元放入所述容器中执行;

所述第一应用启动进程单元,用于根据用户输入的命令获取待启动的应用 程序的个数 N, 并创建 N-1个所述第二应用启动进程单元, N为不小于 2的正整 数;

所述第一应用启动进程单元和每个第二应用启动进程单元用于启动一个 待启动的应用程序。

7、根据权利要求 6所述的方法,其特征在于,所述容器启动进程单元包括: 容器创建子单元, 用于获取用户输入的命令,根据容器名称和配置文件路 径名称创建容器, 所述容器名称是所述命令中指定的, 所述配置文件路径名称 是所述命令中指定的或者是默认的。

8、 根据权利要求 6所述的方法, 其特征在于:

所述第一或第二应用启动进程单元具体用于按照设定的对应关系启动相 应的待启动的应用程序,所述对应关系为应用启动进程与待启动的应用程序的 对应关系。

9、 根据权利要求 6至 8中任一所述的方法, 其特征在于:

所述容器守护进程单元还用于收到容器销毁命令后,终止所述容器中的所 有进程, 检测到所述容器中的初始进程终止后, 将所述容器销毁。

10、 根据权利要求 9所述的方法, 其特征在于: 者向容器内的所有进程分別发送 SIGKILL信号, 将容器中的所有进程终止。

Description:
在 Linux容器中启动应用程序的方法和系统 技术领域

本发明涉及操作系统技术领域,具体涉及一种 在 Linux容器中启动应用程 序的方法和一种 Linux系统。

背景技术

Linux系统中, 容器(Container )可以提供轻量级的虚拟化, 以便隔离进 程和资源。 容器可以有效地将由单个操作系统管理的资源 划分到孤立的组中, 以更好地在孤立的组之间平衡有沖突的资源使 用需求。 与其他虚拟化方案相 比, 既不需要指令级模拟, 也不需要即时编译。 容器可以在核心中央处理器 ( CPU ) 本地运行指令, 不需要任何专门的解释机制。 避免了准虚拟化 ( paravirtualization )和系统调用替换中的复杂性。

通过提供一种创建和进入容器的方式, Linux操作系统可以让应用程序就 像在独立的机器上运行一样,但又能共享很多 底层的资源。容器在提供隔离的 同时, 还通过共享资源节省开销, 容器比真正的虚拟化的开销要小得多。

请参考图 1 , Linux容器(Linux Container, LXC )根据用户输入的命令, ^口 lxc-start ... [command] , 启动应用程序, ;巟程: ¾口下:

容器启动进程创建一个新的容器, 同时作为该容器的守护进程存在; 容器启动进程创建一个应用启动进程,并将该 应用启动进程放入容器中执 行, 然后该应用启动进程根据用户输入的命令行参 数初始化容器;

应用启动进程根据用户从命令行传递的命令, 在容器内启动应用程序, 该 应用程序进程是容器中的初始 (init )进程;

当需要将其他应用程序放入容器中执行的时候 ,首先需要在容器外将该应 用程序启动, 并获得该应用程序的进程标识符( Process IDentity, PID )列表, 然后将当前进程 PID写入控制文件中使进程执行环境向容器中迁 移,使得该应 用程序在容器中执行, 且每次是以进程为粒度执行;

当调用容器销毁命令后, 容器守护进程作为容器销毁进程存在, 容器守护 进程通过套接字通信获取容器中进程组的组标 识符(Identity, ID ), 通过 kill() 系统调用向容器内进程组发送 SIGKILL信号, 将容器中的进程组终止; 容器 守护进程检测到容器中的 init进程已经死亡终止后, 该容器守护进程退出, 实 现将容器销毁。

上述现有的在 Linux容器中启动应用程序的方法,在容器创建 只能启动 一个应用程序,如果需要在容器中启动另外的 应用程序, 则需要先在容器外部 将应用程序启动, 然后再将应用程序的进程放入容器中执行, 操作较为繁瑣, 且操作过程中改变了应用程序的执行环境。进 一步的,如果需要另外启动的应 用程序是多进程应用, 则需要获取该应用程序所有进程的 PID, 分多次手动将 当前应用进程 PID写入控制文件,这就要求使用容器的系统管 理员必须对应用 程序比较熟悉才能完成上述操作, 操作复杂, 出错概率高。 另外, 当应用程序 部分进程处于容器内部, 部分进程处于容器外部时, 由于容器本身的隔离性, 可能会导致应用程序故障。

发明内容

本发明实施例提供一种在 Linux容器中启动应用程序的方法和一种 Linux 系统, 可以在容器创建时启动多个应用程序。

一种在 Linux容器中启动应用程序的方法, 包括:

容器启动进程根据用户输入的命令创建容器, 随后所述容器启动进程作为 所述容器的容器守护进程存在;

所述容器启动进程创建第一应用启动进程,并 将所述第一应用启动进程放 入所述容器中执行;

所述第一应用启动进程根据用户输入的命令获 取待启动的应用程序的个 数 N, 并创建 N-1个第二应用启动进程, N为不小于 2的正整数;

所述的第一应用启动进程和 N- 1个第二应用启动进程在所述容器中启动所 述的 N个待启动的应用程序, 其中每个第一或第二应用启动进程启动一个待 启 动的应用程序。

一种 Linux系统, 包括中央处理器, 其特征在于, 所述中央处理器包括: 容器启动进程单元, 第一应用启动进程单元, 和第二应用启动进程;

所述容器启动进程单元, 用于根据用户输入的命令创建容器, 随后作为容 器守护进程单元存在,创建所述第一应用启动 进程单元, 并将所述第一应用启 动进程单元放入所述容器中执行; 所述第一应用启动进程单元,用于根据用户输 入的命令获取待启动的应用 程序的个数 N, 并创建 N-1个所述第二应用启动进程单元, N为不小于 2的正整 数;

所述第一应用启动进程单元每个第二应用启动 进程单元用于启动一个待 启动的应用程序。

本发明实施例采用在容器创建时,先创建第一 应用启动进程, 由第一应用 启动进程创建一个以上第二应用启动进程,然 后每个应用启动进程启动一个应 用程序的技术方案, 使得在容器创建时, 通过一条命令, 就可以同时启动多个 应用程序。

附图说明

图 1是现有的在 Linux容器中启动应用程序的方法的流程图;

图 2是本发明实施例一的在 Linux容器中启动应用程序的方法的流程图; 图 3是本发明实施例二的在 Linux容器中启动应用程序的方法的流程图; 图 4是本发明实施例提供的 Linux系统的示意图。

具体实施方式

本发明实施例提供一种在 Linux容器中启动应用程序的方法,采用在容器 创建时,创建多个应用启动进程,每个应用启 动进程启动一个应用程序的技术 方案, 使得在容器创建时可以同时启动多个应用程序 。 以下进行详细说明。

请参考图 2 , 本发明实施例提供一种在 Linux容器中启动应用程序的方法, 包括:

步骤 101、 容器启动进程根据用户输入的命令创建容器, 随后所述容器启 动进程作为所述容器的容器守护进程存在;

对于 Linux操纵系统( operating system, OS ), 用户可以通过在命令行输入 命令, 实现在 Linux容器中创建容器和在创建的容器中启动应 程序。 所说的 命令可以是 lxc-stard... [command] ,该命令的命令行参数中包括以下内容:待创 建的容器名称、待启动的应用程序路径名称、 应用程序个数和配置文件路径名 称。 其中, 容器名称和应用程序路径名称是必要的, 应用程序路径名称包括多 个, 应用程序个数和配置文件路径名称则是可选的 。

获取用户输入的命令后, OS中的当前进程, 即, 用于执行用户输入的命 令的进程, 作为容器启动进程, 根据命令行参数创建一个容器。 创建容器就是 将一个容器名称与一个配置文件关联起来。 所述配置文件用于指定容器的属 性, 例如容器的主机名、 网络、 root文件系统等, 该配置文件是预先建立的。 若命令行参数中没有包括配置文件的路径名称 ,容器启动进程可以根据默认的 配置文件创建容器; 若命令行参数中包括了配置文件的路径名称, 则容器启动 进程可以根据该指定的配置文件创建容器。

步骤 102、 容器启动进程创建第一应用启动进程, 并将所述第一应用启动 进程放入所述容器中执行。

容器启动进程创建第一应用启动进程后,所述 容器启动进程与第一应用启 动进程会有一个同步的过程, 该过程中两个进程协商彼此的信息交互格式, 以 便相互传递信息。 然后, 容器启动进程将第一应用启动进程放入所述容 器中执 行, 在容器中, 这两个进程可以互相合作、 互相等待。 第一应用启动进程是容 器内执行的第一个进程, 可以称为初始 (init )进程。

可选的, 所述第一应用启动进程可以根据用户输入的命 令初始化所述容 器。 所述初始化包括: 根据用户在命令行输入的容器配置选项, 完成对容器资 源属性的配置, 例如: 配置容器的 CPU节点绑定限制等信息。

步骤 103、 所述第一应用启动进程根据用户输入的命令获 取待启动的应用 程序的个数 N, 并创建 N-1个第二应用启动进程, N为不小于 2的整数。

用户输入的命令行参数中可以包括应用程序的 个数 N , 供第一应用进程从 命令行参数中获取。 若命令行参数中没有包括应用程序的个数 N, 则第一应用 进程可以解析命令行参数, 统计其中包括的应用程序路径名称的个数, 获取应 用程序的个数 N。 为了启动该 N个程序, 第一应用启动进程在容器中另外创建 N- 1个第二应用启动进程。 第一应用启动进程可以利用 fork()系统调用来创建 N 个第二应用启动进程, fork()是 Linux系统的一种内核接口, 用于创建子进程。

步骤 104、所述的第一应用启动进程和 N-1个第二应用启动进程在所述容 器中启动所述的 N个待启动的应用程序, 其中每个第一或第二应用启动进程 启动一个待启动的应用程序。

这 N个应用启动进程可以利用 execvpO系统调用来启动应用程序, execvp() 为 Linux系统的另一种内核接口,用于启动给定路 名称的应用程序。 N个应用 启动进程在容器中启动 N个应用程序具体可以包括: N个应用启动进程按照设 定的对应关系启动相应的应用程序,所述对应 关系为应用启动进程与应用程序 的对应关系, 例如, 可以将应用启动进程的 PID与命令行参数中输入应用程序 路径名称的顺序相对应。 具体的, 可以按照 PID从大到小的顺序将 N个应用启 动进程与输入 N个应用程序对应,使得 PID最大的应用启动进程启动第 1个应用 程序, PID最小的应用启动进程启动第 N个应用程序; 或者, 使 PID最小的应用 启动进程启动第 1个应用程序, PID最大的应用启动进程启动第 N个应用程序; 当然, 也可以按照其它的对应关系。

可选的, 步骤 104之后还可以包括:

容器守护进程获取用户输入的容器销毁命令后 , 终止容器中的所有进程 组; 所述容器守护进程检测到所述容器中的初始进 程被终止后,将所述容器销 毁。 此过程中, 容器守护进程作为容器销毁进程存在。 值得说明的是, 本文中 提到的容器启动进程、 容器守护进程和容器销毁进程实质是同一个进 程。

其中,容器守护进程可以通过套接字通信获取 容器中进程组的组 ID, 然后 利用 kill()系统调用向容器内的进程组发送 SIGKILL信号,将容器中的所有进程 终止; 容器守护进程也可以获取容器中所有进程的 ID,直接向所有进程分別发 送 SIGKILL信号, 将容器中的所有进程终止。 所说的进程组是容器中进程的组 合, 包括了第一应用启动进程和 N-1个第二应用启动进程。

以上, 本发明实施例提供了一种在 Linux容器中启动应用程序的方法, 采 用在容器创建时, 由第一应用启动进程创建多个第二应用启动进 程, 其中每个 应用启动进程启动一个应用程序的技术方案, 使得在容器创建时可以同时启动 多个应用程序在容器中执行, 实现了通过一条命令同时启动多个应用程序。 该 技术方案筒化了应用程序的启动步骤, 在启动过程中, 不会改变应用程序的执 行环境, 尤其在启动多进程应用时, 用户不需要知道多进程应用程序具体包括 哪些进程, 多进程应用也不会发生部分进程处于容器内部 、部分进程处于容器 外部的问题, 不会因此导致故障。

下面结合图 3进行对本实施例提供的方法做进一步详细的 明: 用户通过在命令行输入命令,实现创建一个容 器并在创建的容器中启动多 个应用程序, 其中, 只需要输入一条命令即可。 下面分別以容器启动进程和应 用启动进程作为执行主体, 对本发明实施例提供的方法进行说明:

一、 对于容器启动进程:

容器启动进程根据用户输入的命令创建一个容 器,并在容器中创建一个第 一应用启动进程, 后续容器启动进程作为该容器的容器守护进程 存在。

然后, 容器启动进程和第一应用启动进程进行同步, 协商信息交互格式。 然后, 容器启动进程将第一应用启动进程放入创建的 容器中执行。

然后, 容器启动进程执行函数 Poll, 作用是把当前的文件指针挂到设备内 部定义的等待, 本实施例中定义内部的等待为等待容器销毁命 令。

然后, 当用户调用容器销毁命令后, 容器守护进程销毁该容器。

二、 对于应用启动进程:

第一应用启动进程被创建后,先与容器启动进 程进行同步,协商信息交互 格式。

然后, 第一应用启动进程根据用户输入的命令初始化 所述容器。

然后,第一应用启动进程获取根据用户输入的 命令获取待启动的应用程序 的个数 N, 并创建 N-1个第二应用启动进程, N为不小于 2的整数。

然后,第一应用启动进程和 N- 1个第二应用启动进程在容器中启动所述的 N个待启动的应用程序,其中第一或第二每个 用启动进程启动一个待启动的 应用程序。

综上, 本发明实施例提供了一种在 Linux容器中启动应用程序的方法, 采 用该技术方案, 用户可以在创建容器时,通过一条命令在容器 中同时启动多个 应用程序, 方便了容器的管理和使用, 增强了容器的可用性和可管理性。

请参考图 4, 本发明实施例还提供一种 Linux系统, 包括中央处理器, 所 述中央处理器包括:

容器启动进程单元, 第一应用启动进程单元, 和第二应用启动进程单元; 所述容器启动进程单元, 用于根据用户输入的命令创建容器, 随后作为容 器守护进程单元存在,创建所述第一应用启动 进程单元, 并将所述第一应用启 动进程单元放入所述容器中执行; 所述第一应用启动进程单元,用于根据用户输 入的命令获取待启动的应用 程序的个数 N, 并创建 N-1个所述第二应用启动进程单元, N为不小于 2的正整 数;所述第一应用启动进程单元和每个第二应 用启动进程单元用于启动一个待 启动的应用程序。

进一步的, 所述容器启动进程单元可以包括:

容器创建子单元, 用于获取用户输入的命令,根据容器名称和配 置文件路 径名称创建容器, 所述容器名称是所述命令中指定的, 所述配置文件路径名称 是所述命令中指定的或者是默认的。

进一步的,所述第一或第二应用启动进程单元 可以具体用于按照设定的对 应关系启动相应的待启动的应用程序,所述对 应关系为应用启动进程与待启动 的应用程序的对应关系。

再进一步的, 所述容器守护进程单元还可以用于收到容器销 毁命令后, 终 止所述容器中的所有进程,检测到所述容器中 的初始进程终止后,将所述容器 销毁。

SIGKILL信号或者向容器内的所有进程分別发 SIGKILL信号, 将容器中的所 有进程终止。

综上, 本发明实施例提供了一种在 Linux系统, 该系统可以在容器中同时 启动多个应用程序, 方便了容器的管理和使用,增强了容器的可用 性和可管理 性。 本领域普通技术人员可以理解上述实施例的各 种方法中的全部或部分步 骤是可以通过程序来指令相关的硬件完成,该 程序可以存储于一计算机可读存 储介质中,存储介质可以包括: 只读存储器、 随机读取存储器、磁盘或光盘等。

以上对本发明实施例所提供的在 Linux 容器中启动应用程序的方法和相 应的 Linux系统进行了详细介绍,但以上实施例的说 只是用于帮助理解本发 明的方法及其核心思想, 不应理解为对本发明的限制。