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

orc*_*man 16 linux debian ulimit google-compute-engine docker

我正在运行一个处理数千个并发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
Run Code Online (Sandbox Code Playgroud)

在做了一些研究后,我发现人们能够通过这样做来解决类似的问题:

sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf"
Run Code Online (Sandbox Code Playgroud)

并重新启动/重新启动docker服务.

但是,以上所有都失败了:当我的应用程序在容器内部运行时,我收到"太多打开文件"错误(执行以下操作时,没有docker解决了问题).

我试图ulimit -a在容器内部运行以获得ulimit设置是否有效的指示,但这样做会引发一个关于ulimit的错误,而不是作为PATH一部分的可执行文件.

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

Era*_*oni 10

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

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

主机上您需要:

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

  • 一定要重启Docker守护进程服务! (5认同)

mty*_*urt 5

您可以在运行容器时将限制作为参数传递。这样一来,您不必修改主机的限制并为容器提供过多的功能。方法如下:

docker run --ulimit nofile=5000:5000 <image-tag>
Run Code Online (Sandbox Code Playgroud)