Rafraîchir net.core.somaxcomm (ou toute propriété sysctl) pour les conteneurs docker
j'essaie de changer net.core.somaxconn
pour Docker conteneur pour être en mesure d'avoir une plus grande queue de demandes pour mon application web.
sur OS, outside docker, je modifie d'abord la propriété avec succès:
$ 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 je ne sais pas comment propager ce changement en docker. J'ai essayé:
- aussi éditant
/etc/sysctl.conf
(dans l'espoir d'un docker lisant ce fichier sur le lancement du conteneur) - redémarrage des conteneurs
sudo docker stop
etsudo docker run
à nouveau - redémarrage de l'ensemble du service docker par
sudo service docker restart
mais à l'intérieur du conteneur, cat /proc/sys/net/core/somaxconn
indique toujours 128
.
j'exécute docker 1.2 (donc je ne peux pas, par défaut, Modifier les attributs /proc
à l'intérieur du conteneur) et en Digue élastique (donc sans le mode --privileged
, qui me permettrait de modifier /proc
).
comment propager les modifications sysctl à docker?
6 réponses
vient juste de trouver une solution, maintenant supports en haricot élastique tournant un conteneurs privilégiés et vous avez juste besoin d'ajouter le "privileged": "true"
à votre Dockerrun.aws.json
comme l'échantillon suivant (s'il vous plaît jeter un oeil au container-1
):
{
"AWSEBDockerrunVersion": 2,
"containerDefinitions": [{
"name": "container-0",
"essential": "false",
"image": "ubuntu",
"memory": "512"
}, {
"name": "container-1",
"essential": "false",
"image": "ubuntu",
"memory": "512",
"privileged": "true"
}]
}
prendre note que je dupliqué cette réponse à partir d'un autre thread.
le sous-système "net/core" est enregistré par espace de nom de réseau . Et la valeur initiale pour somaxconn est de 128.
quand vous faites sysctl sur le système hôte, il définit les paramètres de base pour son espace de nom de 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 namespaces du réseau.
Lorsqu'un conteneur Docker est commencé , l'interface réseau virtuelle (apparaît comme vethXXX sur l'hôte) de ce conteneur est attaché à son propre espace de nom , qui a encore la valeur somaxconn initiale de 128. Ainsi, techniquement, vous ne pouvez pas propogate cette valeur dans le conteneur, puisque les deux espaces de noms de réseau ne le partagent pas.
Il y a, cependant, deux façons que vous pouvez ajuster cette valeur, en plus d'exécuter le récipient dans mode privilégié.
-
utiliser "--Net host " lors de l'exécution du conteneur, il utilise donc l'interface réseau de l'hôte et partage donc le même espace de noms réseau.
-
vous pouvez monter le système de fichiers proc en lecture-écriture en utilisant le support de cartographie de volume de Docker. le truc est de le faire correspondre à un volume non nommé "/proc", puisque Docker va remount / proc / sys, entre autres, en lecture seule pour les non-privilégiés conteneurs . Cela nécessite que l'hôte Monte / proc en tant que rw, ce qui est le cas sur la plupart des systèmes.
docker run -it --rm -v /proc:/writable-proc ubuntu:14.04 /bin/bash root@edbee3de0761:/# echo 1024 > /writable-proc/sys/net/core/somaxconn root@edbee3de0761:/# sysctl net.core.somaxconn net.core.somaxconn = 1024
la méthode 2 devrait travailler sur les tiges de haricot élastiques par l'intermédiaire de son support de cartographie de volume dans Dockerrun.aws.json . En outre, il devrait fonctionner pour d'autres paramètres réglables sous /proc qui est par espace de nom. Mais il s'agit très probablement d'une erreur de la part de Docker afin qu'ils puissent ajouter une validation supplémentaire sur la cartographie de volume et ceci astuce ne fonctionne pas alors.
docker 1.12 ajouter la prise en charge de la configuration de sysctl avec --sysctl.
docker run --name some-redis --sysctl=net.core.somaxconn=511 -d redis
j'ai trouvé une solution:
{
"AWSEBDockerrunVersion": "1",
"Command": "run COMMAND",
"Image": {
"Name": "crystalnix/omaha-server",
"Update": "true"
},
"Ports": [
{
"ContainerPort": "80"
}
]
}
plus de détails ici: /opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh
mise à jour:
Ajouter un fichier .ebextensions/02-commands.config
container_commands:
00001-docker-privileged:
command: 'sed -i "s/docker run -d/docker run --privileged -d/" /opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh'
mise à jour: cette réponse est obsolète car Docker supporte maintenant l'option docker run --sysctl
!
la solution que j'utilise pour mon conteneur OpenVPN est d'entrer dans l'Espace-nom du conteneur avec toutes les capacités en utilisant nsenter
, en faisant un remounting /proc/sys
lire-écrire temporairement, la mise en place des trucs et le remounting en lecture seule à nouveau.
voici un exemple, permettant IPv6 forwarding dans le conteneur:
CONTAINER_NAME=openvpn
# enable ipv6 forwarding via nsenter
container_pid=`docker inspect -f '{{.State.Pid}}' $CONTAINER_NAME`
nsenter --target $container_pid --mount --uts --ipc --net --pid \
/bin/sh -c '/usr/bin/mount /proc/sys -o remount,rw;
/usr/sbin/sysctl -q net.ipv6.conf.all.forwarding=1;
/usr/bin/mount /proc/sys -o remount,ro;
/usr/bin/mount /proc -o remount,rw # restore rw on /proc'
de Cette façon, le conteneur n'a pas besoin d'exécuter privilégié.
dans le docker 3.1 il y a un support pour spécifier sysctl.
notez le
variables sysctl:
- net.core.somaxconn=1024
mon exemple docker-fichier de composition
version: '3.1'
services:
my_redis_master:
image: redis
restart: always
command: redis-server /etc/redis/redis.conf
volumes:
- /data/my_dir/redis:/data
- /data/my_dir/logs/redis:/var/tmp/
- ./redis/redis-master.conf:/etc/redis/redis.conf
sysctls:
- net.core.somaxconn=1024
ports:
- "18379:6379"