D'actualisation net.de base.somaxcomm (ou tout sysctl bien) pour les conteneurs docker
Je suis en train de changer net.core.somaxconn
pour conteneur docker pour être en mesure d'avoir plus de file d'attente de demandes pour mon application web.
Sur les OS, en dehors de docker, j'ai d'abord modifier la propriété:
$ cat /proc/sys/net/core/somaxconn
128
$ sudo sysctl -w net.core.somaxconn=1024
net.core.somaxconn = 1024
$ cat /proc/sys/net/core/somaxconn
1024
Mais alors je ne sais pas comment propager que le changement dans le panneau. J'ai essayé:
- Aussi la modification de
/etc/sysctl.conf
(dans l'espoir de docker lire ce fichier sur le conteneur de lancement) - Le redémarrage de conteneurs
sudo docker stop
etsudo docker run
nouveau - Le redémarrage de l'ensemble du panneau de service par
sudo service docker restart
Mais à l'intérieur du contenant, cat /proc/sys/net/core/somaxconn
montre toujours 128
.
Je suis en cours d'exécution docker 1.2 (donc je ne peut pas, par défaut, modifier /proc
attributs à l'intérieur du contenant) et dans Elastic Beanstalk (donc sans --privileged
mode, qui me permettrait de modifier /proc
).
Comment puis-je propage la variable sysctl changements de docker?
OriginalL'auteur Tuukka Mustonen | 2014-10-03
Vous devez vous connecter pour publier un commentaire.
Viens de comprendre comment résoudre ce problème, maintenant Elastic Beanstalk prend en charge l'exécution privilégié des conteneurs et vous avez juste besoin d'ajouter le
"privileged": "true"
à votreDockerrun.aws.json
que l'exemple suivant (veuillez jeter un oeil à lacontainer-1
):Veuillez noter que je dupliqué cette réponse partir d'un autre thread.
OriginalL'auteur
Le "net/core" subsys est enregistré par espace de noms réseau. Et la valeur initiale pour somaxconn est de 128.
Lorsque vous ne sysctl sur le système hôte, il définit les paramètres du noyau pour son espace de noms réseau, qui est celui détenu par init. (en gros, c'est l'espace de noms par défaut). Cela n'affecte pas les autres réseau d'espaces de noms.
Lorsqu'un conteneur Docker est démarré, l'interface réseau virtuelle (montre jusqu'à ce que vethXXX sur l'hôte) du conteneur est attaché à son propre espace de noms, qui a encore la première somaxconn valeur de 128. Donc, techniquement, vous ne pouvez pas propager cette valeur dans le conteneur, depuis le réseau à deux espaces de noms ne la partagent pas.
Il y a, cependant, deux façons que vous pouvez ajuster cette valeur, en plus d'exécuter le conteneur en mode privilégié.
utiliser "--net host" lors de l'exécution du conteneur, de sorte qu'il utilise le réseau de l'hôte de l'interface et donc partager le même espace de noms réseau.
vous pouvez monter le système de fichiers proc en lecture-écriture à l'aide de Docker du volume de support de cartographie. l'astuce consiste à faire correspondre à un volume qui ne sont PAS nommées "/proc", depuis Docker va remount /proc/sys, entre autres, en lecture seule pour les non-privilégiés des conteneurs. Cela nécessite que l'hôte de monter /proc comme rw, ce qui est le cas sur la plupart des systèmes.
Méthode 2 doit travailler sur Elastic Beanstalk par l'intermédiaire de son volume de support de cartographie en Dockerrun.aws.json. Il doit aussi travailler pour les autres paramètres réglables sous /proc c'est par l'espace de noms. Mais c'est vraisemblablement une erreur sur le Panneau de la partie de sorte qu'ils peuvent ajouter une validation supplémentaire sur le volume de la cartographie et cette astuce ne fonctionne pas alors.
/proc
a été faite intentionnellement écriture uniquement en mode privilégié, je suppose que la solution d'avenir est de demander à des ingénieurs AWS pour permettre/permis EB. Comme le sous-jacent EC2 machine est déjà "possédé" par nous, il ne devrait pas être une raison pour interdire le mode privilégié... jusqu'à alors, je vais essayer votre solution de contournement demain et rapport à!Eh bien, comme vous l'avez suggéré, la 2ème solution fonctionne parfaitement sur EB, donc on va s'en tenir à ça pour le moment. Je ne suis pas sûr si je comprends comment modifier
/proc
(par/writable-proc
) à partir de l'intérieur du contenant modifie effectivement le conteneur de l'espace de noms et pas de parent OS interfaces' espace de noms, à partir de laquelle il est monté, mais vous m'avez sauvé d'une douzaine d'heures, donc grand merci. J'ai également ouvert une question sur Beanstalk forum sur l'utilisation privilégiée de mode forums.aws.amazon.com/thread.jspa?threadID=162290Cette astuce est apparemment ne fonctionne plus: serverfault.com/a/664589/60525
#1 fonctionne pour moi (à l'aide d'un menu fixe-isée REDIS).
Pourquoi ce travail? Par la suite, il y a deux proc monte, les readonly à /proc et de l'écriture à /graveurs-proc (ou autre). Pourquoi ne simplement de montage les espaces de noms par défaut' /proc remplacer l'utilisation des valeurs dans les conteneurs /proc/ ?
OriginalL'auteur
docker 1.12 ajouter le support pour la configuration de variables sysctl-sysctl.
docs: https://docs.docker.com/engine/reference/commandline/run/#/configure-namespaced-kernel-parameters-sysctls-at-runtime
OriginalL'auteur
J'ai trouvé une solution:
plus de détails ici: /opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh
Mise à jour:
Ajouter un fichier
.ebextensions/02-commands.config
Command
? C'est gentil! Je vais le tester bientôt(ish) et rapporte comment il a travaillé pour moi.Yep gist.github.com/yurtaev/1e8d639cb03bbb95e71a#file-04run-sh-L78
La question est
04run.sh
ne peut pas faire confiance à exister. Est-il possible de changer le menu fixe dans privilégiée mode.Ne semble plus fonctionner...
Chemin d'accès a été modifié:
sed -i "s/docker run -d/docker run --privileged -d/" /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh
OriginalL'auteur
Mise à jour: Cette réponse est obsolète comme Docker prend désormais en charge la
docker run --sysctl
option!La solution que j'utilise pour mon OpenVPN conteneur est d'entrer dans le récipient de l'espace de noms avec toutes les fonctionnalités à l'aide de
nsenter
, en remontant/proc/sys
lire-écrire temporairement, réglage des trucs et remonter en lecture seule à nouveau.Voici un exemple, l'activation d'IPv6 transfert dans le conteneur:
De cette façon, le conteneur n'a pas besoin de courir privilégié.
Cette solution est la seule sur cette question, qui travaille dans le dernier menu fixe dans un environnement (Amazon ECS) qui n'expose pas le
--sysctl
option dedocker run
.OriginalL'auteur
Dans le panneau 3.1, il ya un soutien pour la spécification des sysctl.
remarque l'
variables sysctl:
- net.de base.somaxconn=1024
Mon exemple docker-composition de fichier
la version de docker-composer vous utilisez?
probablement vous utilisez Essaim? Il ne prend pas en charge sysctl et d'autres options
OriginalL'auteur