Ich baue einen Container, um die Kerneleinstellungen für einen Load Balancer zu optimieren. Ich würde es vorziehen, diese Änderungen mit einem einzigen privilegierten Container auf dem Host in einem Image bereitzustellen. Beispielsweise:
docker run --rm --privileged ubuntu:latest sysctl -w net.core.somaxconn=65535
Beim Testen werden die Änderungen wirksam, jedoch nur für diesen Container. Ich hatte den Eindruck, dass mit einem vollständig privilegierten Container Änderungen an / proc tatsächlich das zugrunde liegende Betriebssystem ändern würden.
$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
Sollen privilegierte Container so funktionieren?
Mache ich nur etwas Dummes?
Was ist der beste Weg, um dauerhafte Veränderungen vorzunehmen?
Versions Information:
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
Beispielbefehl mit mount / 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
Antworten:
Diese spezielle Einstellung fällt unter den Einfluss des Netzwerk-Namespace, in dem Docker ausgeführt wird.
In der Regel
/proc
werden systemweit relevante Einstellungen geändert. Technisch gesehen ändern Sie jedoch Einstellungen, bei/proc/net
denen die Ergebnisse auf Netzwerk-Namespace-Basis zurückgegeben werden.Beachten Sie, dass dies
/proc/net
tatsächlich ein Symlink ist,/proc/self/net
da er tatsächlich die Einstellungen des Namespace widerspiegelt, in dem Sie die Arbeit ausführen.quelle
Docker 1.12+ bietet native Unterstützung für die Optimierung von Sysctl-Werten in den Containern. Hier ist ein Auszug aus der Dokumentation :
Anhand Ihres Beispiels wäre der richtige Weg, um zu erhöhen
net.core.somaxconn
:quelle
Der privilegierte Container verwendet weiterhin seinen eigenen Prozessnamespace für
/proc
. Was Sie tun können, ist, den Real/proc
im Container zu montieren :quelle
Dies funktioniert bei mir mit Docker 1.5.0:
quelle