Il sottosistema "net/core" è registrato per spazio dei nomi di rete. E il valore iniziale per somaxconn è impostato su 128.
Quando esegui sysctl sul sistema host, imposta i parametri principali per its spazio dei nomi di rete, che è quello di proprietà di init . (in pratica questo è lo spazio dei nomi predefinito). Ciò non influisce sugli altri spazi dei nomi di rete.
Quando viene avviato un contenitore Docker, l'interfaccia di rete virtuale (visualizzata come vethXXX sull'host) di quel contenitore è collegato al proprio spazio dei nomi, che ha ancora il valore iniziale somaxconn di 128. Quindi, tecnicamente, non puoi propagare questo valore nel contenitore, poiché i due spazi dei nomi di rete non lo condividono.
Esistono, tuttavia, due modi per regolare questo valore, oltre all'esecuzione del contenitore in modalità privilegiata.
-
usa "--net host" durante l'esecuzione del contenitore, in modo che utilizzi l'interfaccia di rete dell'host e quindi condivida lo stesso spazio dei nomi di rete.
-
puoi montare il file system proc come lettura-scrittura utilizzando il supporto per la mappatura del volume di Docker. il trucco è mapparlo su un volume NON denominato "/proc", poiché Docker rimonterà /proc/sys, tra gli altri, come di sola lettura per i contenitori non privilegiati. Ciò richiede che l'host monti /proc come rw, come accade nella maggior parte dei sistemi.
docker run -it --rm -v /proc:/writable-proc ubuntu:14.04 /bin/bash [email protected]:/# echo 1024 > /writable-proc/sys/net/core/somaxconn [email protected]:/# sysctl net.core.somaxconn net.core.somaxconn = 1024
Il metodo 2 dovrebbe funzionare su Elastic Beanstalk tramite il supporto per la mappatura dei volumi in Dockerrun.aws.json. Inoltre dovrebbe funzionare per altri parametri sintonizzabili in /proc che è per spazio dei nomi. Ma questa è molto probabilmente una svista da parte di Docker, quindi potrebbero aggiungere ulteriore convalida sulla mappatura del volume e questo trucco non funzionerà.
Aggiornamento:questa risposta è obsoleta poiché Docker ora supporta docker run --sysctl
opzione!
La soluzione che utilizzo per il mio contenitore OpenVPN è inserire lo spazio dei nomi del contenitore con tutte le funzionalità utilizzando nsenter
, rimontando /proc/sys
read-write temporaneamente, impostando cose e rimontandole di nuovo in sola lettura.
Ecco un esempio, abilitando l'inoltro IPv6 nel contenitore:
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'
In questo modo il contenitore non deve essere eseguito con privilegi.
docker 1.12 aggiunge il supporto per l'impostazione di sysctls con --sysctl.
docker run --name some-redis --sysctl=net.core.somaxconn=511 -d redis
documenti:https://docs.docker.com/engine/reference/commandline/run/#/configure-namespaced-kernel-parameters-sysctls-at-runtime
Ho trovato una soluzione:
{
"AWSEBDockerrunVersion": "1",
"Command": "run COMMAND",
"Image": {
"Name": "crystalnix/omaha-server",
"Update": "true"
},
"Ports": [
{
"ContainerPort": "80"
}
]
}
maggiori dettagli qui:/opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh
Aggiornamento:
Aggiungi il file .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'