如何在docker容器上设置ulimit/file描述符图像标记为phusion/baseimage docker

如何在docker容器上设置ulimit/file描述符图像标记为phusion/baseimage docker,docker,ulimit,Docker,Ulimit,我需要在docker容器上正确设置文件描述符限制 我使用ssh()连接到容器 已尝试: edit limits.conf容器忽略此文件 在找到upstart过程,但此docker映像具有不同类型的初始化过程。(runit) 我试图在/etc/pam.d中修改pam库的配置 尝试在sshd_config中为ssh启用pam 输出总是一样的 bash: ulimit: open files: cannot modify limit: Operation not permitted 经过一些搜索

我需要在docker容器上正确设置文件描述符限制 我使用ssh()连接到容器

已尝试:

  • edit limits.conf容器忽略此文件
  • 在找到upstart过程,但此docker映像具有不同类型的初始化过程。(runit)
  • 我试图在/etc/pam.d中修改pam库的配置
  • 尝试在sshd_config中为ssh启用pam
输出总是一样的

bash: ulimit: open files: cannot modify limit: Operation not permitted

经过一些搜索,我在谷歌群组讨论中发现了以下内容:

docker目前禁用此功能以增强安全性

这是因为主机系统的ulimit设置应用于docker容器。容器中运行的程序可能会更改主机的ulimit设置,这被视为一种安全风险

好消息是,您有两种不同的解决方案可供选择

  • lxc\u模板中删除
    sys\u资源
    。转到
    并重新编译docker。然后 您可以将ulimit设置为您喜欢的最高值
  • 阻止码头工人恶魔。更改主机上的ulimit设置。开始 码头工人恶魔。它现在有了你修改过的限制,还有它的孩子 过程也是如此
  • 我采用了第二种方法:

  • sudo服务码头站

  • 更改了/etc/security/limits.conf中的限制

  • 重新启动机器

  • 运行我的容器

  • 在容器中运行
    ulimit-a
    ,确认已继承打开的文件限制


  • 请看:

    事实上,我已经尝试了上述答案,但似乎不起作用

    为了让我的容器确认
    ulimit
    更改,我必须在启动它们之前更新
    docker.conf
    文件:

    $sudo服务码头站
    $sudobash-c“echo\”限制文件262144 262144\“>>/etc/init/docker.conf”
    $sudo服务docker启动
    
    以下是我所做的

    设置
    ulimit-n32000
    在文件/etc/init.d/docker中

    然后重新启动docker服务

    docker-run-ti节点:最新/bin/bash

    运行此命令以验证

    user@4d04d06d5022:/#ulimit-a

    我们应该在结果中看到这一点

    打开文件(-n)32000

    [user@ip ec2-user]# docker run -ti node /bin/bash
    user@4d04d06d5022:/# ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    scheduling priority             (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 58729
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 32000
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    real-time priority              (-r) 0
    stack size              (kbytes, -s) 10240
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 58729
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
    

    对于boot2docker,我们可以将其设置为
    /var/lib/boot2docker/profile
    ,例如:

    ulimit-n 2018


    请注意,不要将此限制设置得太高,因为它会减慢速度!见小虫。我对debian jessie很满意。

    最新的docker支持通过命令行和API设置ulimit。例如,
    docker-run
    需要
    --ulimit=:
    并且可以有任意多个。因此,对于您的nofile,一个例子是
    --ulimit nofile=262144:262144

    我尝试了许多选项,不确定为什么上面建议的一些解决方案在一台机器上有效,而在其他机器上无效

    一个简单有效的解决方案是:

    docker run--ulimit memlock=819200000:819200000-h--name=current-v/home/user\u home:/user\u home-i-d-t docker\u user\u name/image\u name
    
    docker run
    命令有一个
    --ulimit
    标志,您可以使用该标志设置docker容器中的打开文件限制

    在旋转容器以设置打开的文件限制时,运行以下命令

    docker run--ulimit nofile=:
    冒号前的第一个值表示软文件限制,冒号后的值表示硬文件限制。您可以通过在交互模式下运行容器并在容器shell中执行以下命令来验证这一点
    ulimit-n


    PS:如果使用docker compose文件,请查看此帖子以了解更多信息, 基于docker compose 2.x版 通过覆盖默认配置,我们可以如下设置

    ulimits:
      nproc: 65535
      nofile:
        soft: 26677
        hard: 46677
    

    当机器重新启动后启动时,这些更改不会占主导地位,但一旦我们在机器启动后重新启动docker的服务,容器就会采用所需的配置。另外,在中有一个关于更改
    /etc/security/limits.conf
    的有用教程,您知道为什么需要重新启动吗?为什么不重新启动shell呢?这是否意味着特定容器比其他容器具有更高的ulimit?主机的ulimit是否保持不变?@garbagecollector是,这意味着特定容器的ulimit高于其他容器。这是因为如果在docker run命令中未指定--ulimit,那么容器将从docker守护进程继承默认ulimit。而且,主机的ulimit保持完全不变。@Suhaschikkana只是为了确保,如果容器最大“打开的文件”限制高于带下划线的主机最大“打开的文件”,容器限制是否会被忽略?另请参见
    --sysctl fs.mqueue.msg_max=10000
    样式设置