2014-10-16 15 views
13

Ich benutze einen Webserver, der viele tausend gleichzeitige Web-Socket-Verbindungen verarbeitet. Damit dies möglich ist, habe ich auf Debian linux (mein Basis-Image ist google/debian: wheezy, läuft auf GCE), wo die Standardanzahl der geöffneten Dateien auf 1000 gesetzt ist, normalerweise nur ulimit auf die gewünschte Zahl (64.000) setzen. .Docker Ignoriert limits.conf (versucht "zu viele offene Dateien" zu lösen)

Das funktioniert großartig, außer dass, wenn ich meine Anwendung dockerisierte und es implementierte - fand ich heraus, dass docker die Limitdefinitionen ignoriert. Ich habe folgendes versucht (alle auf dem Host-Computer, nicht auf den Behälter selbst):

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 

Nach einigen Recherchen finde ich, dass Menschen in der Lage waren, ein ähnliches Problem zu lösen, indem Sie diese:

sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf" 

und den Docker-Dienst neu starten/neu starten.

Alle oben genannten jedoch fehlschlagen: Ich erhalte den Fehler "zu viele offene Dateien", wenn meine App innerhalb des Containers ausgeführt wird (die folgenden Schritte ohne Andockfenster lösen das Problem).

Ich habe versucht, ulimit -a innerhalb des Containers ausführen, um eine Angabe zu erhalten, wenn die Ulimit-Setup funktionierte, aber dabei ein Fehler über Ulimit nicht eine ausführbare Datei, die ein Teil des PATH ist.

Wer ist hier reingekommen und/oder kann einen Weg vorschlagen, den Hafenarbeiter dazu zu bringen, die Grenzen zu erkennen?

Antwort

9

ich in der Lage war, dieses Problem mit der folgenden Konfiguration mitgiate:

Ich habe ubuntu 14.04 Linux für die Docker Maschine und dem Host-Computer.

Auf der Host Maschine Sie müssen:

  • Update der /etc/security/limits.conf enthalten: * - nofile 64000
  • zu Ihrem /etc/sysctl.conf hinzu: fs.file-max = 64000
  • Neustart sysctl: sudo sysctl -p
+4

Achten Sie darauf, den Docker-Daemon-Dienst ebenfalls neu zu starten! – cgp

1

Mit docker-compose könnten Sie ulimits konfigurieren.

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

Sie können weich/hart Grenzen als eine Abbildung hinzufügen.

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

nicht ideal Obwohl Sie Behälter mit privilegierter Option laufen können (Vor allem für eine schnelle nicht-optimale Lösung für eine Umgebung Dev, nicht empfohlen, wenn Sicherheit ein Anliegen ist).

docker run --privileged 

Bitte sehen:

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

+0

Dies ist eine schreckliche Idee. –

2

Sie können das Limit als Argument beim Ausführen des Containers übergeben. Auf diese Weise müssen Sie die Grenzen des Hosts nicht ändern und dem Container zu viel Energie geben.Hier ist wie:

docker run --ulimit nofile=5000:5000 <image-tag> 
Verwandte Themen