Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker主机与容器中的ulimit_Docker_Containers_Ulimit - Fatal编程技术网

Docker主机与容器中的ulimit

Docker主机与容器中的ulimit,docker,containers,ulimit,Docker,Containers,Ulimit,我没能找到这个问题的直接答案,但这里是: 假设我有一台主机,其最大打开文件数为1024: [root@host]# ulimit -a open files (-n) 1024 以及在该主机中运行的docker容器,其中包含: [root@container]# ulimit -a open files (-n) 1048576 所以,若我试图打开1024个以上的文件,那个么容器中会有任何问题吗?我认为在这种

我没能找到这个问题的直接答案,但这里是:

假设我有一台主机,其最大打开文件数为1024:

[root@host]# ulimit -a
open files                      (-n) 1024
以及在该主机中运行的docker容器,其中包含:

[root@container]# ulimit -a
open files                      (-n) 1048576

所以,若我试图打开1024个以上的文件,那个么容器中会有任何问题吗?我认为在这种情况下,容器的实际限制是1024个文件。你认为呢?

真正的上限是1048576

请看此图的右侧部分,它显示容器基本上只是在同一操作系统上运行的独立进程:

由于容器中的每个系统调用都将由主机操作系统直接处理,因此显示的ulimit(1048576)直接来自主机操作系统,这是将要使用的值

例如,ulimit的差异可能是由以下因素造成的


(请注意,对于VM,这将是不同的:来宾操作系统可能显示1048576的值,但打开的调用最终将由主机操作系统处理,这将施加1024的限制)

尽管有点晚了,但我只想澄清关于ulimit差异的疑问

如果在运行容器时未设置值,则容器中显示的ulimit值来自主机操作系统。问题是,为什么从主机运行同一命令时会看到不同的值

这是因为在主机中运行该命令时,它会显示其软限制。另一方面,容器显示的值是主机操作系统的硬限制。这样做的原因是允许您越过软限制。所以在某种意义上,硬限制实际上是真正的限制。你可以在这里找到更多关于ulimit的信息

要查看硬限制,只需键入以下命令

ulimit -Hn
您将看到这些值是匹配的

N.B.你不能越过硬限制,但如果你是根,你可以增加硬限制

可以使用
LimitNOFILE
在Docker配置中设置打开文件的限制,也可以将其传递给
Docker run
命令:

$ docker run -it --ulimit nofile=1024:2048 ubuntu bash -c 'ulimit -Hn && ulimit -Sn'
2048
1024
有关在Docker中设置ulimits的详细信息,请参阅


请注意,此限制可以设置为高于操作系统的硬限制,这可能会导致问题。

我需要直接回答OP的问题:

所以,如果我尝试打开超过1024个文件,容器中会出现问题吗

不可以。在本例中,我发现主机值在容器内部没有作用,Docker容器可以指定自己的ulimit值


换句话说,容器设置的值高于主机的默认值是有效的。因此,容器中的有效ulimit nofile值为1048576,这将正常工作。

此线程提供了一个很好的解释: