2014-10-16 317 views
13

我正在运行一个处理数千个并发web套接字连接的web服务器。为了这个可能,在Debian linux上(我的基本映像是google/debian:wheezy,运行在GCE上),默认的打开文件数量设置为1000,我通常只需将ulimit设置为所需的数字(64,000) 。Docker忽略limits.conf(试图解决“打开太多文件”的错误)

这很好,除了当我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即可解决问题),出现“打开的文件过多”错误。

我试图在容器中运行ulimit -a以获得ulimit设置是否工作的指示,但这样做会引发ulimit不是PATH的一部分的可执行文件的错误。

任何人都遇到过这种情况,并且/或者可以建议一种方法让码头承认极限?

回答

9

我能mitgiate这个问题具有以下配置:

我使用的Ubuntu 14.04 Linux的泊坞窗机和主机。

主机机你需要:

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

一定要重新启动Docker守护程序服务! – cgp 2015-02-14 15:45:52

1

使用docker-compose你可以配置ulimits。

https://docs.docker.com/compose/compose-file/#ulimits

您可以添加软/硬限制的映射。

ulimits: 
    nproc: 65535 
    nofile: 
    soft: 20000 
    hard: 40000 

虽然不理想,你可以运行与特权选项容器(主要用于为开发环境的快速非最优解,不建议,如果担心安全问题)。

docker run --privileged 

请参阅:

https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities

+0

这是一个可怕的想法。 – 2017-06-26 20:11:30

2

您可以在运行容器时传递limit作为参数。这样你就不必修改主机的限制并给容器提供太多的权力。这是如何:

docker run --ulimit nofile=5000:5000 <image-tag> 
相关问题