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 et sudo 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?

16
demandé sur Tuukka Mustonen 2014-10-03 14:09:41

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.

1
répondu sirboderafael 2017-05-23 11:54:18

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é.

  1. 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.

  2. 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.

26
répondu zliuva 2014-10-04 22:53:35

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

docs: https://docs.docker.com/engine/reference/commandline/run/#/configure-namespaced-kernel-parameters-sysctls-at-runtime

6
répondu eshizhan 2016-09-15 14:48:33

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'
3
répondu Egor Yurtaev 2014-12-10 07:26:47

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é.

3
répondu neingeist 2017-08-01 13:08:56

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"                                   
0
répondu nizam.sp 2017-06-15 05:17:41