Ich verwende einen Webserver, der viele tausend gleichzeitige Web-Socket-Verbindungen verarbeitet. Um dies zu ermöglichen, unter Debian Linux (mein Basis-Image ist google/debian: wheezy, läuft auf GCE), wobei die Standardanzahl offener Dateien auf 1000 festgelegt ist, lege ich normalerweise nur die gewünschte Anzahl (64.000) fest. .
Das klappt großartig, nur dass ich, als ich meine Anwendung andockte und implementierte, herausfand, dass das Docker die Limit-Definitionen ignoriert. Ich habe Folgendes versucht (alle auf dem Host-Computer, nicht auf dem Container 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 fand ich heraus, dass die Leute ein ähnliches Problem auf diese Weise lösen konnten:
Sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf"
und starten Sie den Andockdienst neu.
Alle oben genannten Probleme schlagen jedoch fehl: Ich erhalte die Fehlermeldung "zu viele geöffnete Dateien", wenn meine App im Container ausgeführt wird (die folgenden Schritte ohne Docker lösen das Problem).
Ich habe versucht, ulimit -a
innerhalb des Containers auszuführen, um eine Anzeige zu erhalten, ob das ulimit-Setup funktioniert hat, aber es wird eine Fehlermeldung ausgegeben, dass ulimit keine ausführbare Datei ist, die Teil des PATH ist.
Jemand ist auf dieses Thema gestoßen und/oder kann einen Weg vorschlagen, um Docker dazu zu bringen, die Grenzen zu erkennen.
Ich konnte dieses Problem mit der folgenden Konfiguration beheben:
Ich habe Ubuntu 14.04 Linux für die Docker-Maschine und die Host-Maschine verwendet.
Auf dem HostRechner müssen Sie:
* - nofile 64000
fs.file-max = 64000
Sie können das Limit als Argument übergeben, während Sie den Container ausführen. Auf diese Weise müssen Sie die Grenzen des Host nicht ändern und dem Container zu viel Strom verleihen. Hier ist, wie:
docker run --ulimit nofile=5000:5000 <image-tag>
Mit Docker-Compose können Sie ulimits konfigurieren.
https://docs.docker.com/compose/compose-file/#ulimits
Sie können weiche/harte Grenzwerte als Zuordnung hinzufügen.
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
Obwohl dies nicht ideal ist, können Sie Container mit einer privilegierten Option ausführen (meistens für eine schnelle, nicht optimale Lösung für eine Dev-Umgebung, nicht empfehlenswert, wenn Sicherheit ein Problem darstellt).
docker run --privileged
Bitte sehen Sie:
https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities