2014-10-16 322 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> 
相關問題