web-dev-qa-db-fra.com

Docker Ignore limits.conf (en essayant de résoudre l'erreur "trop ​​de fichiers ouverts")

J'utilise un serveur Web qui gère plusieurs milliers de connexions Web socket simultanées. Pour que cela soit possible, sous Linux Debian (mon image de base est google/debian: wheezy, s'exécutant sur GCE), où le nombre de fichiers ouverts par défaut est défini sur 1 000, je règle généralement ulimit au nombre souhaité (64 000). . 

Cela fonctionne très bien, sauf que lorsque j'ai dockérisé mon application et que je l'ai déployée, j'ai découvert que docker ignorait en quelque sorte les définitions limites. J'ai essayé ce qui suit (tous sur la machine hôte, pas sur le conteneur lui-même):

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

Après quelques recherches, j'ai constaté que les gens étaient capables de résoudre un problème similaire en procédant ainsi:

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

et redémarrer/redémarrer le service fixe. 

Cependant, tout ce qui précède échoue: je reçois le message d'erreur "trop ​​de fichiers ouverts" lorsque mon application s'exécute dans le conteneur (la procédure suivante sans que le menu fixe ne résout le problème). 

J'ai essayé d'exécuter ulimit -a dans le conteneur pour obtenir une indication du fonctionnement de la configuration ulimit, mais cela jette une erreur sur le fait qu'ulimit n'est pas un exécutable faisant partie de PATH. 

Quelqu'un a-t-il rencontré ce problème et/ou peut-il suggérer un moyen de faire en sorte que Docker reconnaisse les limites?

15
orcaman

J'ai pu résoudre ce problème avec la configuration suivante:

J'ai utilisé Ubuntu 14.04 Linux pour la machine à sous et la machine hôte.

Sur le Host machine Vous devez:

  • mettez à jour le fichier /etc/security/limits.conf pour inclure: * - nofile 64000 
  • ajoutez à votre /etc/sysctl.conf: fs.file-max = 64000 
  • redémarrez sysctl: Sudo sysctl -p 
10
Eran Chetzroni

Vous pouvez passer la limite en argument lors de l'exécution du conteneur. De cette façon, vous n'avez pas à modifier les limites de Host et à donner trop de pouvoir au conteneur. Voici comment:

docker run --ulimit nofile=5000:5000 <image-tag>
3
mtyurt

Avec docker-compos, vous pouvez configurer ulimits.

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

Vous pouvez ajouter des limites logicielles/matérielles en tant que mappage.

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

Bien que cela ne soit pas idéal, vous pouvez exécuter un conteneur avec une option privilégiée (principalement pour une solution rapide non optimale pour un environnement de développement, déconseillée si la sécurité est un problème). 

docker run --privileged

S'il te plait regarde:

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

1
lvolmar