我正在运行处理数千个并发Web套接字连接的Web服务器。为了实现这一点,在Debian linux上(我的基本图像是google / debian:wheezy,在GCE上运行),默认打开文件数设置为1000,我通常只将ulimit设置为所需的数字(64,000) 。
这很好,除了当我将我的应用程序停靠并部署它时 - 我发现docker类型忽略了限制定义。我尝试了以下(所有在主机上,而不是在容器本身上):
MAX=64000
sudo bash -c "echo \"* soft nofile $MAX\" >> /etc/security/limits.conf"
sudo bash -c "echo \"* hard nofile $MAX\" >> /etc/security/limits.conf"
sudo bash -c "echo \"ulimit -c $MAX\" >> /etc/profile"
ulimit -c $MAX
在做了一些研究后,我发现人们能够通过这样做来解决类似的问题:
sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf"
并重新启动/重新启动docker服务。
然而,以上所有都失败了:我得到了太多的打开文件"我的应用程序在容器内运行时出错(如果没有docker解决问题,请执行以下操作)。
我试图在容器中运行ulimit -a
以获取ulimit设置是否有效的指示,但这样做会引发一个错误,即ulimit不是可执行文件的一部分。
任何人遇到这个和/或可以建议让码头工人识别极限的方法吗?
答案 0 :(得分:10)
我能够通过以下配置来解决此问题:
我使用ubuntu 14.04 linux作为docker机器和主机。
在主机计算机上您需要:
* - nofile 64000
fs.file-max = 64000
答案 1 :(得分:3)
您可以在运行容器时将限制作为参数传递。这样您就不必修改主机的限制并为容器提供过多的电量。方法如下:
docker run --ulimit nofile=5000:5000 <image-tag>
答案 2 :(得分:1)
使用docker-compose可以配置ulimits。
https://docs.docker.com/compose/compose-file/#ulimits
您可以添加软/硬限制作为映射。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
虽然不理想,但您可以运行具有特权选项的容器(主要用于Dev环境的快速非最佳解决方案,如果担心安全性,则不推荐使用)。
docker run --privileged
请参阅:
https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities