如何在docker容器上设置ulimit/file描述符,image标签是phusion/baseimage-docker

dno*_*ode 38 ulimit docker

我需要在docker容器上正确设置文件描述符限制我用ssh连接到容器(https://github.com/phusion/baseimage-docker)

已经尝试过:

  • 编辑limits.conf容器忽略此文件
  • https://coderwall.com/p/myodcq上的 upstart程序,但此docker镜像具有不同类型的init进程.(运行)
  • 我试图在/etc/pam.d中修改pam库的配置
  • 尝试在sshd_config中为ssh启用pam

输出总是一样的.

bash: ulimit: open files: cannot modify limit: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

Gle*_*enn 42

最新的docker支持通过命令行和API设置ulimits.例如,docker run需要--ulimit <type>=<soft>:<hard>和你喜欢可以有许多的这些.所以,对于你的nofile,一个例子就是--ulimit nofile=262144:262144

  • 这是否意味着特定容器的ulimit高于其他容器?主机的ulimit是否保持不变? (10认同)
  • @SuhasChikkanna只是为了确保,如果容器最大"打开文件"限制高于带下划线的主机最大"打开文件",容器限制是否会被忽略? (4认同)
  • @garbagecollector 是的,这意味着特定容器的 ulimit 高于其他容器。这是因为如果 **--ulimit** 没有在 **docker run** 命令中指定,那么容器将从 docker 守护进程继承默认的 ulimit。而且,主机的 ulimit 保持完全不变。 (2认同)

dno*_*ode 27

经过一些搜索后,我在Google小组讨论中发现了这一点:

docker目前禁止这种增强安全性的能力.

这是因为主机系统的ulimit设置适用于docker容器.在容器中运行的程序可以更改主机的ulimit设置被视为安全风险.

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

  1. 删除sys_resourcelxc_template.go并重新编译泊坞窗.然后你就可以将ulimit设置得尽可能高.

要么

  1. 停止码头恶魔.更改主机上的ulimit设置.启动码头恶魔.它现在有你修改的限制,以及它的子进程.

我应用了第二种方法:

  1. sudo service docker stop;

  2. 改变了/etc/security/limits.conf中的限制

  3. 重启机器

  4. 运行我的容器

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

请参阅:https://groups.google.com/forum/#!searchin/docker-user/limits/docker-user/T45Kc9vD804/v8J_N4gLbacJ


小智 8

我已经尝试了很多选项,并且不确定为什么上面建议的一些解决方案可以在一台机器上运行而不在其他机器上运行

一个有效且简单且可以按容器工作的解决方案是:

docker run --ulimit memlock=819200000:819200000 -h <docker_host_name> --name=current -v /home/user_home:/user_home -i -d -t docker_user_name/image_name
Run Code Online (Sandbox Code Playgroud)


Moh*_*abu 8

如果使用 docker-compose 文件,基于 docker compose 版本 2.x 我们可以通过覆盖默认配置进行如下设置。

ulimits:
  nproc: 65535
  nofile:
    soft: 26677
    hard: 46677
Run Code Online (Sandbox Code Playgroud)

https://docs.docker.com/compose/compose-file/


orc*_*man 5

实际上,我已经尝试了上面的答案,但是它似乎没有用。

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

$ sudo service docker stop
$ sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf"
$ sudo service docker start
Run Code Online (Sandbox Code Playgroud)


Jay*_*Jay 5

这就是我所做的。

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

并重启docker服务

docker run -ti node:latest /bin/bash

运行此命令来验证

user@4d04d06d5022:/# ulimit -a

应该在结果中看到这个

open files (-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
Run Code Online (Sandbox Code Playgroud)