web-dev-qa-db-fra.com

Tuning du noyau avec conteneur de docker privilégié

Je construis un conteneur pour régler les paramètres du noyau pour un équilibreur de charge. Je préférerais déployer ces modifications à l'hôte dans une image à l'aide d'un seul conteneur privilégié. Par exemple:

docker run --rm --privileged ubuntu:latest sysctl -w net.core.somaxconn=65535

En test, les modifications prennent effet mais uniquement pour ce conteneur. J'avais l'impression que, avec un conteneur pleinement privilégié, des modifications apportées à/Proc modifieraient réellement le système d'exploitation sous-jacent.

$docker run --rm --privileged ubuntu:latest \
    sysctl -w net.core.somaxconn=65535
net.core.somaxconn = 65535

$ docker run --rm --privileged ubuntu:latest \
    /bin/bash -c "sysctl -a | grep somaxconn"
net.core.somaxconn = 128

Est-ce la façon dont les conteneurs privilégiés sont censés travailler?

Est-ce que je fais juste quelque chose d'idiot?

Quelle est la meilleure façon de faire des changements durables?

Version info:

Client version: 1.4.1
Client API version: 1.16
Go version (client): go1.3.3
Git commit (client): 5bc2ff8
OS/Arch (client): linux/AMD64
Server version: 1.4.1
Server API version: 1.16
Go version (server): go1.3.3
Git commit (server): 5bc2ff8

Exemple de commande avec monté/proc:

$ docker run -v /proc:/proc ubuntu:latest \
    /bin/bash -c "sysctl -a | grep local_port"
net.ipv4.ip_local_port_range = 32768    61000

$ docker run -v /proc:/proc --privileged ubuntu:latest \
    /bin/bash -c "sysctl -p /updates/sysctl.conf"
net.ipv4.ip_local_port_range = 2000 65000

$ docker run -v /proc:/proc ubuntu:latest \
    /bin/bash -c "sysctl -a | grep local_port"
net.ipv4.ip_local_port_range = 32768    61000

$ docker run -v /proc:/proc --privileged ubuntu:latest \
    /bin/bash -c "sysctl -a | grep local_port"
net.ipv4.ip_local_port_range = 32768    61000
10
allingeek

Ce paramètre particulier tombe sous l'influence de l'espace de noms de réseau que Docker se déroule.

En règle générale /proc Attributez les paramètres qui sont pertinents SystemWide, techniquement parlant, mais vous modifiez les paramètres dans /proc/net qui renvoie des résultats sur une base d'espace de noms de réseau.

Noter que /proc/net est en fait un lien symbolique à /proc/self/net Comme cela reflète vraiment les réglages de l'espace de noms que vous effectuez le travail.

8
Matthew Ife

Docker 1.12+ a une prise en charge native pour modifier les valeurs SYSCTL à l'intérieur des conteneurs. Voici un extrait de la Documentation :

Configurez les paramètres de noyau de dépannage (SYSCTLS) au moment de l'exécution

Le --SYSCTL définit les paramètres de noyau réparé des noms (SYSCTLS) dans le conteneur. Par exemple, pour activer le transfert IP dans l'espace de noms de réseau de conteneurs, exécutez cette commande:

docker run --sysctl net.ipv4.ip_forward=1 someimage

En utilisant votre exemple, la bonne façon d'élever net.core.somaxconn serait:

docker run ... --sysctl net.core.somaxconn=65535 ...
7
hyperknot

Le conteneur privilégié utilise toujours son propre espace de noms de processus pour /proc. Ce que vous pouvez faire est de monter le vrai /proc À l'intérieur du conteneur:

docker run --rm --privileged -v /proc:/Host-proc ubuntu:latest \
  'echo 65535 > /Host-proc/sys/net/core/somaxconn'
3
Ángel

Cela fonctionne pour moi avec Docker 1.5.0:

docker run --privileged --net=Host --rm ubuntu:latest /bin/sh -c \
   'echo 65535 > /proc/sys/net/core/somaxconn'   
2