Docker忽略了limits.conf文件(尝试解决“打开文件过多”的错误)

21

我运行了一个Web服务器,处理着许多千并发的Web套接字连接。为了实现这一点,在Debian Linux上(我的基础映像是Google / Debian:wheezy,在GCE上运行),默认打开文件数量设置为1000,我通常只需将ulimit设置为所需数量(64,000)。

这个方法很好用,但当我将应用程序Docker化并部署它时,我发现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不是PATH的一部分的可执行文件的错误。

有人遇到过这个问题或者能建议一种让docker识别限制的方法吗?

2个回答

11

我通过以下配置成功缓解了这个问题:

我在Docker机器和主机上都使用了Ubuntu 14.04 Linux。

主机上,您需要:

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

5
一定要重新启动 Docker 守护进程服务! - cgp
以上内容并不完全准确。应该将sysctl命令更新为sudo sysctl -p <filename>,在本例中为sudo sysctl -p /etc/sysctl.conf,因为它旨在从文件重新加载特定参数,而不是全局重新加载所有sysctl,并捕获/etc/sysctl.d/文件等。 - Illuminatus

8
您可以在运行容器时将限制作为参数传递。这样,您就不必修改主机的限制并给容器过多的权限。以下是方法:
docker run --ulimit nofile=5000:5000 <image-tag>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接