一种限制Docker容器inode数量的方法转让专利

申请号 : CN202211650523.1

文献号 : CN116204305B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 林萍萍章云鹏刘凯敏

申请人 : 山东未来网络研究院(紫金山实验室工业互联网创新应用基地)

摘要 :

本发明公开了一种限制Docker容器inode数量的方法,包括如下步骤:在docker官方github下载docker源码;找到setProjectQuota函数并替换成setProjectQuota函数;编译docker二进制并安装,运行环境为Linux XFS文件系统和Docker Overlay2存储驱动;使用docker run命令行创建容器,在‑‑storage‑opt选项中指定inode数量。本发明通过调用系统函数quotactl()对文件系统进行inode的最大数量配置,避免Docker容器无节制消耗宿主机系统的inode而导致宿主机不可用问题的出现,实用性非常强。

权利要求 :

1.一种限制Docker容器inode数量的方法,其特征在于,包括如下步骤:S1在docker官方github下载docker源码;

S2找到setProjectQuota函数并替换成setProjectQuota函数;

setProjectQuota函数具体实现过程如下:S21 设置d_fieldmask 字段,指定要设置的配额限制类型,配额限制类型包括inode的硬限制FS_DQ_IHARD和软限制FS_DQ_ISOFT;

S22 计算并设置硬限制inode hard limit的值,将 quota.InodeCount 转换为无符号 

64 位整数,并将其分配给 d_ino_hardlimit 字段;

S23 将软限制inode soft limit的值设置为与S22的硬限制相同;

S3编译docker二进制并安装,运行环境为Linux XFS文件系统和Docker Overlay2存储驱动;

S4使用docker run命令行创建容器,在‑‑storage‑opt选项中指定inode数量;

S5在创建容器的过程中,docker守护进程docker‑deamon创建容器读写层文件系统,并校验inode配置参数是否合法,如果不合法会终止容器的创建;

S6 inode配置参数校验通过后,docker‑deamon调用Linux系统函数quotactl来配置当前容器读写层文件系统的inode数量;

S7容器创建完成,容器读写层磁盘空间的inode配额设置完成。

说明书 :

一种限制Docker容器inode数量的方法

技术领域

[0001] 本发明涉及计算机安全技术技术领域,具体来说,涉及一种限制Docker容器inode数量的方法。

背景技术

[0002] 相比于虚拟机,Docker利用Linux内核所提供的技术,创建一个或多个共享宿主机物理资源的相对独立的容器。虚拟机实现资源隔离的方式是利用独立的Guest OS,以及利用Hypervisor虚拟化CPU、内存、IO等设备来实现的;Docker则依靠Linux内核所提供的Namespace和Cgroups技术,前者做资源隔离,后者做资源限制。由于Docker没有实现硬件资源的虚拟化,所以只能直接使用物理机的硬件资源。
[0003] 目前Docker可以通过Linux系统中的ulimit工具限制容器内shell进程及其子进程能够打开的最大文件描述符数量。docker run命令提供了‑‑ulimit选项,用户在通过命令行创建容器时可以直接通过‑‑ulimit选项配置容器内shell进程及其子进程能够打开的最大文件描述符数量。另一种方式,用户可以在docker daemon配置文件中配置default‑ulimits,设置默认的nofile值。
[0004] 对于ulimit,一方面它只能限制容器内shell进程及其子进程能够打开的最大文件描述符数量,如果容器内进程是shell脚本之外的二进制程序,这个限制就无效;另一方面它只能限制单个shell进程及其子进程能够打开的最大文件描述符数量,如果有多个shell进程,这个数量会叠加,会有风险消耗掉物理机所有的inode资源。通过第二种方式,在使用命令行创建容器时,可以不使用‑‑ulimit标签即可配置默认的最大文件描述符数量。
[0005] 因此,如何对“容器占有的inode资源加以限制,避免当容器消耗掉物理机所有的inode资源时导致整个物理机不可用”成为了人们急需解决的技术难题。

发明内容

[0006] 针对相关技术中的上述技术问题,本发明提出一种限制Docker容器inode数量的方法,能够克服现有技术的上述不足。
[0007] 为实现上述技术目的,本发明的技术方案是这样实现的:
[0008] 一种限制Docker容器inode数量的方法,包括如下步骤:
[0009] S1在docker官方github下载docker源码;
[0010] S2找到setProjectQuota函数并替换成setProjectQuota函数;
[0011] S3编译docker二进制并安装,运行环境为Linux XFS文件系统和Docker Overlay2存储驱动;
[0012] S4使用docker run命令行创建容器,在‑‑storage‑opt选项中指定inode数量;
[0013] S5在创建容器的过程中,docker守护进程docker‑deamon创建容器读写层文件系统,并校验inode配置参数是否合法,如果不合法会终止容器的创建;
[0014] S6 inode配置参数校验通过后,docker‑deamon调用Linux系统函数quotactl来配置当前容器读写层文件系统的inode数量;
[0015] S7容器创建完成,容器读写层磁盘空间的inode配额设置完成。
[0016] 进一步地,步骤S3中编译docker二进制并安装的运行环境为Linux XFS文件系统。
[0017] 进一步地,步骤S3中编译docker二进制并安装的存储驱动为Docker Overlay2。
[0018] 本发明的有益效果:本发明通过调用系统函数quotactl()对文件系统进行inode的最大数量配置,避免Docker容器无节制消耗宿主机系统的inode而导致宿主机不可用问题的出现,实用性非常强。

附图说明

[0019] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0020] 图1是根据本发明实施例所述的限制Docker容器inode数量的方法的配置流程图。

具体实施方式

[0021] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本发明保护的范围。
[0022] 如图1所示,根据本发明实施例所述的一种限制Docker容器inode数量的方法,其中缩略语和关键术语定义如下:
[0023] inode      index node(索引节点);
[0024] ulimit     user limit(用户进程资源限制);
[0025] Docker     提供OS级虚拟化的一组PaaS产品;
[0026] XFS        高性能的64位日志文件系统;
[0027] Overlay2   Docker中一种文件存储驱动程序;
[0028] 文件描述符 Linux系统中,进程级别的对已打开文件的一个抽象标记。
[0029] 具体方法包括如下步骤:
[0030] 1、在docker官方github下载docker源码;
[0031] 2、找到setProjectQuota函数并替换成本发明实现的setProjectQuota函数;
[0032] 3、编译docker二进制并安装,确保使用的是Linux XFS文件系统[3]和Docker Overlay2存储驱动[4];
[0033] 4、使用docker run命令行创建容器,在‑‑storage‑opt选项中指定inode数量,示例:docker run ‑tid ‑‑storage‑opt inode=1024 nginx;
[0034] 5、在创建容器的过程中,docker守护进程docker‑deamon会创建容器读写层文件系统,并校验inode配置参数是否合法,如果不合法会终止容器的创建;
[0035] 6、inode配置参数校验通过后,docker‑deamon会调用Linux系统函数quotactl来配置当前容器读写层文件系统的inode数量;
[0036] 7、容器创建完成,容器读写层磁盘空间的inode配额设置完成。
[0037] 本发明中,我们首次提出了对容器所拥有的inode数量进行限制的方案,利用了Linux XFS文件系统[3]和Docker Overlay2存储驱动[4]。
[0038] 在计算机环境中,磁盘空间不会是无限的,XFS文件系统提供了控制磁盘空间使用的机制,使用其quota子系统可以配置磁盘配额,包括存储块大小和inode数量,我们主要使用了它能够配置磁盘inode配额的能力。Overlay2是Docker中的存储驱动,Docker所有的存储驱动中只有它支持XFS文件系统。
[0039] 在使用docker run命令创建容器时,本方案提供通过‑‑storage‑opt选项来设置容器inode数量。在容器创建过程中,主机会分配给容器一块独立的文件系统,本方案核心技术是调用系统函数quotactl()对这块文件系统进行inode的最大数量配置。
[0040] 本发明方案提到的setProjectQuota函数实现如下所示:
[0041] // setProjectQuota ‑ set the quota for project id on xfs block device[0042] func setProjectQuota(backingFsBlockDev string, projectID uint32, quota Quota) error {
[0043]       var d C.fs_disk_quota_t
[0044]       d.d_version = C.FS_DQUOT_VERSION
[0045]       d.d_id = C.__u32(projectID)
[0046]       d.d_flags = C.XFS_PROJ_QUOTA
[0047]       d.d_fieldmask = C.FS_DQ_IHARD | C.FS_DQ_ISOFT
[0048]      d.d_ino_hardlimit = C.__u64(quota.InodeCount)
[0049]       d.d_ino_softlimit = d.d_ino_hardlimit
[0050]       var cs = C.CString(backingFsBlockDev)
[0051]       defer C.free(unsafe.Pointer(cs))
[0052]       _, _, errno := unix.Syscall6(unix.SYS_QUOTACTL, C.Q_XSETPQLIM,[0053]              uintptr(unsafe.Pointer(cs)), uintptr(d.d_id),[0054]              uintptr(unsafe.Pointer(&d)), 0, 0)
[0055]       if errno != 0 {
[0056]              return fmt.Errorf("Failed to set quota limit for projid %d on %s: %v",
[0057]                     projectID, backingFsBlockDev, errno.Error())[0058]       }
[0059]       return nil
[0060] }
[0061] 为了方便理解本发明的上述技术方案,以下通过具体使用方式上对本发明的上述技术方案进行详细说明。
[0062] 在具体使用时,根据本发明所述的一种限制Docker容器inode数量的方法,基于上述方案,这里列举如何限制容器所拥有inode数量的具体实施例:
[0063] 1、在docker官方github下载docker源码,执行命令:git clone https://github.com/moby/moby.git;
[0064] 2、找到源代码文件quota/projectquota.go中的setProjectQuota函数并替换成本发明实现的setProjectQuota函数;
[0065] 3、在源代码根目录下执行make binary命令编译出docker二进制;
[0066] 4、将步骤【3】中的docker安装到待运行容器的机器;
[0067] 5、使用docker run命令行创建容器,即可在‑‑storage‑opt选项中指定inode数量,示例:docker run ‑tid ‑‑storage‑opt inode=1024 nginx;
[0068] 6、在创建容器的过程中,docker守护进程docker‑deamon会创建容器读写层文件系统,并校验inode配置参数是否合法,如果不合法会终止容器的创建;备注:inode数量和容器可用的存储空间有关系,若配置过大,会被认为不合法。
[0069] 7、inode配置参数校验通过后,docker‑deamon会调用Linux系统函数quotactl来配置当前容器读写层文件系统的inode数量;
[0070] 8、至此,容器创建完成,容器读写层磁盘空间的inode配额设置完成。
[0071] 综上所述,借助于本发明的上述技术方案,通过调用系统函数quotactl()对文件系统进行inode的最大数量配置,避免Docker容器无节制消耗宿主机系统的inode而导致宿主机不可用问题的出现,实用性非常强。
[0072] 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。