【问题标题】:Ulimits in Docker host vs containerDocker 主机与容器中的 Ulimits
【发布时间】:2018-02-22 23:49:14
【问题描述】:

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

假设我有一个最大打开文件数为 1024 的主机:

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

以及在该主机中运行的 docker 容器:

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

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

【问题讨论】:

标签: docker containers ulimit


【解决方案1】:

真正的限制是 1048576。

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

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

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

(请注意,对于 VMs,这将有所不同:客户操作系统可能显示值 1048576,但打开的调用最终将由主机操作系统处理,这将强加限制为 1024)

【讨论】:

    【解决方案2】:

    虽然有点晚了,但还是想解开ulimit区别的疑惑。

    如果你在运行容器的时候做了net set,那么容器内显示的ulimit值来自宿主机操作系统。那么问题来了,为什么在从主机运行相同的命令时会看到不同的值?

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

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

    ulimit -Hn
    

    您将看到这些值匹配。

    注意你不能越过硬限制,但如果你是根,你可以增加它。

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

    $ docker run -it --ulimit nofile=1024:2048 ubuntu bash -c 'ulimit -Hn && ulimit -Sn'
    2048
    1024
    

    有关在 Docker 中设置 ulimit 的详细说明,请参阅 here

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

    【讨论】:

      【解决方案3】:

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

      如果我尝试打开超过 1024 个文件,我会在容器中遇到问题吗?

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

      换句话说,您的容器设置一个高于主机默认值的值是有效的。所以容器中有效的 ulimit nofile 值为 1048576,这样就可以正常工作了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-26
        • 1970-01-01
        • 2016-11-26
        • 2019-11-13
        • 1970-01-01
        • 1970-01-01
        • 2020-12-06
        相关资源
        最近更新 更多