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

mqkwyuun  于 2023-06-29  发布在  Docker
关注(0)|答案(9)|浏览(334)

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

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

输出总是相同的。

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

b91juud31#

最新的docker支持通过命令行和API设置ulimits。例如,docker run需要--ulimit <type>=<soft>:<hard>,并且可以根据您的需要有很多这样的值。因此,对于nofile,示例为--ulimit nofile=262144:262144

n3schb8v

n3schb8v2#

经过一番搜索,我在Google群组讨论中发现了这一点:
Docker目前禁止这种能力以增强安全性。
这是因为主机系统的ulimit设置适用于docker容器。在容器中运行的程序可以更改主机的ulimit设置,这被视为一种安全风险。
好消息是,你有两种不同的解决方案可供选择。
1.从lxc_template.go中删除sys_resource并重新编译docker。然后你就可以把ulimit设置成你喜欢的高。

  • 或者 *

1.阻止Docker恶魔更改主机上的ulimit设置。启动Docker Demon。它现在有了您修改后的限制,它的子进程也有了。
我使用了第二种方法:

  1. sudo service docker stop;
    1.修改了 /etc/security/limits.conf 中的限制
    1.重新启动机器
    1.运行我的容器
    1.在容器中运行ulimit -a以确认已继承打开文件限制。
    参见:https://groups.google.com/forum/#!搜索/docker-user/limits/docker-user/T45 Kc 9vD 804/v8J_N4gLbacJ
j2cgzkjk

j2cgzkjk3#

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

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

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

kgsdhlau

kgsdhlau4#

我已经尝试了许多选择,不确定为什么上面建议的一些解决方案在一台机器上工作,而不是在其他机器上。
一个有效且简单的解决方案可以在每个容器上工作:

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
t3psigkw

t3psigkw5#

这就是我所做的。
在文件/etc/init.d/docker中设置ulimit -n 32000
重启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
u1ehiz5o

u1ehiz5o6#

事实上,我已经尝试了上面的答案,但它似乎没有工作。
为了让我的容器确认ulimit的更改,我必须在启动它们之前更新docker.conf文件:

$ sudo service docker stop
$ sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf"
$ sudo service docker start
z18hc3ub

z18hc3ub7#

docker run命令有一个--ulimit标志,你可以使用这个标志来设置docker容器中的打开文件限制。
在启动容器时运行以下命令以设置打开文件限制。
docker run --ulimit nofile=<softlimit>:<hardlimit>冒号前的第一个值表示软文件限制,冒号后的值表示硬文件限制。您可以通过在交互模式下运行容器并在容器shell ulimit -n中执行以下命令来验证这一点
PS:查看此blog帖子以获得更多清晰度

a14dhokn

a14dhokn8#

对于boot 2docker,我们可以在/var/lib/boot2docker/profile上设置它,例如:
ulimit -n 2018
请注意不要将此限制设置得太高,因为它会减慢apt-get的速度!参见错误#1332440。我用Debian杰西。

vhmi4jdf

vhmi4jdf9#

要在Docker构建时设置max_locked_memory,请添加以下参数,

docker build --ulimit memlock=-1

max_locked_memory设置为unlimited(可以使用ulimit -l查看)。这是因为docker build在一个单独的用户空间中运行,并且有自己的文件系统。因为我们不希望它采用主机的规范,所以我们添加了这个命令行参数。
要在docker容器内复制相同的更改,请使用相同的命令运行docker镜像

Ex, docker run --ulimit memlock=-1

相关问题