Docker 主机与容器中的 Ulimit

Ulimits in Docker host vs container

我无法找到这个问题的直接答案,但答案是:

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

[root@host]# ulimit -a
open files                      (-n) 1024

和该主机中的 docker 容器 运行:

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

那么如果我尝试打开超过 1024 个文件,我在容器中会有什么问题吗?我认为在这种情况下容器的真正限制是 1024 个文件。你怎么看?

实际限制为 1048576。

看看这张图片的右边部分,它表明容器基本上只是孤立的进程,运行 在同一个操作系统上:

由于容器中的每个系统调用都将由主机直接处理 OS,显示的 ulimit (1048576) 直接来自主机 OS,这就是将被使用。

例如,ulimit 的差异可能是由 a Docker configuration 引起的。

(请注意,对于 VMs,这将有所不同:来宾 OS 可能显示值 1048576,但打开的呼叫最终将被处理由主机 OS,这将施加 1024)

的限制

虽然有点晚了,但我只是想澄清一下关于ulimit的区别的疑惑。

如果您在 运行 容器时进行网络设置,则容器内显示的 ulimit 值来自主机 OS。那么问题是,当 运行 来自主机的相同命令时,为什么您会看到不同的值?

这是因为运行主机中的命令时,显示的是它的软限制。另一方面,容器显示的值是主机的硬限制 OS。这样做的原因是您可以越过软限制。所以从某种意义上说,硬限制其实才是真正的限制。您可以在 link.

中找到有关 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 的详细说明,请参见 here

请注意,此限制可以设置为高于 OS 的硬限制,这可能会导致麻烦。

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

So will I have a problem in container if I try to open more then 1024 files?

没有。在这种情况下,我发现主机值在容器内部没有影响,Docker 容器可以指定自己的 ulimit 值。

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