Docker容器中关于用户最大线程数限制问题


现象:
创建Docker容器,使用webadmin用户启动resin或su到webadmin用户报错;“提示无法创建新的线程”
-bash: fork: retry: Resource temporarily unavailable

过程:
1、网上查看资料此错误是由于max user processes不足
2、查看宿主机的ulimit -a 以及limit.conf,/etc/security/limits.d/90-nproc.conf 设置的值均很大
3、查看容器的ulimit值也是远大于1024,这时就凌乱了,后来上网找了下,发现centos 6以后真正限制max user processes的有2个地方一个是/etc/security/limits.conf,还有一个地方是/etc/security/limits.d/90-nproc.conf,如果90-nproc.conf这个不存在,那么/etc/security/limits.conf这个生效,但是如果90-nproc.conf这个存在,那么这个文件真正生效。后来查看容器的90-nproc.conf这个文件,发现里面写的是1024,改了之后上述问题解决

原因
从上面这个看,容器里面的配置文件限制的是容器本身,但是容器的检测判断条件是宿主的运行线程总数;这点比较奇怪,由于本身对Docker底层的功能实现原理了解有限,还请各位大神加以指点;
已邀请:

wangzi19870227 - sina攻城狮,docker爱好者

赞同来自: nicole 徐磊


不用这么麻烦,docker下设置container ulimit应该是一件很愉快的事儿。

docker 1.6+ ulimit用法:
--default-ulimit,docker daemon的启动参数,能够指定默认container ulimit配置。如果此参数没配置,则默认从docker daemon继承;
--ulimit,docker run的参数,能够覆盖docker daemon指定的ulimit默认值。如果此参数没配置,则默认从default-ulimit继承;

default-ulimits
setting-ulimits-in-a-container

所以,根据你的描述,你只需要在docker run后面加一个--ulimit nproc=${YOUR_NPROC_NUM}即可。比如执行如下这条命令:
docker run --rm -it --ulimit nproc=${YOUR_NPROC_NUM} centos /bin/bash


你可以在这个container里执行ulimit -u看看,已经变为你想要的${YOUR_NPROC_NUM} 有木有~~~

要回复问题请先登录注册