Docker忽略limits.conf(尝试解决"太多打开文件"错误)

时间:2014-10-16 23:59:18

标签: linux debian docker google-compute-engine ulimit

我正在运行处理数千个并发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不是可执行文件的一部分。

任何人遇到这个和/或可以建议让码头工人识别极限的方法吗?

3 个答案:

答案 0 :(得分:10)

我能够通过以下配置来解决此问题:

我使用ubuntu 14.04 linux作为docker机器和主机。

主机计算机上您需要:

  • 更新/etc/security/limits.conf以包含:* - nofile 64000
  • 添加到您的/etc/sysctl.conf:fs.file-max = 64000
  • 重新启动sysctl:sudo sysctl -p

答案 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