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底层的功能实现原理了解有限,还请各位大神加以指点;
1 个回复
[已注销]
赞同来自: nicole 、徐磊
不用这么麻烦,docker下设置container ulimit应该是一件很愉快的事儿。
docker 1.6+ ulimit用法:
--default-ulimit
,docker daemon的启动参数,能够指定默认container ulimit配置。如果此参数没配置,则默认从docker daemon继承;--ulimit
,docker run的参数,能够覆盖docker daemon指定的ulimit默认值。如果此参数没配置,则默认从default-ulimit继承;(https://github.com/docker/dock ... limits)
(https://github.com/docker/dock ... tainer)
所以,根据你的描述,你只需要在docker run后面加一个
--ulimit nproc=${YOUR_NPROC_NUM}
即可。比如执行如下这条命令:<pre>docker run --rm -it --ulimit nproc=${YOUR_NPROC_NUM} centos /bin/bash</pre>
你可以在这个container里执行
ulimit -u
看看,已经变为你想要的${YOUR_NPROC_NUM}
有木有~~~