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